1.状态机
在smart-socket中将状态机视为一种事件类型。
当事件被触发时会及时回调MessageProcessor#stateEvent
方法,所有开发人员可以自由定制自己关心的状态机处理逻辑。比如:新建连接(NEW_SESSION
),断开连接(SESSION_CLOSED
)。
状态码 | 描述 |
---|---|
NEW_SESSION | 连接已建立并实例化Session对象 |
REJECT_ACCEPT | 拒绝接受连接,仅Server端有效。黑名单插件生效后会触发该状态机。 |
ACCEPT_EXCEPTION | 接受连接异常,仅Server端有效。 |
PROCESS_EXCEPTION | 业务处理异常。 执行MessageProcessor.process(AioSession, Object)期间发生未捕获的异常。该状态机仅作为业务逻辑不够健壮的提示,不会影响网络连接。 |
DECODE_EXCEPTION | 协议解码异常。 执行Protocol.decode(ByteBuffer, AioSession)期间发生未捕获的异常。该状态机触发后会自动关闭连接。 |
INPUT_SHUTDOWN | 读通道已被关闭,通会话正在关闭中。常由以下几种情况会触发该状态:
|
INPUT_EXCEPTION | 读操作异常。 在底层服务执行read操作期间因发生异常情况触发了java.nio.channels.CompletionHandler.failed(Throwable, Object)。 |
OUTPUT_EXCEPTION | 写操作异常。 在底层服务执行write操作期间因发生异常情况触发了java.nio.channels.CompletionHandler.failed(Throwable, Object) |
SESSION_CLOSING | 会话正在关闭中。 执行了AioSession.close(false)方法,并且当前还存在待输出的数据。 一般无需关注该状态机。 |
SESSION_CLOSED | 会话关闭成功。 |
警告
在上述各状态机中,开发人员要重点留意PROCESS_EXCEPTION
和DECODE_EXCEPTION
,当触发这类状态机,说明你的代码写的不够严谨。
注意
遇到INPUT_SHUTDOWN
、INPUT_EXCEPTION
、OUTPUT_EXCEPTION
几种情况不要惊慌,这是网络断开所触发的。
有可能是你主动调用了close所致,又或者对方断开了连接。如果你确定该现象在业务层面的表现是一种异常,需要排查其中一方是否编解码算法或者业务逻辑有问题。