Jetty 7 встроенная конфигурация для веб-сокетов, сервлетов и обработчиков ресурсов - PullRequest
4 голосов
/ 22 февраля 2012

Я пытаюсь настроить встроенный Jetty (7.6) для одновременной обработки классов WebSocketHandler, ServletContextHandler и ResourceHandler.

Я пытался использовать классы 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?

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

Ответы [ 2 ]

6 голосов
/ 23 февраля 2012

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

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

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

3 голосов
/ 17 апреля 2012

У меня была такая же проблема, но я использовал только 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();
    }
}
...