使用Dropwizard 0.7.0实现长轮询服务器

时间:2014-04-23 04:32:24

标签: java websocket jetty dropwizard

我正在尝试使用Dropwizard 0.7.0框架实现一个长轮询服务器。我被建议使用码头集成。经过一些谷歌搜索,我真的很困惑像websockets,jetty continuation,cometd。

我的问题是,这些东西是什么,我应该选择哪一个?任何一个例子都非常感谢!


被修改

我们的服务器有很多客户端,包括移动(ios,android),个人电脑和网络。 websocket只能在网络浏览器中使用吗?

2 个答案:

答案 0 :(得分:3)

Websocket可在您列出的所有客户端中使用。 通常像Atmoshphere这样的框架会降级到其他类型的传输(例如longpolling而不是websockets),并为你抽象出差异。 Websockets是长轮询试图解决的事情的标准 - 即服务器端推送。

我已在jetty上为Dropwizard 0.7.0完成了websockets - 但是读了我在DW google组中链接到的线程。

参见http://www.eclipse.org/jetty/documentation/9.0.6.v20130930/websockets.htmlhttps://groups.google.com/d/msg/dropwizard-user/doNCx_35urk/5PIvd8_NHIcJ

基本上你将一个websocket-servlet添加到DW,它协商一个websocket会话:

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

websocket servlet:

public class MyWebSocketServlet extends WebSocketServlet{

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

最后是你的终端由jetty websocket libs实现:

@WebSocket
public class MyWebSocketEndpoint {

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

}

答案 1 :(得分:0)

如果你想遵循JSR-356 websockets标准,你可以使用这两个Dropwizard包中的一个:

为了支持websockets指标(计算消息,开放会话,会话持续时间统计等等),我写了第二个。

示例:

<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) {
    }
}