1. 程式人生 > >記一次整合spring-amqp後出現執行緒池為正常關閉。導致tomcat無法正常關閉顯示記憶體洩露的問題

記一次整合spring-amqp後出現執行緒池為正常關閉。導致tomcat無法正常關閉顯示記憶體洩露的問題

起因:因為這幾天閒來無事,所以想著改造下舊專案的訂單自動取消功能,原本是通過定時任務輪詢掃描未支付訂單的,及時性不足並且浪費資料庫io的資源,所以就想用rabbitmq的死信佇列來完成延遲自動取消的功能。於是隨手copy了一段spring-amqp的Java Configuration配置

如圖:起初並沒什麼問題,但是後來發現只要一執行向rabbitmq的佇列中推送訊息的方法後:

b7b57c63-80de-44fd-a738-c59d32b29b22便出現了tomcat無法正常停止的錯誤

如圖顯示名為pool-3-thread-1的執行緒沒法正常停止,tomcat提示記憶體洩露。

--------------------------------

解決思路:執行傳送語句後會出現tomcat無法正常停止的錯誤,說明在spring在執行傳送操作時肯定是init了某個執行緒池,但是在destroy階段並沒有正確的shutdown該執行緒池

結果發現是因為在設定中打開了傳送確認模式後:在PublisherCallbackChannelImpl初始化了一個SingleThreadExecutor執行緒池但在destroy階段並沒有執行shutdown的操作,因為tomcat對未關閉的執行緒十分敏感所以出了錯誤無法正常關閉。

解決方法:

1.關閉傳送確認模式、。

2、用spring的ThreadPoolTaskExecutor執行緒池統一接管rabbitmq 下的所有執行緒池。保證在專案結束時能正常關閉

如圖