Использование 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");