2012-02-22 4 views
4

Я пытаюсь настроить встроенный Jetty (7.6) для одновременного управления классами WebSocketHandler, ServletContextHandler и ResourceHandler.Встроенная конфигурация Jetty 7 для websockets, сервлетов И обработчиков ресурсов

Я пробовал использовать классы HandlerCollection и HandlerList, но я не могу заставить все 3 части работать.

Server server = new Server(8081); 

    // static files handler 
    ResourceHandler resourceHandler = new ResourceHandler(); 
    resourceHandler.setDirectoriesListed(true); 
    resourceHandler.setResourceBase("./src/main/webapp/"); 

    // servlet handler 
    ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); 
    servletContextHandler.setContextPath("/"); 
    servletContextHandler.addServlet(new ServletHolder(new myServlet()), "/myServlet"); 

    // websocket handler 
    myWebSocketHandler myWebSocketHandler = new myWebSocketHandler(); 

    // putting it together 
    HandlerCollection handlerList = new HandlerCollection(); 
    handlerList.setHandlers(new Handler[]{resourceHandler,myWebSocketHandler,servletContextHandler}); 
    server.setHandler(handlerList); 

В этом состоянии, статические файлы и сервлет обрабатываются в порядке, но когда я отправить запрос WebSocket, я получаю:

2012-02-22 10:16:44.703:WARN:oejs.Response:Committed before 503 null 
2012-02-22 10:16:44.705:WARN:oejs.AbstractHttpConnection:/ 
java.lang.IllegalStateException: Committed 
    at org.eclipse.jetty.server.Response.resetBuffer(Response.java:1080) 
... 

и если я проверить состояние базовых запросов " обработал "свойство внутри моего обработчика websockets, он уже установлен в true. Таким образом, это означает, что мой запрос обрабатывается и совершается до того, как он попадет в myWebSocketHandler?

Любые комментарии оцениваются, спасибо.

ответ

6

Вы пробовали просто переключить порядок обработчиков?

handlerList.setHandlers(new Handler[]{myWebSocketHandler,servletContextHandler,resourceHandler}); 

Jetty запускает обработчики в порядке их добавления и обработчик ресурсов обрабатывает каждый запрос, который приходит свой путь (потенциально служа ошибку 404).

3

У меня была та же проблема, но с использованием только websocketHandler и resourceHandler. Я решаю это, устанавливая resourceHandler в websocketHandler:

public static void main(String[] args) { 
    try { 
     Server server = new Server(8081); 

     ResourceHandler resourceHandler = new ResourceHandler(); 
     resourceHandler.setResourceBase("./chat"); 

     WebSocketHandler chatWebSocketHandler = new ChatWebSocketHandler(); 
     chatWebSocketHandler.setHandler(resourceHandler); 

     HandlerList handlers = new HandlerList(); 
     handlers.setHandlers(new Handler[]{chatWebSocketHandler}); 

     server.setHandler(handlers); 

     server.start(); 
     // Jetty server is stopped when the Thread is interrupted. 
     server.join(); 
    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 
} 
Смежные вопросы