From b456bc107b39ed52efb29fd6540033e9442be1f4 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 15 Jul 2010 19:43:56 +0000 Subject: [PATCH] DefaultMessageListenerContainer triggers Session commit even if no message has been received (SPR-7366) --- .../jms/listener/AbstractMessageListenerContainer.java | 2 +- .../AbstractPollingMessageListenerContainer.java | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/org.springframework.jms/src/main/java/org/springframework/jms/listener/AbstractMessageListenerContainer.java b/org.springframework.jms/src/main/java/org/springframework/jms/listener/AbstractMessageListenerContainer.java index 551b9ce7b0d..5a2ca4f6c70 100644 --- a/org.springframework.jms/src/main/java/org/springframework/jms/listener/AbstractMessageListenerContainer.java +++ b/org.springframework.jms/src/main/java/org/springframework/jms/listener/AbstractMessageListenerContainer.java @@ -575,7 +575,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen JmsUtils.commitIfNecessary(session); } } - else if (isClientAcknowledge(session)) { + else if (message != null && isClientAcknowledge(session)) { message.acknowledge(); } } diff --git a/org.springframework.jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java b/org.springframework.jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java index d209b771b14..af0c0f8b2ca 100644 --- a/org.springframework.jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java +++ b/org.springframework.jms/src/main/java/org/springframework/jms/listener/AbstractPollingMessageListenerContainer.java @@ -341,6 +341,7 @@ public abstract class AbstractPollingMessageListenerContainer extends AbstractMe TransactionSynchronizationManager.unbindResource(getConnectionFactory()); } } + // Indicate that a message has been received. return true; } else { @@ -349,6 +350,9 @@ public abstract class AbstractPollingMessageListenerContainer extends AbstractMe "session [" + sessionToUse + "] did not receive a message"); } noMessageReceived(invoker, sessionToUse); + // Nevertheless call commit, in order to reset the transaction timeout (if any). + commitIfNecessary(session, message); + // Indicate that no message has been received. return false; } } @@ -416,9 +420,9 @@ public abstract class AbstractPollingMessageListenerContainer extends AbstractMe } /** - * Template method that gets called right no message has been received, - * before attempting to process it. Allows subclasses to react to the event - * of an actual incoming message, for example marking . + * Template method that gets called when no message has been received, + * before returning to the receive loop again. Allows subclasses to react to + * the event of no incoming message, for example marking the invoker as idle. * @param invoker the invoker object (passed through) * @param session the receiving JMS Session */