Запуск соединения Websocket со встроенной атмосферой и сервлетом jersey

Я пытаюсь запустить экземпляр Atmosphere в качестве сервлета без использования Web.xml и с использованием функций WebSocket.

Кажется, что сопоставление не работает, потому что я могу подключиться к серверу (localhost: 8080), а JavaScript сообщает мне, что соединение WS работает, но обработчик не распознается (методы никогда не вызываются). WebSocketHandlerAdapter, похоже, никогда не используется AtmosphereServlet.

Во всех найденных мной примерах для настройки сервлетов использовался Web.xml, но мне нужно иметь возможность программно создавать экземпляры своих сервлетов (Атмосфера и Джерси в контейнере Jetty).

Я работал над этим последние пару дней и начинаю биться головой ... пожалуйста, дайте мне совет :).

Я использовал этот пример Atmosphere Websocket Chat для настройки WebSocketHandlerAdapter и Jersey Atmosphere Servlet для создания экземпляров моих сервлетов в Jetty.

Большое спасибо!

Бруно Ганьон-Адам

Вот мой код для создания экземпляра моего сервера / сервлетов. :

public Server create() throws Exception {
    logger.info("creating http server");
    Server server = new Server();
    server.setStopAtShutdown(true);

    // configure http
    SelectChannelConnector httpConnector = new SelectChannelConnector();
    httpConnector.setPort(config.getHttpPort());
    server.setConnectors(new Connector[] { httpConnector });

    handlers = new HandlerCollection();
    handlers.setServer(server);
    handlers.addHandler(createLoggingHandler());
    handlers.addHandler(createFileHandler());
    handlers.addHandler(createJerseyRestServletHandler());
    server.setHandler(handlers);
    return server;
}

private ServletContextHandler createJerseyRestServletHandler() {
    ServletHolder atmosphereHolder = initAtmosphereServletHolder();
    ServletHolder jerseyHolder = initJerseyServletHolder();

    // atmosphere
    atmosphereHolder.setInitParameter("org.atmosphere.useWebSocket", "true");
    atmosphereHolder.setInitParameter("WebSocketProtocol", "ChatAtmosphereHandler");
    atmosphereHolder.setAsyncSupported(true);

    FilterHolder filterHolder = new FilterHolder(CrossOriginFilter.class);
    filterHolder.setInitParameter("allowedOrigins", "*");
    filterHolder.setInitParameter("allowedMethods", "GET, POST");

    ServletContextHandler servletHandler = new ServletContextHandler(handlers, "/");
    servletHandler.addServlet(atmosphereHolder, "/websocket/*");
    servletHandler.addServlet(jerseyHolder, "/jersey/*");
    servletHandler.addFilter(filterHolder, "/*", null);

    return servletHandler;
}

private ServletHolder initJerseyServletHolder() {
        ...
}

private ServletHolder initAtmosphereServletHolder() {
    AtmosphereServlet atmosServlet = new AtmosphereServlet();
    ServletHolder atmosphere = new ServletHolder(atmosServlet);

    return atmosphere;
}

обработчик веб-сокета:

@WebSocketHandlerService(path = "/websocket", broadcaster = SimpleBroadcaster.class)
public class ChatAtmosphereHandler extends WebSocketHandlerAdapter {

private final ObjectMapper mapper = new ObjectMapper();

@Override
public void onOpen(WebSocket webSocket) throws IOException {
    System.out.println("on Open");
    webSocket.resource().setBroadcaster(BroadcasterFactory.getDefault().lookup("/websocket", true));
}

public void onTextMessage(WebSocket webSocket, String message) throws IOException {
    System.out.println("on Message");
    AtmosphereResource r = webSocket.resource();
    Broadcaster b = r.getBroadcaster();
    b.broadcast(mapper.writeValueAsString(mapper.readValue(message, Data.class)));
}

public final static class Data {

    private String message;
    private String author;
    private long time;

    public Data() {
        this("", "");
    }

    public Data(String author, String message) {
        this.author = author;
        this.message = message;
        this.time = new Date().getTime();
    }

    public String getMessage() {
        return message;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public long getTime() {
        return time;
    }

    public void setTime(long time) {
        this.time = time;
    }
}
}

И, наконец, файл pom.xml

        <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-servlets</artifactId>
        <version>7.6.4.v20120524</version>
    </dependency>
    <dependency>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-websocket</artifactId>
        <version>7.6.4.v20120524</version>
    </dependency>
    <dependency>
        <groupId>eu.infomas</groupId>
        <artifactId>annotation-detector</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.3</version>
    </dependency>
    <dependency>
        <groupId>org.atmosphere</groupId>
        <artifactId>atmosphere-annotations</artifactId>
        <version>1.1.0.beta3</version>
    </dependency>
    <dependency>
        <groupId>org.atmosphere</groupId>
        <artifactId>atmosphere-jersey</artifactId>
        <version>1.1.0.beta3</version>
    </dependency>
    <dependency>
        <groupId>org.atmosphere</groupId>
        <artifactId>atmosphere-commons</artifactId>
        <version>0.6.5</version>
    </dependency>

person Bruno Gagnon-Adam    schedule 06.02.2013    source источник


Ответы (1)


Салют,

[Я руководитель атмосферы]

Вы можете вставить журнал своего сервера? Кроме того, URL-адрес должен быть localhost: 8080 / websocket / для подключения.

Во-вторых, почему вы определяете Jersey Servlet? Вам это не нужно с Atmosphere, поэтому просто определите AtmosphereServlet.

Если можете, перейдите в список рассылки для получения дополнительной информации.

- Жанфрансуа

person jfarcand    schedule 06.02.2013
comment
Приветствую, не могли бы вы указать мне способ реализации примера WebSocket-chat, но с сервлетом, созданным на java, вместо использования web.xml и weather.xml. Я попытался удалить сервлет jersey (который требуется для моего приложения, мне нужно запустить оба ..), но у меня возникла ошибка: com.sun.jersey.api.container.ContainerException: экземпляр ResourceConfig не содержит корневого классы ресурсов. --Спасибо - person Bruno Gagnon-Adam; 08.02.2013
comment
Что ж, я буду использовать только Jetty Websocket, и этого будет достаточно для моего приложения. Между прочим, у вас отличный фреймворк, Bonne journée! - person Bruno Gagnon-Adam; 13.02.2013