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

Java 使用Dropwizard 0.7.0实现长轮询服务器,java,websocket,jetty,dropwizard,Java,Websocket,Jetty,Dropwizard,我正在尝试使用Dropwizard 0.7.0框架实现一个长轮询服务器。有人建议我使用jetty集成。在谷歌搜索之后,我被诸如WebSocket、jetty continuation、Comet之类的东西弄糊涂了 我的问题是,这些东西是什么?我应该选择哪一个?任何例子都是非常感谢的 已编辑 我们的服务器有很多客户端,包括移动(ios、android)、pc和web。websocket是否仅在web浏览器中可用?websocket在您列出的所有客户端中都可用。 通常像Atmoshphere这样的

我正在尝试使用Dropwizard 0.7.0框架实现一个长轮询服务器。有人建议我使用jetty集成。在谷歌搜索之后,我被诸如WebSocket、jetty continuation、Comet之类的东西弄糊涂了

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


已编辑


我们的服务器有很多客户端,包括移动(ios、android)、pc和web。websocket是否仅在web浏览器中可用?

websocket在您列出的所有客户端中都可用。 通常像Atmoshphere这样的框架处理降级到其他类型的传输(例如,longpolling而不是WebSocket)并为您抽象出差异。WebSocket是长轮询试图解决的问题的标准,即服务器端推送

我已经在jetty上为Dropwizard 0.7.0制作了WebSocket,但是我已经阅读了DW google组中链接到的线程

看 及

基本上,您将向DW添加一个websocket servlet,该servlet协商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);
    }

}

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

我已经在jetty上为Dropwizard 0.7.0制作了WebSocket,但是我已经阅读了DW google组中链接到的线程

看 及

基本上,您将向DW添加一个websocket servlet,该servlet协商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);
    }

}

如果要遵循JSR-356 websockets标准,可以使用以下两个Dropwizard捆绑包之一:

我编写第二个是为了支持WebSocket指标(统计消息、打开的会话、会话持续时间统计等等)

例如:

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

com.liveperson
dropwizard websocket
XXX
然后:

public void初始化(引导引导引导){
addBundle(新的WebsocketBundle(AnnotatedEchoServer.class));
}
@计量
@定时
@例外情况
@ServerEndpoint(“/annotated ws”)
公共静态类注释dechoserver{
@奥诺彭
public void myOnOpen(最后一次会话)引发IOException{
session.getAsyncRemote().sendText(“欢迎”);
}
@OnMessage
public void myOnMsg(最终会话,字符串消息){
session.getAsyncRemote().sendText(message.toUpperCase());
}
@一次
公共空间myocclose(最后一节,CloseReason cr){
}
}

如果要遵循JSR-356 websockets标准,可以使用以下两个Dropwizard捆绑包之一:

我编写第二个是为了支持WebSocket指标(统计消息、打开的会话、会话持续时间统计等等)

例如:

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

com.liveperson
dropwizard websocket
XXX
然后:

public void初始化(引导引导引导){
addBundle(新的WebsocketBundle(AnnotatedEchoServer.class));
}
@计量
@定时
@例外情况
@ServerEndpoint(“/annotated ws”)
公共静态类注释dechoserver{
@奥诺彭
public void myOnOpen(最后一次会话)引发IOException{
session.getAsyncRemote().sendText(“欢迎”);
}
@OnMessage
public void myOnMsg(最终会话,字符串消息){
session.getAsyncRemote().sendText(message.toUpperCase());
}
@一次
公共空间myocclose(最后一节,CloseReason cr){
}
}

正如我在上面的链接中所评论的,这会导致两个单独的jersey环境,因为Atmo servlet会扫描DW中使用的jersey的设置。()正如我在上面的链接中所评论的,这会导致两个独立的jersey环境,因为ATMOservlet会扫描DW中使用的jersey的设置。()