JMS复制死锁-如何解决

时间:2018-07-11 14:29:33

标签: java hibernate rabbitmq jms ehcache

我们有一个使用标准Java-Hibernate-MySQL堆栈的应用程序。该应用程序在Karaf容器下运行。该应用程序可以与主节点和从节点一起分发。 MySQL,RabbitMQ(和Zookeeper)在主节点上运行,从属节点连接到主节点上的那些服务(因此,只有MySQL,RabbitMQ等的一个副本)

我们正在将EHCache用于辅助Hibernate缓存,并将jms-replication与ehcache同步到其他节点。也有一些使用ehcache实现的应用程序级缓存。我们使用RabbitMQ进行消息传递,因此JMS复制消息将通过RabbitMQ传递。

几乎所有时间,它都能正常工作。但是,在极少数情况下,我们似乎陷入僵局。 RabbitMQ中ready队列的totalehcache消息计数增加,而unacknowledged计数保持为1时,这似乎是一个死锁。

以下是我们使用的软件版本:

RabbitMQ - 3.7.6
EHCache - 2.10.5
jms-replication - 0.5
Hibernate - 4.1.4 (Final)

还有一个hibernate-ehcache-4.1.4.Final.jar-所以我不确定实际上正在运行什么EHCache代码。

发生这种情况时,我可以获取Java线程转储,但是我不确定要查找的内容。有JMS线程(JMS复制线程,SSE-JMSConsumer),但是我不确定哪个线程在执行复制。

在更大规模的生产系统上,这种情况似乎经常发生-可能一天或两次。在内部测试系统上,很难复制。唯一的解决方法是重新启动应用程序-临时队列被删除并重新创建,并且一切正常,直到下一个死锁为止。

由于某种原因,我无法将JConsole附加到应用程序。

另一个注意事项-节点通过VPN隧道(Racoon)连接。如果隧道有打ic声,那会引起问题吗?

基本上,我正在寻找有关如何解决此问题的建议。

谢谢。

0 个答案:

没有答案