Реализация сервера длинных опросов с использованием 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) {
}
}