Spring3没有提供原生的对于websocket的支持,但是如果你的项目的架构基础都是spring3(出于种种原因迟迟无法升级到spring4),但是又想集成websocket的服务,怎么办?有办法解决吗?当然可以啦
既然没有原生的支持,那么为什么我们不直接自己写一个实现呢?于是说干就干,
首先我们需要实现websocket的协议,这个协议的具体我就不说了,想了解的朋友可以自己在百度上谷歌一下,可以参考下tomcat的源码实现,实现了websocket的服务以后我们就有了websocket的服务端了,但是我们是在springmvc的框架下面,如何启动我们的websocket服务呢,我研究了下,可以使用2种方法,
一是使用监听器,配置web.xml,来初始化我们的服务,但是这种方法无法使用到spring的 注解,于是这种方式就不太适用,于是想到了第二种方式,通过实现ApplicationListener来在容器初始化的时候启动服务,这样启动的服务里面就可以正常的使用spring相关的注解了。
好了废话不多说了,上代码:
Initwebsocket.java
@Service
public class Initwebsocket implements ApplicationListener<ContextRefreshedEvent> {
private static Log log = LogFactory.getLog(Initwebsocket.class);
@Autowired
private WebSocketServerService webServer;
// @Override
// public void contextDestroyed(ServletContextEvent arg0) {
// try {
// webServer.stopService();
// } catch (IOException e) {
// log.info("关闭websocke失败");
// }
//
// }
//
// @Override
// public void contextInitialized(ServletContextEvent arg0) {
//
// }
@Override
public void onApplicationEvent(ContextRefreshedEvent arg0) {
if (arg0.getApplicationContext().getParent() == null) {
// 开启websocket服务
try {
webServer.startService();
} catch (UnknownHostException e) {
log.debug(e);
} catch (IOException e) {
log.debug(e);
}
}
// 初始化容器后自动执行的方法
}
}
核心服务代码如下:
WebSocketServerService.java
@Service
public class WebSocketServerService {
@Autowired
ITestWebsocket iTestWebsocket;
private static Log log = LogFactory.getLog(WebSocketServerService.class);
private String websocketPort;
private String websocketIp;
private String websocketBlockflag;
/**
* 端口号
*/
@SuppressWarning