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(){