[英]Possibly blocking call in non-blocking context could lead to thread starvation. Why?
[英]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.