Websocket 1.0 WebSocketServlet替换

时间:2013-12-28 19:03:28

标签: java websocket tomcat7 servlet-3.0

我正在尝试采用使用(现已弃用)WebSocketServlet的旧代码。旧代码如下所示:

@Singleton
ExampleServlet extends WebSocketServlet {
    @Override
    protected StreamInbound createWebSocketInbound(String subProtocol, HttpServletRequest request) {
        // Do something
        // ...

        return // StreamInbound impl;
    }
}

正如我在较新版本的tomcat 7中所说,从tomcat 8(WebSocket 1.0,Tyrus)向后移植的WebSocket实现已被弃用。

我应该使用哪种方法来使用更新的API部署我的servlet?

2 个答案:

答案 0 :(得分:5)

关于KIC的答案 - 并不是所有需要的 由于JSR356应与Tomcat 8. *一起使用,因此您需要修改以下类:

class MyWebSocket extends WebSocketServlet

于:

import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value="/your-websocket-endpoint")
class MyWebSocket

然后,由于StreamInbound在Tomcat 8. *中也被弃用,您需要编写自己的方法来处理打开,关闭,错误和消息事件:

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;

@OnOpen
void onOpen(Session session) { }

@OnClose
void onClose(Session session) { }

@OnMessage
void onMessage(Session session, String message) { }

@OnError
void onError(Session session, Throwable throwable) { }

最后,Tomcat已经提供了javax.websocket。*类,它不应该包含在你的应用程序中。对于Maven依赖是:

<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-api</artifactId>
    <version>1.0</version>
    <scope>provided</scope>
</dependency>

并且Gradle是:

providedCompile 'javax.websocket:javax.websocket-api:1.0'

请参阅相关文章 Tomcat 8 and Websocket

答案 1 :(得分:1)

我正在回答这个老问题,因为如果你想要替换WebSocketServlet,这是谷歌的第一次打击。

  

由JSR356 WebSocket 1.0实现替换,将在Tomcat 8.0.x中删除。

所以你只需要javax WebSocket dependecy

<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-api</artifactId>
    <version>1.0</version>
</dependency>

并使用此处描述的annontations或接口:http://www.oracle.com/technetwork/articles/java/jsr356-1937161.html

就是这样。