Activemq死锁的问题
来源:互联网 发布:java主流框架 编辑:程序博客网 时间:2024/05/21 06:14
开发过程中遇到一个activemq死锁的问题,痛苦经历:
应用场景:
- 后台进程(appserver1)不断产生任务, 发送到queue上
- 前台应用(appservers)请求过来,到queue上获取消息,并根据消息取对应数据
问题:
多线程到同一个queue上直接调用receive,收消息时,会将queue锁住:
服务器端dump出来的信息如下:
ound one Java-level deadlock:=============================
"tcp:///10.0.72.76:52012":
waiting to lock monitor 0x080ead4c (object 0x952b6950, a java.util.LinkedList),
which is held by "tcp:///10.0.72.76:52010"
"tcp:///10.0.72.76:52010":
waiting to lock monitor 0x080ead8c (object 0x8e7f6620, a org.apache.activemq.broker.region.QueueSubscription),
which is held by "tcp:///10.0.72.76:52012"
在activemq论坛上发现如下内容patch:
在4.1以及之前的版本,需要自己按以下方式修改源代码
Index: activemq-core/src/main/java/org/apache/activemq/ActiveMQSessionExecutor.java===================================================================
--- activemq-core/src/main/java/org/apache/activemq/ActiveMQSessionExecutor.java (revision 480716)
+++ activemq-core/src/main/java/org/apache/activemq/ActiveMQSessionExecutor.java (revision 480717)
@@ -63,8 +63,11 @@
public void wakeup() {
if( !dispatchedBySessionPool ) {
- if( taskRunner!=null ) {
+ if( session.isSessionAsyncDispatch() ) {
try {
+ if( taskRunner == null ) {
+ taskRunner =session.connection.getSessionTaskRunner().createTaskRunner(this,"ActiveMQ Session: "+session.getSessionId());
+ }
taskRunner.wakeup();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
@@ -101,10 +104,8 @@
synchronized void start() {
if( !messageQueue.isRunning() ) {
messageQueue.start();
- if( session.isSessionAsyncDispatch() || dispatchedBySessionPool ) {
- taskRunner =session.connection.getSessionTaskRunner().createTaskRunner(this,"ActiveMQ Session: "+session.getSessionId());
- }
- wakeup();
+ if( hasUncomsumedMessages() )
+ wakeup();
}
}
该问题在4.1.1和4.2中已经解决,不过目前这两个版本都还没有release。用activemq的同学要小心了。
- Activemq死锁的问题
- 死锁的问题
- hibernate的死锁问题
- 一个死锁的问题
- 死锁的问题
- 死锁的有关问题
- Orcale死锁的问题
- 检查死锁的问题
- 线程死锁的问题
- 死锁问题的解决
- ActiveMQ的N多问题
- ActiveMQ消息确认的问题
- Apache ActiveMQ 不作为的问题
- activemq时遇到的问题
- activeMq遇到的一些问题
- ActiveMQ中遇到的问题
- sql server死锁的问题
- sql server死锁的问题
- Linux下的时间概念
- ASP.NET 2.0中Gridview控件高级技巧
- XSLT - 位于客户端
- 用存储过程生成单据号
- linux学习笔记
- Activemq死锁的问题
- SQL Server CHARINDEX和PATINDEX详解
- 小百姓包二奶技术手册 【 增好玩 】
- 软件架构(Architecture)及设计
- pd心得
- msn乱飞“绿帽子”~~~~
- 软件架构
- 大年三十整理的asp.net资料!(不得不收藏)
- How to get JNDI working in Geronimo 2.0