geronimo-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Kevan Miller <kevan.mil...@gmail.com>
Subject Re: sudden NullPointerException from ActiveMQSessionExecutor.wakeup
Date Fri, 26 Mar 2010 17:11:30 GMT

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
 


Mime
View raw message