@Scheduled 非阻塞 ServerSocketChannel accept() 会错过传入的 TCP 消息吗?

Could a @Scheduled non-blocking ServerSocketChannel accept() miss incoming TCP messages?

在代码审查期间,一位同事建议将阻塞的 TCP 服务器更改为使用具有 @Scheduled 方法的非阻塞 java.nio.ServerSocketChannel,该方法通过 accept() 重复检查新消息。

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

During code review, a colleague suggested changing a blocking TCP server to use a non-blocking java.nio.ServerSocketChannel with a @Scheduled method that repeatedly checks for new messages via accept().

为什么?传入连接不会按计划发生。想解决什么问题?

My question is simple: Whatever interval is chosen, is there a risk of missing messages?

是的。

*To take an extreme example, let's say the checking interval is hugely increased to 1 hour and 1000 messages are sent during that time. accept() would only receive 1 message - so would the other 999 be missed?

有一个积压队列,所以你不会错过 999,但你肯定会错过很多。具体有多少还不确定。

And if so, would they fail silently or would the TCP clients not be able to send them?*

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

不要这样做。这完全没有意义。它没有解决任何问题,反而会制造更多问题。