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

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

Я настроил приложение в 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)

Обновлять

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

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


person favq    schedule 05.03.2014    source источник


Ответы (2)


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

person Andy Bunce    schedule 12.05.2014
comment
Спасибо за предложение; Я испытаю это, когда у меня будет время. - person favq; 12.05.2014
comment
Еще раз спасибо. Я создал приложение Do It Yourself 0.1 на OpenShift и смог установить на него BaseX с помощью этого быстрого старта. Сервер BaseX теперь работает в этом приложении. Теперь я не уверен, как подключиться к серверу BaseX из BaseXClient, размещенного в другом приложении (приложении Tomcat 7). Не могли бы вы дать некоторые рекомендации? Заранее спасибо. - person favq; 14.06.2014
comment
Я не пробовал сервер-сервер, но переадресация портов может быть опцией, см. quodatum.wordpress.com/2014/06/15/ и этот openshift.com/forums/openshift/ - person Andy Bunce; 16.06.2014
comment
Я использую HTTP-сервер BaseX с RESTXQ (который уже доступен при установке BaseX) на основе вашего краткого руководства, и он работает очень хорошо. Еще раз спасибо. - person favq; 22.06.2014

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

server = new BaseXServer("-p15000", "-e15001");
person dirkk    schedule 05.03.2014
comment
+1 Это сработало для подключения. Но у Openshift тоже другой внутренний IP, поэтому мне тоже пришлось сообщить локальный IP, к которому должен привязываться сервер. Локальный IP-адрес, разрешенный Openshift, находится в переменной среды OPENSHIFT_{cartridge_name}_IP. Так как мой картридж Tomcat (JBoss EWS), то команда для запуска стала server = new BaseXServer("-p15000", "-e15001", "-n" + System.getenv("OPENSHIFT_JBOSSEWS_IP")); . Но все еще есть ошибка, которую я не знаю, как исправить: когда я вызываю server.stop(), выдается исключение с текстом Отказ в подключении, и сервер продолжает работать. - person favq; 05.03.2014
comment
@anonymous Проблема stop() кажется мне ошибкой. Возможно, вы захотите сообщить об этом в список рассылки BaseX. На данный момент вы также можете kill серверный процесс, но, конечно, было бы лучше корректное завершение работы. - person dirkk; 05.03.2014