2013-05-08 180 views
1

我有一個ThreadPoolExecutor運行幾個核心和一定的最大線程數。 運行的任務爲每個線程創建HornetQ(獨立)連接,並在線程運行時保持活動狀態。但是,當線程keepAliveTime過期並且線程死亡時,我們無法關閉它們。有沒有在線程死亡之前清理資源的方法?ThreadPoolExecutor清理線程死亡

單程就是使用HornetQ連接的池化解決方案。

任何建議,非常感謝。

+0

這是一個有點含糊:「但是,我們不能關閉他們當線程keepAliveTime「...你是什麼意思。我試圖回答你,但我不明白這個問題。我是HornetQ的項目負責人,我會盡力回答你。 – 2013-05-08 15:11:50

+0

我與Genti合作。我們試圖找出一種方式(如果可能的話),當我們的線程閒置後死亡時自動關閉HornetQ連接。當線程處於活動狀態時,我們希望在每個線程中保持連接對HornetQ開放。目前,我們在日誌中發出HornetQ連接打開的警告。這並不壞,但我們不希望垃圾郵件我們的日誌。 – 2013-05-08 15:29:14

+0

如果我們能夠爲HornetQ獨立版本實現一個池化解決方案(連接和會話),那將非常棒。我們可以在發送消息後簡單地將連接和會話返回到池中,並讓池擔心它。 – 2013-05-08 19:15:04

回答

0

如果您使用的是JDK 1.7,您可以在可關閉的界面上嵌入東西,並且一旦超出範圍就會關閉。我們正在努力在JMS 2上實現它,但同時你可以嵌入你自己的類委託的東西。你將不得不在你的線程的某個地方引用東西,所以它只會在線程消失時超出範圍。 (線程局部也許?)

你需要使用try(聲明= statement.open()){}和經銷商可關閉會被稱爲

+0

我正在根據您的意見提出該建議。我不確定這是否會有所幫助。我只是盡我所能爲您提供一些信息。 如果這對您沒有幫助,請保持溝通暢通,我會繼續思考 – 2013-05-09 16:29:24

+0

這是一個很好的觀點,但我們目前正在使用JDK 1.6.0_21-b07。我們公司正在計劃升級到JDK 1.7,因此您的建議是可行的。我將它留給Genti來確定我們是否需要JDK 1.6解決方案。 – 2013-05-09 18:02:24

+0

我們實際上使用的是ThreadLocal,但馬克提到我們仍然在1.6。一旦我們升級到1.7,我們可能會再次解決這個問題。儘管我找不到適用於HornetQ獨立版的共享解決方案,但我有點驚訝。似乎只能在JBoss實現中使用。這就是爲什麼我要走向另一個方向,並試圖找出在線程終止之前是否有任何清理方法。 – 2013-05-09 18:16:45