Browse Source

Trigger late commit in JmsResourceSynchronization.afterCompletion if necessary

Closes gh-20817
pull/28374/merge
Juergen Hoeller 1 year ago
parent
commit
6957ac5324
  1. 13
      spring-jms/src/main/java/org/springframework/jms/connection/ConnectionFactoryUtils.java

13
spring-jms/src/main/java/org/springframework/jms/connection/ConnectionFactoryUtils.java

@ -419,6 +419,8 @@ public abstract class ConnectionFactoryUtils { @@ -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 { @@ -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 { @@ -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();

Loading…
Cancel
Save