我需要在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与我的应用程序一起优雅地关闭?
答案 0 :(得分:2)
您使用的是哪种Hazelcast版本?我们修复了3.8中的类加载器泄漏,这可能导致这种行为(参见https://github.com/hazelcast/hazelcast/pull/9691)。
因此,如果您之前使用的是旧版本,请尝试使用Hazelcast 3.8。否则,线程转储将是一个很好的帮助,看看Hazelcast正在做什么。
您可以通过
找到所有正在运行的Java进程jps -l
然后通过
创建线程转储jstack <PID>