我们希望在TomEE中使用Hazelcast作为我们的JCache实现。由于我们不需要疯狂的性能,目前我们希望将Hazelcast节点作为我们应用程序的一部分运行。
我们使用Hazelcast 3.7
和TomEE 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不会正常停止,而是继续运行。
显然,解决方法是在看起来空闲时立即终止该进程。毋庸置疑,这正在推动我们的开发人员和开发人员疯狂。
为了排除在TomEE内运行Hazelcast节点引起问题的可能性,我尝试启动一个独立的Hazelcast节点并将我们的应用程序更改为仅使用Hazelcast客户端连接到所述节点。行为保持不变。据我所知,在几次网络搜索中,Hazelcast客户端也会启动多个线程,与服务器节点进行通信。
这个问题不是Hazelcast prevents the JVM from terminating的重复,因为我们完全依赖于Hazelcasts JCache实现。我们不直接访问Hazelcast
实例,因此我们无法调用shutDownAll()
。
我创建了small test case on GitHub来重现问题。
答案 0 :(得分:3)
Hazelcast使用自己的线程并且它们并不总是守护进程,您可以确保通过https://issues.apache.org/jira/browse/TOMEE-1723
中的生成器关闭您的hazelcast实例(客户端或节点)在hazelcast通过CDI扩展修复其实例的生命周期之前,它可能是最干净的。
注意:这也可以使用tomee内部服务器API来提前启动实例,但在大多数情况下不需要
答案 1 :(得分:2)
rmannibucau answer向我指出了正确的方向。
我添加了@Observes @Destroyed(ApplicationScoped.class)
并调用Caching.getCachingProvider().close()
的bean。这反过来会关闭底层的Hazelcast实例。
此解决方案还避免与Hazelcast类直接交互。依赖关系可以仅限于runtime
范围。
我在此解决方案中添加了a branch to the test case。