2016-08-22 54 views
7

上下文

我們希望在TomEE中使用Hazelcast作爲JCache實現。由於我們不需要瘋狂的性能,目前我們希望運行Hazelcast節點作爲我們應用程序的一部分。Hazelcast線程阻止TomEE停止

我們使用Hazelcast 3.7TomEE 7.0.1

問題

當停止TomEE,它抱怨WARNING - The web application [APPLICATION_NAME] appears to have started a thread named [SOMENAME] but has failed to stop it. This is very likely to create a memory leak.幾次和VM不會停止正常,但繼續運行。

解決方法顯然是一旦看起來空閒就終止進程。毋庸置疑,這正在推動我們的開發人員和開發人員瘋狂。

獨立Hazelcast節點

爲了排除被內部TomEE運行Hazelcast節點出現的問題的可能性,我試圖啓動一個獨立的Hazelcast節點,並改變了我們的應用程序只使用Hazelcast客戶端連接到所述節點。行爲保持不變。據我可以從幾個網頁搜索中得知,Hazelcast客戶端也啓動多個線程,以與服務器節點通信。

Hazelcast的無重複防止終止

的JVM這個問題不是Hazelcast prevents the JVM from terminating重複,因爲我們完全依靠Hazelcasts的JCache實現。我們不直接訪問Hazelcast實例,因此我們不能撥打shutDownAll()

測試用例

我創建了一個small test case on GitHub重現該問題。

問題

  • 我們可以使用Hazelcast作爲後端的JCache在Java EE應用程序?
  • 我們必須做些什麼才能讓應用程序正常停止?
  • 我們是否也可以將Hazelcast節點作爲我們的應用程序的一部分運行?如果沒有:爲什麼這是一個壞主意?
+0

[Hazelcast可能會重複阻止JVM終止](http://stackoverflow.com/questions/18701821/hazelcast-prevents-the-jvm-from-terminating) –

回答

3

Hazelcast使用它自己的線程,他們並不總是守護程序,可以保證在您關閉hazelcast實例(客戶端或節點)通過像一個生產者在https://issues.apache.org/jira/browse/TOMEE-1723

直到hazelcast固定的生命週期及其通過CDI擴展實例,它可能是最乾淨的,你可以做的。

注:這也是可行的使用tomee內部服務器API啓動實例較早,但並不需要在大多數情況下

+0

哦,我不知道'HazelcastServerCachingProvider '實際上會使用CDI來獲取'HazelcastInstance'。我明天會嘗試第一件事。感謝您的快速回復。 – Schroenser

+1

雖然這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 –

+0

通過添加HazelCastInstanceManager,我已經[更新了我的測試用例](https://github.com/schroenser/hazelcast-in-war-test/tree/with-hazelcast-instance-manager)。可悲的是,這隻會導致創建兩個Hazelcast實例,其中一個不能正確停止(可能是JCache的實例)。 我將調查是否有任何可能讓HazelcastServerCachingProvider使用由HazelcastInstanceManager管理的HazelcastInstance。 – Schroenser

2

解決方案

rmannibucauanswer向我指出了正確的方向。

我添加了一個豆,@Observes @Destroyed(ApplicationScoped.class)和調用Caching.getCachingProvider().close()。這又會關閉潛在的Hazelcast實例。

該解決方案還避免了與Hazelcast類的直接交互。依賴關係可以保持限制在runtime範圍內。

我在此解決方案中添加了a branch to the test case