2017-03-05 41 views
0

我需要在Websphere Application Server(8.5)上部署我的企業應用程序。爲什麼Hazelcast無法在我的應用程序服務器上關閉?

爲了處理hazelcast的生命週期我準備了以下監視對象:

public class HazelMonitor{ 
    private static HazelcastInstance inst = null; 

    public static synchronized getInstance(){ 
    if(inst == null){ 
     inst = Hazelcast.getOrCreateInstance(...); 
    } 
     return inst; 
    } 

public static synchronized shutdown(){ 
     if(inst != null){ 
      inst.shutdown(); 
      inst = null; 
     } 
} 
} 

現在,我的EJB是這樣的:

public class MyEjb{ 
@PostConstruct 
pulic void init(){ 
    HazelMonitor.getInstance(); 
} 

@PreDestroy 
public void close(){ 
    HazelMonitor.shutdown(); 
} 
} 

一切似乎只是當我試圖關閉我的服務器工作:Hazelcast似乎無法關閉,最終,服務器只能掛斷,迫使我殺死該進程。 一旦我殺了這個過程,我收到一個關於未找到的類的榛樹例外節點$ 2

我在做什麼錯?如何確保Hazelcast與我的應用程序一起關閉?

+0

你確認創建線程轉儲的EJB'@ PreDestroy'實際上是被調用和'。 shutdown()調用正在發生? –

+0

我猜當調用PreDestroy方法時,類加載器已經被終止。嘗試將其封裝到try/catch塊中,記錄發生的任何異常。 – noctarius

回答

2

您正在使用哪個Hazelcast版本?我們在3.8中修正了一個類加載漏洞,這可能會導致這種行爲(請參閱https://github.com/hazelcast/hazelcast/pull/9691)。

因此,如果您之前使用過舊版本,請試用Hazelcast 3.8。否則,線程轉儲將非常有助於瞭解Hazelcast正在做什麼。

您可以通過

jps -l 

找到所有正在運行的Java進程,然後通過

jstack <PID> 
相關問題