您正在使用wso2esb并使用Active MQ进行消息队列。
使用大约3周后,ESB服务器挂起,在JMX监控ESB的帮助下,我发现它们是大量的java线程处于WAITING状态。
[EsbMonitoring] ***************** java Threads Attributes *********************
[EsbMonitoring] ThreadCount :8873
[EsbMonitoring] DaemonThreadCount :104
[EsbMonitoring] PeakThreadCount :8992
[EsbMonitoring] TotalStartedThreadCount :16086123
最初,当我们启动ESB服务器时,它们大约是560个线程
[EsbMonitoring] ***************** java Threads Attributes *********************
[EsbMonitoring] ThreadCount :592
[EsbMonitoring] DaemonThreadCount :78
[EsbMonitoring] PeakThreadCount :592
[EsbMonitoring] TotalStartedThreadCount :1510
我使用带有
的ESB服务器的jstack进行了线程转储"ActiveMQ Connection Executor: tcp://my-desktop/127.0.1.1:61616@60595" prio=10 tid=0x00007fdb1c890800 nid=0x259e waiting on condition [0x00007fda951cd000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000070bdf6c18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
"ActiveMQ Connection Executor: tcp://my-desktop/127.0.1.1:61616@60589" prio=10 tid=0x00007fdb1c8b7800 nid=0x259a waiting on condition [0x00007fda950cc000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000070be68c48> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
"ActiveMQ Connection Executor: tcp://my-desktop/127.0.1.1:61616@60590" prio=10 tid=0x00007fdb1c8ae800 nid=0x2597 waiting on condition [0x00007fda946c2000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x000000070be22c88> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
所有这些连接都在活动的MQ端关闭,但是ESB仍然持有这些线程并且麻烦ESB并且消耗很高并且在达到窗帘点之后它会挂起。我需要重启ESB服务器来解决这个问题。
首先为什么这些连接永远处于WAITING状态,为什么ESB不会删除这些线程,有没有办法可以在不重启ESB的情况下杀死或破坏WAITING线程。
任何帮助都将不胜感激。
谢谢..!
答案 0 :(得分:0)
另外几个问题
无论如何,我认为你有很高的负荷。我不认为我可以在短时间内轻松复制它。我有一些与postgresql jdbc驱动程序类似的东西,连接在一段时间后卡住了,并且池中的所有连接都被阻止了。它只是在jdbc驱动程序更新上修复。
根据http://mvnrepository.com/artifact/org.apache.activemq/activemq-broker版5.8.0相当陈旧。它于2013年发布。在activemq jira中有一些关于连接泄漏的错误报告。你可以尝试几件事。
从jboss存储库获取最新版本的库。您可以在同一页面上找到链接,如下图所示
准确了解库依赖项。还要更新依赖项。 jar文件列表在下面(来自官方文档https://docs.wso2.com/display/ESB500/Configure+with+ActiveMQ)
另一种方法是更新到activemq代理的下一个版本。 ActiveMq成熟项目,因此在每个新版本中都不太可能引入大量新功能并破坏与先前版本的兼容性。如果发行说明没有说明任何额外的普通内容,请尝试在测试环境中进行测试并做出决定。