簡體   English   中英

@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客戶端無法發送它們?

在代碼審查期間,一位同事建議將阻塞的TCP服務器更改為使用具有@Scheduled方法的無阻塞java.nio.ServerSocketChannel ,該方法會通過accept()反復檢查新消息。

為什么? 傳入的連接不會按照時間表進行。 打算解決什么問題?

我的問題很簡單:無論選擇什么間隔,都有丟失消息的風險嗎?

是。

*舉一個極端的例子,假設檢查間隔大大增加到1小時,在此期間發送了1000條消息。 accept()只會收到1條消息-其他999條消息會丟失嗎?

這里有一個積壓隊列,因此您不會錯過999,但是您肯定會錯過很多。 到底有多少是不確定的。

如果是這樣,它們會靜默失敗還是TCP客戶端無法發送它們?*

TCP客戶端將出現連接錯誤:連接拒絕或超時,具體取決於服務器平台。

不要這樣 這是完全毫無意義的。 它無法解決任何問題,並且會產生更多問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM