Hazelcast线程阻止TomEE停止

Sch*_*ser 7 java multithreading hazelcast tomee tomee-7

上下文

我们希望将Hazelcast用作TomEE中的JCache实现.由于我们不需要疯狂的性能,目前我们希望将Hazelcast节点作为我们应用程序的一部分运行.

我们使用Hazelcast 3.7TomEE 7.0.1.

问题

当停止TomEE时,它WARNING - The web application [APPLICATION_NAME] appears to have started a thread named [SOMENAME] but has failed to stop it. This is very likely to create a memory leak.会多次抱怨并且VM不会正常停止但会继续运行.

解决方法显然是在它看起来空闲时立即终止进程.毋庸置疑,这正在推动我们的开发人员和开发人员疯狂.

单独的Hazelcast节点

为了排除在TomEE内部运行Hazelcast节点引起问题的可能性,我尝试启动一个独立的Hazelcast节点并将我们的应用程序更改为仅使用Hazelcast客户端连接到所述节点.行为保持不变.据我所知,在几次网络搜索中,Hazelcast客户端也会启动多个线程,与服务器节点进行通信.

没有重复的Hazelcast会阻止JVM终止

这个问题不是重复的Hazelcast阻止JVM终止,因为我们完全依赖于Hazelcasts JCache实现.我们不Hazelcast直接访问实例,因此我们无法调用shutDownAll().

测试用例

在GitHub上创建了一个小测试用例来重现这个问题.

问题

  • 我们可以在Java EE应用程序中使用Hazelcast作为JCache后端吗?
  • 我们需要做些什么来让应用程序正常停止?
  • 我们还可以将Hazelcast节点作为我们应用程序的一部分运行吗?如果不是:为什么这是一个坏主意?

Rom*_*cau 4

Hazelcast 使用自己的线程,它们并不总是守护进程,您可以确保通过https://issues.apache.org/jira/browse/TOMEE-1723中的生产者关闭 hazelcast 实例(客户端或节点)

在 hazelcast 通过 CDI 扩展修复其实例的生命周期之前,它可能是您能做的最干净的事情。

注意:这也可以使用 tomee 内部服务器 API 来提前启动实例,但在大多数情况下不需要