java - 嵌入式 hazelcast 防止 Tomcat 中的干净关闭

标签 java tomcat hazelcast

我在 Tomcat 7 网络应用程序中嵌入了 hazelcast (3.8.2)。关机时我打电话

 myInstance.shutdown();
 Hazelcast.shutdownAll();

但我仍然在 tomcat 日志中收到此错误,这阻止了我的 web 应用程序的干净关闭。 HazelcastManagedThread 似乎在服务器停止后尝试运行 ClisterListenerSupport 实例。

我是否遗漏了一些应该添加到关闭 Hook 中的进一步清理步骤?

04-Oct-2017 12:15:08.923 INFO [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8084"]
04-Oct-2017 12:15:08.952 INFO [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["ajp-nio-8009"]
04-Oct-2017 12:15:09.048 INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8084"]
04-Oct-2017 12:15:09.049 INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["ajp-nio-8009"]
04-Oct-2017 12:15:14.226 INFO [hz.client_0.cluster-] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access: this web application instance has been stopped already. Could not load [com.hazelcast.client.spi.impl.ClusterListenerSupport$1$1]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
     java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [com.hazelcast.client.spi.impl.ClusterListenerSupport$1$1]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1327)
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1313)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1196)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157)
        at com.hazelcast.client.spi.impl.ClusterListenerSupport$1.run(ClusterListenerSupport.java:235)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
        at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:64)
        at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:80)

    Exception in thread "hz.client_0.cluster-" java.lang.IllegalStateException: Can't overwrite cause with java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [com.hazelcast.client.spi.impl.ClusterListenerSupport$1$1]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
        at java.lang.Throwable.initCause(Throwable.java:457)
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1316)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1196)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157)
        at com.hazelcast.client.spi.impl.ClusterListenerSupport$1.run(ClusterListenerSupport.java:235)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
        at com.hazelcast.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:64)
        at com.hazelcast.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:80)
    Caused by: java.lang.ClassNotFoundException
        at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1315)
        ... 8 more

最佳答案

这很难解决。问题是,Tomcat 已经处于关闭模式,类加载器不会加载新类。然而,Hazelcast 是第一次在关闭时使用类,因此需要加载它们。解决这个问题实际上非常难看。您可以使用 Class.forName(或其他反射机制)来加载类。您不必存储对该类的引用,但这实际上会强制 JVM 加载其他依赖类。

关于java - 嵌入式 hazelcast 防止 Tomcat 中的干净关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46563754/

相关文章:

java - Hazelcast 不同键聚合

kubernetes - Redis - 使用集群避免数据丢失(使用 Gossip 协议(protocol))

java - 如何确定 64 位值中第 n 个最高有效位组的位置?

java - Java 中是否有任何可用的 SMS Pdu 解析器?

mysql - Grails/Tomcat : Database connections get stuck in sleep state

java - Tomcat7检测内存泄漏

tomcat - 我的 JUnit 测试如何找到我的 Tomcat 数据源?

java - 如何让 Runnable 知道 Hazelcast 中的某些本地应用程序 bean?

java - 无法从 Android 应用程序中删除解析对象

Java Servlet URL 映射