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&amp;jms.asyncDispatch=false&amp;jms.copyMessageOnSend=false&amp;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
 

Reply via email to