У меня есть приложение, вложение Jetty в качестве веб-сервера для размещения API RESTful. Я разрабатываю его в Eclipse на Ubuntu, и когда он запускается из IDE, все работает отлично. Однако, когда я упаковываю приложение и развертываю его на сервере, Jetty больше не отвечает на запросы.Встраиваемые запросы на обработку запросов, выполняемые с затмения, но не развернутые
Сервер открывает сокет в указанном порту, а включение журнала INFO для функции spring-mvc показывает мой контроллер и его методы сопоставлены соответствующим образом. Запросы успешно открывают соединение, но затем данные не отправляются обратно, и на самом деле запрос никогда не попадает в мой код контроллера. Когда я закрываю приложение, я вижу, что все связанные соединения были убиты.
Я проверил, что все библиотеки классаpath для проекта Eclipse находятся в пути к классам при развертывании. Что еще я должен проверить, чтобы выяснить, почему он работает в Eclipse и что в другом месте?
Jetty - версия 9, версия Java 1.7, весна 3.2.2.
EDIT отладки протоколирования от Jetty, когда я делаю запрос:
2013-05-06 09:40:30,214 DEBUG [email protected]{HTTP/1.1}{0.0.0.0:8090} [SelectorManager.java submit]-: <Queued change [email protected]f589>
2013-05-06 09:40:30,215 DEBUG qtp1215430550-29-selector-2 [SelectorManager.java runChange]-: <Running change [email protected]f589>
2013-05-06 09:40:30,217 DEBUG qtp1215430550-29-selector-2 [AbstractEndPoint.java onOpen]-: <onOpen [email protected]{/127.0.0.1:39895<r-l>/127.0.0.1:8090,o=true,is=false,os=false,[email protected]{false,null},[email protected]{IDLE},it=30000}{null}{io=0,kio=0,kro=0}>
2013-05-06 09:40:30,220 DEBUG qtp1215430550-29-selector-2 [IdleTimeout.java checkIdleTimeout]-: <[email protected]{/127.0.0.1:39895<r-l>/127.0.0.1:8090,o=true,is=false,os=false,[email protected]{false,null},[email protected]{IDLE},it=30000}{null}{io=0,kio=0,kro=0} idle timeout check, elapsed: 3 ms, remaining: 29997 ms>
2013-05-06 09:40:30,221 DEBUG qtp1215430550-29-selector-2 [HttpConnection.java <init>]-: <New HTTP Connection [email protected]{IDLE},g=HttpGenerator{s=START},p=HttpParser{s=START,0 of 0}>
2013-05-06 09:40:30,224 DEBUG qtp1215430550-29-selector-2 [AbstractConnection.java onOpen]-: <onOpen [email protected]{IDLE},g=HttpGenerator{s=START},p=HttpParser{s=START,0 of 0}>
2013-05-06 09:40:30,227 DEBUG qtp1215430550-29-selector-2 [AbstractConnection.java fillInterested]-: <fillInterested [email protected]{IDLE},g=HttpGenerator{s=START},p=HttpParser{s=START,0 of 0}>
2013-05-06 09:40:30,229 DEBUG qtp1215430550-29-selector-2 [SelectChannelEndPoint.java updateLocalInterests]-: <Local interests updated 0 -> 1 for [email protected]{/127.0.0.1:39895<r-l>/127.0.0.1:8090,o=true,is=false,os=false,[email protected]{true,[email protected]},[email protected]{IDLE},it=30000}{[email protected]{INTERESTED},g=HttpGenerator{s=START},p=HttpParser{s=START,0 of 0}}{io=1,kio=0,kro=0}>
2013-05-06 09:40:30,232 DEBUG qtp1215430550-29-selector-2 [SelectorManager.java createEndPoint]-: <Created [email protected]{/127.0.0.1:39895<r-l>/127.0.0.1:8090,o=true,is=false,os=false,[email protected]{true,[email protected]},[email protected]{IDLE},it=30000}{[email protected]{INTERESTED},g=HttpGenerator{s=START},p=HttpParser{s=START,0 of 0}}{io=1,kio=0,kro=0}>
2013-05-06 09:40:30,233 DEBUG qtp1215430550-29-selector-2 [SelectorManager.java runChange]-: <Running change [email protected]>
2013-05-06 09:40:30,233 DEBUG qtp1215430550-29-selector-2 [SelectChannelEndPoint.java setKeyInterests]-: <Key interests updated 0 -> 1>
2013-05-06 09:40:30,234 DEBUG qtp1215430550-29-selector-2 [SelectorManager.java select]-: <Selector loop waiting on select>
2013-05-06 09:40:30,234 DEBUG qtp1215430550-29-selector-2 [SelectorManager.java select]-: <Selector loop woken up from select, 1/1 selected>
2013-05-06 09:40:30,234 DEBUG qtp1215430550-29-selector-2 [SelectChannelEndPoint.java setKeyInterests]-: <Key interests updated 1 -> 0>
2013-05-06 09:40:30,238 DEBUG qtp1215430550-29-selector-2 [SelectChannelEndPoint.java updateLocalInterests]-: <Local interests updated 1 -> 0 for [email protected]{/127.0.0.1:39895<r-l>/127.0.0.1:8090,o=true,is=false,os=false,[email protected]{true,[email protected]},[email protected]{IDLE},it=30000}{[email protected]{INTERESTED},g=HttpGenerator{s=START},p=HttpParser{s=START,0 of 0}}{io=0,kio=0,kro=1}>
2013-05-06 09:40:30,238 DEBUG qtp1215430550-29-selector-2 [SelectorManager.java runChange]-: <Running change [email protected]>
2013-05-06 09:40:30,239 DEBUG qtp1215430550-29-selector-2 [QueuedThreadPool.java dispatch]-: <qtp1215430550{STARTED,2<=10<=10,i=0,q=4} dispatched [email protected]>
2013-05-06 09:40:30,240 DEBUG qtp1215430550-29-selector-2 [SelectorManager.java select]-: <Selector loop waiting on select>
2013-05-06 09:40:35,88 DEBUG Scheduler-702565976 [IdleTimeout.java checkIdleTimeout]-: <[email protected]{/127.0.0.1:39894<r-l>/127.0.0.1:8090,o=true,is=false,os=false,[email protected]{false,null},[email protected]{IDLE},it=30000}{[email protected]{INTERESTED},g=HttpGenerator{s=START},p=HttpParser{s=START,0 of 0}}{io=0,kio=0,kro=1} idle timeout check, elapsed: 29996 ms, remaining: 4 ms>
2013-05-06 09:40:35,96 DEBUG Scheduler-702565976 [IdleTimeout.java checkIdleTimeout]-: <[email protected]{/127.0.0.1:39894<r-l>/127.0.0.1:8090,o=true,is=false,os=false,[email protected]{false,null},[email protected]{IDLE},it=30000}{[email protected]{INTERESTED},g=HttpGenerator{s=START},p=HttpParser{s=START,0 of 0}}{io=0,kio=0,kro=1} idle timeout check, elapsed: 30005 ms, remaining: -5 ms>
2013-05-06 09:40:35,99 DEBUG Scheduler-702565976 [IdleTimeout.java checkIdleTimeout]-: <[email protected]{/127.0.0.1:39894<r-l>/127.0.0.1:8090,o=true,is=false,os=false,[email protected]{false,null},[email protected]{IDLE},it=30000}{[email protected]{INTERESTED},g=HttpGenerator{s=START},p=HttpParser{s=START,0 of 0}}{io=0,kio=0,kro=1} idle timeout expired>
EDIT 2 Мой Jetty сервер настроен все весной бобы:
<bean id="JettyServer" class="org.eclipse.jetty.server.Server" init-method="start" destroy-method="stop">
<property name="connectors">
<list>
<bean id="Connector" class="org.eclipse.jetty.server.nio.SelectChannelConnector">
<property name="port" value="8090"/>
</bean>
</list>
</property>
<property name="handler">
<bean id="handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
<property name="handlers">
<list>
<bean id="servletContextHandler" class="org.eclipse.jetty.servlet.ServletContextHandler">
<property name="contextPath" value="/"/>
<property name="servletHandler">
<bean class="org.eclipse.jetty.servlet.ServletHandler">
<property name="servlets">
<list>
<bean class="org.eclipse.jetty.servlet.ServletHolder">
<property name="name" value="DefaultServlet"/>
<property name="servlet">
<bean class="com.company.project.api.DispatcherServletWrapper"/>
</property>
</bean>
</list>
</property>
<property name="servletMappings">
<list>
<bean class="org.eclipse.jetty.servlet.ServletMapping">
<property name="pathSpecs">
<list><value>/</value></list>
</property>
<property name="servletName" value="DefaultServlet"/>
</bean>
</list>
</property>
</bean>
</property>
</bean>
<bean class="org.eclipse.jetty.server.handler.RequestLogHandler">
<property name="requestLog">
<bean class="org.eclipse.jetty.server.NCSARequestLog">
<constructor-arg value="/opt/company/logs/jetty-yyyy_mm_dd.log"/>
<property name="extended" value="false" />
</bean>
</property>
</bean>
</list>
</property>
</bean>
</property>
</bean>
Я нуждался в диспетчерскую сервлет чтобы знать ApplicationContext, определяющий этот сервер Jetty, поэтому для справки мой класс DispatcherServletWrapper выглядит следующим образом:
package com.company.project.api;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.GenericWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
public class DispatcherServletWrapper extends DispatcherServlet implements ApplicationContextAware {
private static final long serialVersionUID = -2281511575328213502L;
private ApplicationContext appContext;
@Override
public void setApplicationContext(ApplicationContext arg0)
throws BeansException {
this.appContext = arg0;
}
protected WebApplicationContext createWebApplicationContext(WebApplicationContext arg0) {
GenericWebApplicationContext wac = new GenericWebApplicationContext();
wac.setParent(appContext);
wac.refresh();
return wac;
}
}
Я удостоверился, что моя среда разработки использует ту же самую JRE, что и производственный сервер, и что путь класса IDE соответствует exa ctly classpath при запуске на сервере. Сервер запускает CentOS 5.9. Я обнаружил, что сервер Jetty работает так, как ожидалось, обрабатывает мои запросы и возвращает, как ожидалось, на сервере CentOS 6.4. Когда JRE и путь к классам равны, мое приложение запускается не более, чем «java - cp $ (переменная класса) com.company.project.Main «что еще отличает, что заставляет его работать в моей среде Ubuntu dev и на сервере 6.4, но не на 5.9? – tdimmig
Недостаточно информации для прохождения. Вы не указали *, как вы начинаете причал. Можете ли вы включить какой-то код о том, как вы начинаете причал?например, что вы делаете с экземпляром «Server»? вы 'server.start()' then 'server.join()' или вы управляете потоком сервера по-другому в своем проекте? –
Я переключился на Jetty 8 (для этого потребовался другой класс для Connector и никаких других изменений, кроме обмена библиотекой), и все работает. Я до сих пор не знаю, какая отличная комбинация штормов заставила его сломаться с Jetty 9, который работал на нескольких других платформах, как я уже упоминал. Но резервное копирование на Jetty 8 заставляет его работать на моей платформе развертывания, так что это направление, в которое я пошел. Я бы закрыл/удалил этот вопрос, если бы знал, как это сделать. Спасибо за комментарий, хотя, я действительно ценю, что кто-то проявляет некоторый интерес к помощи. – tdimmig