1

如何在 Openshift Java Web 应用程序中使用 BaseX?

我已经在 Openshift 中设置了一个应用程序。此应用程序有一个 Tomcat 7 (JBoss EWS 2.0) 插件。我通过使用 SFTP 客户端发送 WAR 来将 Web 应用程序部署到它。我想启动一个 BaseX 服务器,以便此应用程序中的 servlet 可以将其用作客户端。

我试图通过调用以下指令来启动服务器:

        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

根据 Andy Bunce 的建议,我在 OpenShift 上创建了一个“Do It Yourself 0.1”设备,并设法在其上安装了 BaseX。BaseX 服务器现在以这种方式运行。现在,我不确定如何从托管在另一个设备(Tomcat 7 应用程序)中的 BaseXClient 连接到 BaseX 服务器。有人可以提供一些指导吗?

4

2 回答 2

2

BaseX 还绑定到另一个套接字,用于事件处理。您可以使用参数将此端口设置为 OpenShift 允许的某个端口-e,即

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

这个存储库https://github.com/Quodatum/openshift-basex-quick-start有另一种在 OpenShift 上运行 BaseX 的方法。它使用basexhttp而不是WAR。

于 2014-05-12T09:11:34.263 回答