2013-05-06 1 views
2

У меня есть приложение, вложение 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; 
    } 

} 
+0

Я удостоверился, что моя среда разработки использует ту же самую 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

+0

Недостаточно информации для прохождения. Вы не указали *, как вы начинаете причал. Можете ли вы включить какой-то код о том, как вы начинаете причал?например, что вы делаете с экземпляром «Server»? вы 'server.start()' then 'server.join()' или вы управляете потоком сервера по-другому в своем проекте? –

+0

Я переключился на Jetty 8 (для этого потребовался другой класс для Connector и никаких других изменений, кроме обмена библиотекой), и все работает. Я до сих пор не знаю, какая отличная комбинация штормов заставила его сломаться с Jetty 9, который работал на нескольких других платформах, как я уже упоминал. Но резервное копирование на Jetty 8 заставляет его работать на моей платформе развертывания, так что это направление, в которое я пошел. Я бы закрыл/удалил этот вопрос, если бы знал, как это сделать. Спасибо за комментарий, хотя, я действительно ценю, что кто-то проявляет некоторый интерес к помощи. – tdimmig

ответ

1

Ах, разъемы изменились с Jetty 9.

Начиная с Jetty 9, разъемы застроены цепями ConnectionFactory, которая обеспечивает определение типа соединения и резервные объявления.

Это было сделано для поддержки современной реальности альтернативных типов подключения к сети (таких как расширения TLS, NPN, SPDY, WebSocket и даже подготовка к HTTP/2.0).

Вот некоторые встроенные примеры:

Настройка стандартный разъем HTTP в Jetty 9

package org.eclipse.jetty.embedded; 

import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.server.ServerConnector; 

public class OneConnector 
{ 
    public static void main(String[] args) throws Exception 
    { 
     // The Server 
     Server server = new Server(); 

     // HTTP connector 
     ServerConnector http = new ServerConnector(server); 
     http.setHost("localhost"); 
     http.setPort(8080); 
     http.setIdleTimeout(30000); 

     // Set the connector 
     server.addConnector(http); 

     // Set a handler 
     server.setHandler(new HelloHandler()); 

     // Start the server 
     server.start(); 
     server.join(); 
    } 
} 

Настройка цепи соединителя для SSL + NPN + SPDY/3 + SPDY/2 + HTTPS в Jetty 9

package org.eclipse.jetty.embedded; 

import org.eclipse.jetty.server.HttpConfiguration; 
import org.eclipse.jetty.server.HttpConnectionFactory; 
import org.eclipse.jetty.server.SecureRequestCustomizer; 
import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.server.ServerConnector; 
import org.eclipse.jetty.server.SslConnectionFactory; 
import org.eclipse.jetty.spdy.server.NPNServerConnectionFactory; 
import org.eclipse.jetty.spdy.server.SPDYServerConnectionFactory; 
import org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnectionFactory; 
import org.eclipse.jetty.spdy.server.http.ReferrerPushStrategy; 
import org.eclipse.jetty.util.ssl.SslContextFactory; 

public class SpdyConnector 
{ 
    public static void main(String[] args) throws Exception 
    { 
     String jetty_home = System.getProperty("jetty.home","../../jetty-distribution/target/distribution"); 
     System.setProperty("jetty.home", jetty_home); 

     // The Server 
     Server server = new Server(); 

     // HTTP Configuration 
     HttpConfiguration http_config = new HttpConfiguration(); 
     http_config.setSecureScheme("https"); 
     http_config.setSecurePort(8443); 

     // HTTP connector 
     ServerConnector http = new ServerConnector(server,new HttpConnectionFactory(http_config));   
     http.setPort(8080); 
     server.addConnector(http); 

     // SSL Context Factory for HTTPS and SPDY 
     SslContextFactory sslContextFactory = new SslContextFactory(); 
     sslContextFactory.setKeyStorePath(jetty_home + "/etc/keystore"); 
     sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); 
     sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); 

     // HTTPS Configuration 
     HttpConfiguration https_config = new HttpConfiguration(http_config); 
     https_config.addCustomizer(new SecureRequestCustomizer()); 

     // SPDY versions 
     HTTPSPDYServerConnectionFactory spdy2 = 
      new HTTPSPDYServerConnectionFactory(2,https_config); 

     HTTPSPDYServerConnectionFactory spdy3 = 
      new HTTPSPDYServerConnectionFactory(3,https_config,new ReferrerPushStrategy()); 

     // NPN Factory 
     SPDYServerConnectionFactory.checkNPNAvailable(); 
     NPNServerConnectionFactory npn = 
      new NPNServerConnectionFactory(spdy3.getProtocol(),spdy2.getProtocol(),http.getDefaultProtocol()); 
     npn.setDefaultProtocol(http.getDefaultProtocol()); 

     // SSL Factory 
     SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory,npn.getProtocol()); 

     // SPDY Connector 
     ServerConnector spdyConnector = 
      new ServerConnector(server,ssl,npn,spdy3,spdy2,new HttpConnectionFactory(https_config)); 
     spdyConnector.setPort(8443); 
     server.addConnector(spdyConnector); 

     // Set a handler 
     server.setHandler(new HelloHandler()); 

     // Start the server 
     server.start(); 
     server.join(); 
    } 
} 
+0

Я обновил свой вопрос с помощью образцов кода и XML, показывающих, как я запускаю свой сервер Jetty. Я упомянул разницу Connector, чтобы показать, что это единственная часть этой конфигурации, которую я должен был изменить при переключении обратно на Jetty 8 с 9. Сервер работал, как ожидалось, с версией 9 в моей среде разработки и на CentOS 6. Он не работал на сервере CentOS 5. Переход на Jetty 8 позволяет работать везде. Я не знаю, какой совершенный шторм программного обеспечения приводит к сбою версии моего проекта Jetty 9, но у меня нет времени, чтобы понять это. – tdimmig

+0

Я ценю ваши усилия в попытке помочь, но я не верю, что это была просто проблема с конфигурацией, учитывая, что она работала на 2 из трех платформ, на которых я пробовал. – tdimmig