java - 为什么 Hazelcast 无法在我的应用程序服务器上关闭?

标签 java jakarta-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 似乎无法关闭,最后,服务器挂起,迫使我终止该进程。 一旦我终止了该进程,我就会收到一个关于未找到类 Node$2 的 hazelcast 异常。

我做错了什么?如何确保 Hazelcast 与我的应用程序一起正常关闭?

最佳答案

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

因此,如果您之前使用过旧版本,请尝试 Hazelcast 3.8。否则,线程转储将非常有助于了解 Hazelcast 正在做什么。

您可以通过以下方式找到所有正在运行的Java进程

jps -l

然后通过创建线程转储

jstack <PID>

关于java - 为什么 Hazelcast 无法在我的应用程序服务器上关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42610811/

相关文章:

java - 下面代码中的列表迭代列表——哪种方法更好?

java - 分离android应用程序的功能和设计

java - 如何使用J2ME获取symbian的Group Id

Java方法范围问题

java - 如何在 WebSphere 中使用 com.ibm.websphere.classloader.ClassLoaderPlugin 进行检测

java - 如何通过 Java 更改 Macbook 的屏幕亮度?

java - 设置上下文根在 Glassfish 中不起作用

java - 从 Tomcat 调用 JBoss 中的 EJB 并将对象作为参数传递

java - SDO API : how to make XSDHelper. 实例是否正确定义带有 <include> 的 XSD 架构?

java - Windows 上的 IBM Websphere - OutOfMemoryError : Failed to create a thread