Apache Mina 中的死会话

3
我们有一个基于Apache Mina的GPRS网关(服务器)。有时候,通常是在客户端断开连接暴力关闭,例如电源线拔掉或任何其他异常关闭或某些网络问题时,它在服务器端未被移除或关闭。它会一直处于空闲状态,我不知道会持续多久(可能是永远)。 有时我们在关闭服务器时遇到问题,Mina花费的时间过长,有时我们必须最终终止进程。我们怀疑这个问题与死连接问题有关。
实际上,这种死连接是有道理的。由于连接是突然关闭的,mina没有办法检查它(这就是tcp会话的工作原理)。 我们想出了一个解决方案:如果会话保持空闲状态(读和写都空闲)超过30分钟(或任何可配置时间),我们将关闭该会话。但由于以下两个原因,我们不喜欢这个解决方案:
1- 它看起来不好。
2- 此外,我们有一个规则,即客户端与服务器进行持久连接。因此,在设置'空闲超时'时会有一些困难,因为我们不能简单地关闭任何已经空闲x分钟/小时的会话,因为它可能是有效的连接。
那么,在MINA中有更好、更安全(在我们的情况下)的方法来检测和清除这些死连接吗?
1个回答

1
在长时间未活动的连接和丢失连接的两种情况下 - 在通道中没有任何活动应该在OSI模型的每一层中在配置的时间后超时。 例如,您的防火墙/路由器/服务器可能会在10分钟内超时不活动的连接条目,然后您的应用程序层连接也应该在10分钟后执行此操作 - 等待更长时间没有意义。
为了防止静默连接超时,应引入保持活动协议。 它可以是ping(不完全是ICMP)或其他形式的周期性无操作通信。 当对等方处于活动状态时,它应该响应并因此刷新所有网络层上的超时倒计时。在由超时或层信号中断连接引起的失败尝试之后,您可以假定您的应用程序层连接也已中断。

感谢有用的见解。我正在寻找一种很好的内置方式来使用我正在使用的框架(Apache Mina)来处理它。 - Umer Hayat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接