Реализация сервера длинных опросов с использованием Dropwizard 0.7.0

Я пытаюсь реализовать длинный сервер опросов с помощью фреймворка Dropwizard 0.7.0. Мне предложили использовать интеграцию причала. После некоторого поиска в Google, я был действительно сбит с толку такими вещами, как паутина, продолжение пристани, кометд.

Мой вопрос: что это за вещи, и какую мне выбрать? И любой пример действительно ценится!


отредактированный

Наш сервер имеет много клиентов, в том числе мобильных (IOS, Android), ПК и веб. Доступен ли websocket только в веб-браузере?

2 ответа

Websocket доступен для всех перечисленных вами клиентов. Обычно фреймворки, такие как Atmoshphere, обрабатывают переходы к другим типам транспорта (например, longpolling вместо websockets) и абстрагируют различия для вас. Websockets является стандартом для вещей, которые пытается решить длительный опрос, то есть для продвижения на стороне сервера.

Я сделал websockets на пристани для Dropwizard 0.7.0 - но прочитал в теме, с которой я связан в группе Google DW.

См. http://www.eclipse.org/jetty/documentation/9.0.6.v20130930/websockets.html и https://groups.google.com/d/msg/dropwizard-user/doNCx_35urk/5PIvd8_NHIcJ

В основном вы добавляете веб-сокет-сервлет в DW, который согласовывает сеанс веб-сокета:

final ServletRegistration.Dynamic websocket = environment.servlets().addServlet(
            "websocket",
            new MyWebSocketServlet(
                    environment.getObjectMapper(), 
                    environment.metrics(),
                    configuration.getKafkaConfig()
            )
    );
    websocket.setAsyncSupported(true);
    websocket.addMapping("/websocket/*");

И сервлет веб-сокета:

public class MyWebSocketServlet extends WebSocketServlet{

  @Override
  public void configure(WebSocketServletFactory factory) {
    factory.register(MyWebSocketEndpoint.class);
  }
}

И, наконец, ваша конечная точка, которая запускается библиотекой причала:

@WebSocket
public class MyWebSocketEndpoint {

    @OnWebSocketMessage
    public void onMessage(Session session, String s) throws IOException {
        session.getRemote().sendString("Returned; "+s);
    }

}

Если вы хотите следовать стандарту веб-сокетов JSR-356, вы можете использовать один из следующих двух комплектов Dropwizard:

Я написал второй для поддержки также метрик веб-сокетов (подсчет сообщений, открытых сессий, статистики продолжительности сессий и т. Д.).

Пример:

<dependency>
   <groupId>com.liveperson</groupId>
   <artifactId>dropwizard-websocket</artifactId>
   <version>XXX</version>
</dependency>

Затем:

public void initialize(Bootstrap<Configuration> bootstrap) {
   bootstrap.addBundle(new WebsocketBundle(AnnotatedEchoServer.class));
}

@Metered
@Timed
@ExceptionMetered
@ServerEndpoint("/annotated-ws")
public static class AnnotatedEchoServer {
    @OnOpen
    public void myOnOpen(final Session session) throws IOException {
        session.getAsyncRemote().sendText("welcome");
    }

    @OnMessage
    public void myOnMsg(final Session session, String message) {
        session.getAsyncRemote().sendText(message.toUpperCase());
    }

    @OnClose
    public void myOnClose(final Session session, CloseReason cr) {
    }
}
Другие вопросы по тегам