介绍
会话是MINA的核心 :每次客户端连接到服务器时,都会在服务器上创建一个新会话,并将保留在内存中,直到客户端断开连接。
会话用于存储有关连接的持久性信息,以及客户端或服务器在请求处理期间以及最终在整个会话生命周期期间可能需要使用的任何类型的信息。
这也是您需要在会话上执行的任何操作的接入点:发送消息,关闭会话等…
至关重要的是要理解,由于NIO的不耐烦性质,从会话中阅读没有多大意义。实际上,当一些传入消息到达时,您的应用程序就会发出信号,这就是负责处理此类事件的 IoHandler。
换句话说,不要调用 session.read()。从不。
会话状态
会话具有一种状态,该状态将随时间演变。
- 已连接:会话已创建且可用
- 空闲:会话至少在一段时间内未处理任何请求(此时间段是可配置的)
- 空闲读取:实际上在一段时间内没有读取
- 空闲写入:在一段时间内实际上没有写入
- 两者均空闲:一段时间内不读取或写入
- 关闭:会话正在关闭(正在刷新其余消息,清理未终止)
- 已关闭 :会话现已关闭,无法执行任何其他操作来恢复它。这实际上不是一个真实的状态 :当会话关闭时,它会被删除。
- isActive(): 告诉会话是否有效(根据实现的不同,它可能意味着不同的东西)
- isClosing(): 告诉会话是否已经关闭
- isConnected(): 告诉会话是否处于活动状态(即,不在关闭模式下)
关闭会话
- 调用 closeNow() 方法(显式)
- 调用 closeOnFlush() 方法(显式)
- 客户端友好地关闭连接时
- 如果发生异常
请注意,如果远程对等方不再连接,则您使用 closeOnFlush() 调用关闭的会话将永远不会被销毁,除非您还处理了它的空闲状态,或者在系统 TCP 超时关闭套接字之前 - 这可能 需要几个小时-。 始终管理应用程序中的空闲状态。
远程客户端关闭
当远程客户端正确关闭会话时,会话将被关闭,所有未决消息将被丢弃。 这通常是它的工作方式。
但是,有时,远程客户端没有正确关闭连接(当电缆被粗暴地拔掉时,可能会发生这种情况)。 在这种情况下,会话永远不会收到有关断开连接的通知。 了解它的唯一方法是定期检查会话状态:如果空闲时间超过特定时间 - 必须进行配置 - 则应用程序可以决定关闭会话。 否则,会话最终将在达到 TCP 超时时关闭(可能需要数小时……)。
Exception
在某些情况下,将发生异常,导致会话关闭。通常,在创建会话时,我们可能会遇到问题,并且会话将立即关闭。另一种可能性是我们无法编写某些消息,例如,因为通道已关闭:然后关闭会话。
总而言之,每次我们在处理会话时遇到异常时,此会话都将关闭。
当然,您的应用程序将通过 ExceptionCaught 事件收到通知。