Hi Adrian,

doing a getMessage() before incrementReferenceCount() is dangerous since the message could have been swapped out and the call to getMessage() will return null. Yes, I know there is a null check to see if the message is null, but that should only happen if the message was expired. Right now I think it's possible that we are going to have cases of where messages get swapped out and this code is going to think that the message has been expired.

Regards,
Hiram


On Dec 23, 2005, at 4:48 AM, [EMAIL PROTECTED] wrote:

Author: aco
Date: Fri Dec 23 01:47:47 2005
New Revision: 358785

URL: http://svn.apache.org/viewcvs?rev=358785&view=rev
Log:
Postpone incrementing of reference count and preload size, only after we are sure that the message will be dispatched by the current subscription. This is to prevent a memory leak type of scenario.

Modified:
incubator/activemq/trunk/activemq-core/src/main/java/org/ activemq/broker/region/PrefetchSubscription.java

Modified: incubator/activemq/trunk/activemq-core/src/main/java/org/ activemq/broker/region/PrefetchSubscription.java URL: http://svn.apache.org/viewcvs/incubator/activemq/trunk/ activemq-core/src/main/java/org/activemq/broker/region/ PrefetchSubscription.java?rev=358785&r1=358784&r2=358785&view=diff ====================================================================== ======== --- incubator/activemq/trunk/activemq-core/src/main/java/org/ activemq/broker/region/PrefetchSubscription.java (original) +++ incubator/activemq/trunk/activemq-core/src/main/java/org/ activemq/broker/region/PrefetchSubscription.java Fri Dec 23 01:47:47 2005
@@ -239,19 +239,19 @@

private void dispatch(final MessageReference node) throws IOException {

-        node.incrementReferenceCount();
-
         final Message message = node.getMessage();
         if( message == null ) {
             return;
-        }
-        incrementPreloadSize(node.getMessage().getSize());
+        }

         // Make sure we can dispatch a message.
         if( canDispatch(node) ) {

MessageDispatch md = createMessageDispatch(node, message);
             dispatched.addLast(node);
+
+            node.incrementReferenceCount();
+            incrementPreloadSize(node.getMessage().getSize());

             if( info.isDispatchAsync() ) {
                 md.setConsumer(new Runnable(){


Reply via email to