Использование BaseX в веб-приложении Openshift

Как я могу использовать BaseX в Java-приложении Openshift?

Я установил приложение в Openshift. Это приложение имеет картридж Tomcat 7 (JBoss EWS 2.0). Я внедряю в него веб-приложения, отправляя WAR-файл с SFTP-клиентом. Я хотел бы запустить сервер 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 (файл JAR BaseX) находится в каталоге WEB-INF/lib. Кроме того, я поместил туда пустой файл с именем ".basex", чтобы не дать BaseX создать файл конфигурации ".basex" в его расположении по умолчанию. В Openshift переменная среды "OPENSHIFT_DATA_DIR" является каталогом данных, и я установил свойство "org.basex.path" для этого каталога данных, чтобы BaseX сохранял там файлы базы данных. Кроме того, я запускаю BaseX через порт 15000, который в 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)

Обновить

Используя предложение Диркка, я смог запустить сервер. Но у Openshift также есть другой внутренний IP-адрес, поэтому мне также пришлось сообщить локальный IP-адрес, с которым должен связываться сервер. Локальный IP-адрес, разрешенный Openshift, находится в переменной среды OPENSHIFT_{картридж_имя} _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

Используя предложение Энди Банса, я создал механизм "Сделай сам 0.1" в OpenShift и смог установить BaseX на него. Сервер BaseX теперь работает на этой передаче. Теперь я не уверен, как подключиться к серверу BaseX с BaseXClient, размещенного на другом устройстве (приложение Tomcat 7). Может ли кто-нибудь дать какое-нибудь руководство?

2 ответа

Решение

Этот репозиторий https://github.com/Quodatum/openshift-basex-quick-start имеет альтернативный способ запуска BaseX в OpenShift. Оно использует basexhttp а не ВОЙНА.

BaseX также связывается с другим сокетом, используемым для обработки событий. Вы можете установить этот порт на некоторый порт, разрешенный OpenShift, используя -e аргумент, т.е.

server = new BaseXServer("-p15000", "-e15001");
Другие вопросы по тегам