@Scheduled非阻塞ServerSocketChannel accept()是否可以错过传入的TCP消息?

时间:2015-10-05 14:40:41

标签: spring tcp scheduled-tasks nio serversocket

在代码审核期间,一位同事建议更改阻止TCP服务器以使用非阻塞java.nio.ServerSocketChannel@Scheduled方法,该方法通过accept()重复检查新邮件。

我的问题很简单:无论选择何种间隔,是否存在丢失消息的风险? 举一个极端的例子,假设检查间隔大大增加到1小时,在此期间发送了1000条消息。 accept()只会收到1条消息 - 其他999会被错过吗?如果是这样,他们会无声地失败,还是TCP客户端无法发送它们?

1 个答案:

答案 0 :(得分:1)

  

在代码审核期间,一位同事建议更改阻止TCP服务器以使用非阻塞java.nio.ServerSocketChannel@Scheduled方法,该方法通过accept()重复检查新邮件。

为什么呢?传入的连接不会按照时间表发生。打算解决什么问题?

  

我的问题很简单:无论选择何种间隔,是否存在丢失信息的风险?

  

*举一个极端的例子,让我们说检查间隔大大增加到1小时,在此期间发送了1000条消息。 accept()只会收到1条消息 - 其他999会被遗漏吗?

有一个积压队列,所以你不会错过999,但你肯定会错过很多。究竟有多少是不确定的。

  

如果是这样,他们会无声地失败,还是TCP客户端无法发送它们?*

TCP客户端会收到连接错误:连接拒绝或超时,具体取决于服务器平台。

不要这样做。它完全没有意义。它没有解决任何问题,它创造了更多。