Как я могу использовать 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). Может ли кто-нибудь дать некоторые рекомендации?