diff --git a/spring-jms/src/main/java/org/springframework/jms/config/AbstractJmsListenerContainerFactory.java b/spring-jms/src/main/java/org/springframework/jms/config/AbstractJmsListenerContainerFactory.java index 32816c00927..68551aba4d8 100644 --- a/spring-jms/src/main/java/org/springframework/jms/config/AbstractJmsListenerContainerFactory.java +++ b/spring-jms/src/main/java/org/springframework/jms/config/AbstractJmsListenerContainerFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -63,6 +63,9 @@ public abstract class AbstractJmsListenerContainerFactoryAs of 6.2, the default is {@code true}: The listener container will + * acknowledge each JMS Message even in case of a vendor-specific mode, + * assuming client-acknowledge style processing for custom vendor modes. + *

If the provided listener prefers to manually acknowledge each message in + * the listener itself, in combination with an "individual acknowledge" mode, + * switch this flag to {code false} along with the vendor-specific mode. + * @since 6.2.6 + * @see #setSessionAcknowledgeMode + * @see #setMessageListener + * @see Message#acknowledge() + */ + public void setAcknowledgeAfterListener(boolean acknowledgeAfterListener) { + this.acknowledgeAfterListener = acknowledgeAfterListener; + } + + /** + * Determine whether the listener container should automatically acknowledge + * each JMS Message after the message listener returned. + * @since 6.2.6 + * @see #setAcknowledgeAfterListener + * @see #isClientAcknowledge(Session) + */ + public boolean isAcknowledgeAfterListener() { + return this.acknowledgeAfterListener; + } + /** * Set whether to expose the listener JMS Session to a registered * {@link SessionAwareMessageListener} as well as to @@ -833,7 +862,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen JmsUtils.commitIfNecessary(session); } } - else if (message != null && isClientAcknowledge(session)) { + else if (message != null && isAcknowledgeAfterListener() && isClientAcknowledge(session)) { message.acknowledge(); } }