diff --git a/spring-jms/src/main/java/org/springframework/jms/connection/ConnectionFactoryUtils.java b/spring-jms/src/main/java/org/springframework/jms/connection/ConnectionFactoryUtils.java index 183aeaa907..03244b01ff 100644 --- a/spring-jms/src/main/java/org/springframework/jms/connection/ConnectionFactoryUtils.java +++ b/spring-jms/src/main/java/org/springframework/jms/connection/ConnectionFactoryUtils.java @@ -419,6 +419,8 @@ public abstract class ConnectionFactoryUtils { private final boolean transacted; + private boolean commitProcessed; + public JmsResourceSynchronization(JmsResourceHolder resourceHolder, Object resourceKey, boolean transacted) { super(resourceHolder, resourceKey); this.transacted = transacted; @@ -431,6 +433,7 @@ public abstract class ConnectionFactoryUtils { @Override protected void processResourceAfterCommit(JmsResourceHolder resourceHolder) { + this.commitProcessed = true; try { resourceHolder.commitAll(); } @@ -439,6 +442,16 @@ public abstract class ConnectionFactoryUtils { } } + @Override + public void afterCompletion(int status) { + if (status == STATUS_COMMITTED && this.transacted && !this.commitProcessed) { + // JmsResourceSynchronization registered in afterCommit phase of other synchronization + // -> late local JMS transaction commit here, otherwise it would silently get dropped. + afterCommit(); + } + super.afterCompletion(status); + } + @Override protected void releaseResource(JmsResourceHolder resourceHolder, Object resourceKey) { resourceHolder.closeAll();