为什么Hazelcast不能在我的应用服务器上关闭?

时间:2017-03-05 16:22:23

标签: java java-ee websphere hazelcast

我需要在Websphere Application Server(8.5)上部署我的企业应用程序。

为了处理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与我的应用程序一起优雅地关闭?

1 个答案:

答案 0 :(得分:2)

您使用的是哪种Hazelcast版本?我们修复了3.8中的类加载器泄漏,这可能导致这种行为(参见https://github.com/hazelcast/hazelcast/pull/9691)。

因此,如果您之前使用的是旧版本,请尝试使用Hazelcast 3.8。否则,线程转储将是一个很好的帮助,看看Hazelcast正在做什么。

您可以通过

找到所有正在运行的Java进程
jps -l

然后通过

创建线程转储
jstack <PID>