activemq-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From David Sitsky <s...@nuix.com>
Subject DLQ ignored when consumer terminates abnormally (potential patch included)
Date Mon, 16 Mar 2009 06:28:40 GMT
I have an application which uses the DLQ for messages which have been 
redelivered a certain number of times.

All goes well when the consumer calls rollback(), since the consumer has 
the opportunity to send back a poisoned ack, and this gets handled well.

However there are situations where some messages can cause the entire 
JVM to exit abnormally in my application.  In this situation, if the 
message has been redelivered enough, I'd like the message to go the the 
DLQ as well in the same way.

The current code however will prevent this from occurring.  Below is a 
very rough patch to PrefetchSubscription.remove(ConnectionContext 
context, Destination destination) to use the sendToDLQ() method?

I have run out of time today to test this (I originally had these 
changes in Queue) - but would love some feedback from the activemq 
developers on this.  I know 6 is hardwired in the code - I couldn't see 
an easy way to get the DLQ policy..

Without this change, this "poison message" which kills my consumer JVM 
just keeps getting resent forever..

Index: 
activemq-core/src/main/java/org/apache/activemq/broker/region/PrefetchSubscription.java
===================================================================
--- 
activemq-core/src/main/java/org/apache/activemq/broker/region/PrefetchSubscription.java 
(revision 739923)
+++ 
activemq-core/src/main/java/org/apache/activemq/broker/region/PrefetchSubscription.java 
Mon Mar 16 17:21:02 EST 2009
@@ -541,10 +541,19 @@
              synchronized(dispatchLock) {
  	            for (MessageReference r : dispatched) {
  	                if( r.getRegionDestination() == destination) {
+                        // Its possible this message caused the 
consumer to abnormally terminate.
+                        // Check if it should be moved to the DLQ.
+                        if (r.getRedeliveryCounter() >= 6)
+                        {
+                            sendToDLQ(context, r);
+                        }
+                        else
+                        {
-	                	rc.add((QueueMessageReference)r);
-	                }
-	            }
-            }
+	                	    rc.add((QueueMessageReference)r);
+                        }
+	                }
+	            }
+            }
              // TODO Dispatched messages should be decremented from 
Inflight stat
              // Here is a potential problem concerning Inflight stat:
              // Messages not already committed or rolled back may not 
be removed from dispatched list at the moment




-- 
Cheers,
David

Nuix Pty Ltd
Suite 79, 89 Jones St, Ultimo NSW 2007, Australia    Ph: +61 2 9280 0699
Web: http://www.nuix.com                            Fax: +61 2 9212 6902

Mime
View raw message