我正在瀏覽 spring 集成參考文檔,在第 10.1.8 節異步輪詢中,它寫道,不協調的 conf 可能會導致內存泄漏。根據下面的文檔,conf 不協調:<int:channel id="publishChannel">? ? <int:queue /></int:channel><int:service-activator input-channel="publishChannel" ref="myService">? ? <int:poller receive-timeout="5000" task-executor="taskExecutor" fixed-rate="50" /></int:service-activator><task:executor id="taskExecutor" pool-size="20" />我在理解本節時遇到困難,因為它寫的是每秒將執行 4 個線程,因為每個線程將等待 250 毫秒,并且任務將以每秒 20 個的速度添加。任務執行器是否應該只分配 1 個線程來等待傳入消息,并且應該啟動最大線程以防隊列中有足夠的任務?另外,為什么每秒只有 4 個線程執行,如果任務花費超過 250 毫秒怎么辦?如果它太簡單并且我錯過了一些微不足道的東西,請道歉。
1 回答

瀟湘沐
TA貢獻1816條經驗 獲得超6個贊
這<task:executor id="taskExecutor" pool-size="20" />
是一個無界的任務隊列。這是默認的。
這task-executor="taskExecutor" fixed-rate="50"
意味著不會阻塞調度程序的線程,并且調度程序每 50 毫秒啟動一次新的輪詢!它的發生確實與publishChannel
內容無關。我的意思是新任務總是被放入taskExecutor
隊列中。
如果下游進程確實足夠長,則20
執行器的所有線程都會很忙,并且任務的內部隊列將會增長。這就是內存泄漏最嚴重的地方。
1 秒/ 50 毫秒 = 每秒 20 個任務。
如果 中沒有消息publishChannel
,我會說任務執行器中的所有線程都將忙于等待 5 秒超時。那么,任務的完成率是多少呢?20 active tasks / 5000 millis to wait for their finish = 4 per second
。
這個故事與4 個線程無關,而是在實際情況下我們能夠以多快的速度耗盡任務隊列。
添加回答
舉報
0/150
提交
取消