### 1、会话的两种关闭方式


| 方式 | 单个会话处理说明 | 服务端处理说明 | 
| -------- | -------- | -------- | 
| 关闭           | session.close()                                 | server.stop() | 
| 安全关闭     | session.preclose() -> wait(3s) -> session.close()    | server.prestop() -> wait(3s) -> server.stop() | 

关闭接口说明：

| 接口 | 说明 | 备注 |
| -------- | -------- | -------- |
| session.close()     | 向对端发送 close[code=1001] 协议帧<br/>之后关闭连接     | 对端会触发 listener::onClose 事件<br/>正在发送中的消息，都将失败     |
| session.preclose()      | 向对端发送 close[code=1000] 协议帧<br/>但不关闭连接     | session.isClosing()==true，不建议再使用此会话<br/>但是发送中的消息还能传输     |
|      |      |      |
| server.stop()     | 服务端所有 session 执行 .close()     |       |
| server.prestop()     | 服务端所有 session 执行  .preclose()     |       |

如果服务端只有监听器没有 server ？：

```
可以在监听器的里收集并维护所有的 session，在需要的时机遍历 session 执行 close 和 preclose
```

### 2、关闭

一般情况下，都只需要关闭即可。

### 3、安全关闭（一般，在 Broker 集群开发时才用到）

安全关闭，是先发个预关闭的协议帧告诉对端“我将要关闭了”，可以等你几秒，你有什么事儿抓紧的（但是不要发新消息过来了）。然后等几秒。再发送关闭协议帧，并关闭连接。

如果想要，关闭前让正在发送中的消息先发完；或者，方便让集群调度能过滤掉将要关闭的会话。可采用“安全关闭”。

```
session.preclose() -> wait(3s) -> session.close() 
```

注意，预关闭后等几秒（具体时间，视业务情况），给正在发的消息预留时间，再进行关闭。
