2021-04-03 13:21
@北流家园网 首先,你后端要有一个保持所有连接对象的池子,我这里定义的是这样的:
private final Map connections = new ConcurrentHashMap<>(100);
其中WebSocket是在封装的对象,里面主要的成员就是session。
然后有连接,断开连接,你来维护这个connections变量。
最后在MainConfig的onStop里,遍历connections然后通过WebSocket里的session对象断开连接。
我的断开所有代码是这么写的:
public static void disconnectAll() {
Map webSockets = WebSocketManagerUtil.webSocketManager.localWebSocketMap();
CloseReason closeReason = new CloseReason(CloseReason.CloseCodes.NORMAL_CLOSURE , "NORMAL_CLOSURE");
webSockets.forEach((identifier , webSocket) -> {
try {
webSocket.getSession().close(closeReason);
} catch (IOException e) {
e.printStackTrace();
}
});
webSockets.clear();
}
2021-03-11 16:35
@chcode 目前没有发现开发工作,mac上没有的软件。除了我用的powerdesigner,mac上没有,就装一个虚拟机。
2021-03-08 15:36
@一路走来 web应用如果部署成多实例实现负载均衡和故障转移,肯定就需要使用分布式session了啊。登录可以使用cookie,也可以集成单点登录,但也会需要这种分布式session的。并不是分布式都是做api接口的。
2021-03-05 11:02
@JFinal 看来还是有不少人很期待JFinal的Redis插件能支持哨兵或则集群模式的。强烈建议官方能跟根据redisson重新封装一套redis插件。除了能对redis读写,还能支持例如分布式锁这些高级功能。
2021-03-05 10:57
@海哥 JBoot已经做得很好了。我也从JBoot里学了很多东西。只是我这里自己封装了一套方便自己开发使用。自从换到undertow上,也就不再考虑其他web容器了。只要能让我尽快打完收工,尽早回家陪“女朋友”就行了。^_^
2021-03-03 11:29
@北流家园网 结合@JFinal的解释以及websocket的特性,websocket的session是不能序列化的。你这个问题,要通过两个步骤解决:第一:解决后台抛的异常问题,我观察在热加载的时候,其实是要回调onStop方法的,在这个方法里,关闭所有已经连上的websocket的session。这样就不会抛那个XNIO007007: Thread is terminating异常了。第二步,你的客户端一定要增加断线重连机制,我是通过发心跳实现的断线重连。这样,你后台一旦触发热部署,会先关闭所有已经连接的websocket,然后客户端会触发断线重连,就会重新连接上服务器。回复通信。
2021-03-02 09:41
@JFinal,已经搞定了,就是退出的时候,如果有正在通信的websocket,就会抛这个异常,说通道已经关闭。我在退出之前,把所有连接都关闭。就没事了。
另外,我在另外一个反馈里提的把自定义的SessionManager配置进undertow也已经搞定了。当然,如果波总能官方内置肯定是更好。
2021-03-01 15:06
@JFinal 没有带-9参数,带-9参数,就没有onStop的回调了。我刚才考虑是不是因为有客户端已经连上到这个服务器端实例,然后我退出服务,websocket服务器还在和客户端连接着,然后就会抛这个异常。我刚才在onStop里把该服务实例里所有创建的websocket的session都close掉。就没有这个异常抛出了。对强迫症来说,看起来清爽多了。
2021-03-01 14:12
@JFinal,我的也有这个问题,用到undertow的websocket。正常使用环境的时候有几百个用户在线,后台用3个实例做分布式websocket,如果服务器端用jfinal.sh stop停止的时候,该实例会抛这个异常。因为我的前端做了故障重连机制,所以客户端会自动重连到其他服务器端。只是这个异常看起来很别扭。下面提示贴图: