在代码审核期间,一位同事建议更改阻止TCP服务器以使用非阻塞java.nio.ServerSocketChannel
和@Scheduled
方法,该方法通过accept()
重复检查新邮件。
我的问题很简单:无论选择何种间隔,是否存在丢失消息的风险? 举一个极端的例子,假设检查间隔大大增加到1小时,在此期间发送了1000条消息。 accept()
只会收到1条消息 - 其他999会被错过吗?如果是这样,他们会无声地失败,还是TCP客户端无法发送它们?
答案 0 :(得分:1)
在代码审核期间,一位同事建议更改阻止TCP服务器以使用非阻塞
java.nio.ServerSocketChannel
和@Scheduled
方法,该方法通过accept()
重复检查新邮件。
为什么呢?传入的连接不会按照时间表发生。打算解决什么问题?
我的问题很简单:无论选择何种间隔,是否存在丢失信息的风险?
是
*举一个极端的例子,让我们说检查间隔大大增加到1小时,在此期间发送了1000条消息。
accept()
只会收到1条消息 - 其他999会被遗漏吗?
有一个积压队列,所以你不会错过999,但你肯定会错过很多。究竟有多少是不确定的。
如果是这样,他们会无声地失败,还是TCP客户端无法发送它们?*
TCP客户端会收到连接错误:连接拒绝或超时,具体取决于服务器平台。
不要这样做。它完全没有意义。它没有解决任何问题,它创造了更多。