关闭与安全关闭
1、会话的两种关闭方式
方式 | 单个会话处理说明 | 服务端处理说明 |
---|---|---|
关闭 | session.close() | server.stop() |
安全关闭 | session.preclose() -> wait(3s) -> session.close() | server.prestop() -> wait(3s) -> server.stop() |
关闭接口说明:
接口 | 说明 | 备注 |
---|---|---|
session.close() | 向对端发送 close[code=1001] 协议帧 之后关闭连接 | 对端会触发 listener::onClose 事件 正在发送中的消息,都将失败 |
session.preclose() | 向对端发送 close[code=1000] 协议帧 但不关闭连接 | session.isClosing()==true,不建议再使用此会话 但是发送中的消息还能传输 |
server.stop() | 服务端所有 session 执行 .close() | |
server.prestop() | 服务端所有 session 执行 .preclose() |
如果服务端只有监听器没有 server ?:
可以在监听器的里收集并维护所有的 session,在需要的时机遍历 session 执行 close 和 preclose
2、关闭
一般情况下,都只需要关闭即可。
3、安全关闭(一般,在 Broker 集群开发时才用到)
安全关闭,是先发个预关闭的协议帧告诉对端“我将要关闭了”,可以等你几秒,你有什么事儿抓紧的(但是不要发新消息过来了)。然后等几秒。再发送关闭协议帧,并关闭连接。
如果想要,关闭前让正在发送中的消息先发完;或者,方便让集群调度能过滤掉将要关闭的会话。可采用“安全关闭”。
session.preclose() -> wait(3s) -> session.close()
注意,预关闭后等几秒(具体时间,视业务情况),给正在发的消息预留时间,再进行关闭。