On Mar 26, 2010, at 9:10 AM, easyl wrote:
>
> AMQ 4.1.2 embedded in Geronimo 2.1.3
>
> setup in deployment plan with
> <config-property-setting name="ServerUrl">
> vm://localhost?async=true&jms.asyncDispatch=false&jms.copyMessageOnSend=false&jms.watchTopicAdvisories=false
> </config-property-setting>
>
> there are 6 different Queues listened by MDBs which may send messages to
> each other (almost with sync send/reply).
>
> When the message traffic get huge, I would got such NPE
>
> Exception in thread "VMTransport" java.lang.NullPointerException
> at
> org.apache.activemq.ActiveMQSessionExecutor.wakeup(ActiveMQSessionExecutor.java:76)
> at
> org.apache.activemq.ActiveMQSessionExecutor.execute(ActiveMQSessionExecutor.java:61)
> at
> org.apache.activemq.ActiveMQSession.dispatch(ActiveMQSession.java:1344)
> at
> org.apache.activemq.ActiveMQConnection.onCommand(ActiveMQConnection.java:1485)
> at
> org.apache.activemq.transport.ResponseCorrelator.onCommand(ResponseCorrelator.java:95)
> at
> org.apache.activemq.transport.TransportFilter.onCommand(TransportFilter.java:65)
> at
> org.apache.activemq.transport.vm.VMTransport.iterate(VMTransport.java:201)
> at
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:120)
> at
> org.apache.activemq.thread.PooledTaskRunner.access$100(PooledTaskRunner.java:26)
> at
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:47)
> at
> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:665)
> at
> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:690)
> at java.lang.Thread.run(Thread.java:619)
>
>
> then some messages will be stalled in queue (checked with jconsole).
>
> what does the NPE mean?
> how can I avoid the problem?
Looks like there's a timing hole in ActiveMQSessionExecutor. Are you driving
any close() processing? ActiveMQSessionExecutor.stop() can clear "taskRunner",
without properly synchronizing with a Thread that's executing
ActiveMQSessionExecutor.wakeup().
Rebuilding AMQ 4.1.2 with a patch similar to the following should avoid the NPE
(but won't avoid whatever is causing the close() processing):
Index:
activemq-core/src/main/java/org/apache/activemq/ActiveMQSessionExecutor.java
===================================================================
---
activemq-core/src/main/java/org/apache/activemq/ActiveMQSessionExecutor.java
(revision 663068)
+++
activemq-core/src/main/java/org/apache/activemq/ActiveMQSessionExecutor.java
(working copy)
@@ -118,10 +118,14 @@
try {
if (messageQueue.isRunning()) {
messageQueue.stop();
- if (taskRunner != null) {
- taskRunner.shutdown();
- taskRunner = null;
+ TaskRunner tempTaskRunner;
+ synchronized (this) {
+ tempTaskRunner = this.taskRunner;
+ this.taskRunner = null;
}
+ if (tempTaskRunner != null) {
+ tempTaskRunner.shutdown();
+ }
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
If you could create a Geronimo Jira, that would be great... Looks like this is
a problem in ActiveMQ 5.3 (used by Geronimo 2.2/trunk) and ActiveMQ 4.1.2 (used
by G 2.1.x)
--kevan