1

Openshift Java Web アプリケーションで BaseX を使用するにはどうすればよいですか?

Openshift でアプリケーションをセットアップしました。このアプリケーションには、Tomcat 7 (JBoss EWS 2.0) カートリッジが含まれています。SFTP クライアントを使用して WAR を送信することにより、Web アプリケーションをデプロイします。このアプリケーションのサーブレットがクライアントとして使用できるように、BaseX サーバーを起動したいと考えています。

次の命令を呼び出して、サーバーを起動しようとしました。

        String folder = System.getenv("OPENSHIFT_DATA_DIR");
        if (folder == null) folder = System.getProperty("user.home");
        System.setProperty("org.basex.path", folder);
        server = new BaseXServer("-p15000");

追加情報として、basex.jar ファイル (BaseX の JAR ファイル) は WEB-INF/lib ディレクトリにあります。また、BaseX がデフォルトの場所に「.basex」構成ファイルを作成しないように、「.basex」という名前の空のファイルをそこに置きました。Openshift では、環境変数「OPENSHIFT_DATA_DIR」はデータ ディレクトリであり、「org.basex.path」プロパティをこのデータ ディレクトリに設定して、BaseX がそこにデータベース ファイルを格納するようにします。さらに、ポート 15000 で BaseX を開始します。これは、Openshift でバインディングに使用できます ( https://www.openshift.com/kb/kb-e1038-i-cant-bind-to-a-portを参照)。

上記のコードは私の開発環境では機能しますが、Openshift では機能しません。エラーは次のとおりです。

java.net.BindException: Permission denied
    java.net.PlainSocketImpl.socketBind(Native Method)
    java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:376)
    java.net.ServerSocket.bind(ServerSocket.java:376)
    java.net.ServerSocket.bind(ServerSocket.java:330)
    org.basex.BaseXServer.<init>(BaseXServer.java:106)
    org.basex.BaseXServer.<init>(BaseXServer.java:65)
    x.NewServlet.processRequest(NewServlet.java:44)
    x.NewServlet.doGet(NewServlet.java:116)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

アップデート

dirkk の提案を使用して、サーバーを起動することができました。しかし、Openshift には別の内部 IP もあるため、サーバーがバインドするローカル IP も通知する必要がありました。Openshift によって許可されるローカル IP は、環境変数OPENSHIFT_{cartridge_name}_IPにあります。私のカートリッジは Tomcat (JBoss EWS) であるため、この環境変数は OPENSHIFT_JBOSSEWS_IP です。したがって、開始するためのコマンドは次のようになりました。

server = new BaseXServer("-p15000", "-e15001", "-n" + System.getenv("OPENSHIFT_JBOSSEWS_IP"));

しかし、修正方法がわからないエラーがまだあります。server.stop() を呼び出すと、「接続が拒否されました」というテキストの例外がスローされ、サーバーは実行されたままになります。

Mar 05, 2014 8:19:33 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [NewServlet] in context with path [/basextest] threw exception
java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at java.net.Socket.connect(Socket.java:528)
    at java.net.Socket.<init>(Socket.java:425)
    at java.net.Socket.<init>(Socket.java:208)
    at org.basex.BaseXServer.stop(BaseXServer.java:333)
    at org.basex.BaseXServer.<init>(BaseXServer.java:93)
    at org.basex.BaseXServer.<init>(BaseXServer.java:65)
    at x.NewServlet.processRequest(NewServlet.java:112)
    at x.NewServlet.doGet(NewServlet.java:128)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1008)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

つまり、サーバーを起動することはできますが、停止することはできません

更新 2

Using Andy Bunce's suggestion, I have created a "Do It Yourself 0.1" gear on OpenShift and managed to install BaseX on it. The BaseX server is now running in this gear. Now, I'm not sure how to connect to the BaseX server from a BaseXClient hosted in another gear (a Tomcat 7 application). Could someone provide some guidance?

4

2 に答える 2

2

BaseX は、イベント処理に使用される別のソケットにもバインドします。-e引数を使用して、このポートを OpenShift で許可されているポートに設定できます。

server = new BaseXServer("-p15000", "-e15001");
于 2014-03-05T09:10:05.183 に答える
1

このリポジトリhttps://github.com/Quodatum/openshift-basex-quick-startには、OpenShift で BaseX を実行する別の方法があります。WARではbasexhttpなく使用します。

于 2014-05-12T09:11:34.263 に答える