diff --git a/src/main/java/org/wildfly/transaction/client/_private/Log.java b/src/main/java/org/wildfly/transaction/client/_private/Log.java index fcd2e89..23dbf9e 100644 --- a/src/main/java/org/wildfly/transaction/client/_private/Log.java +++ b/src/main/java/org/wildfly/transaction/client/_private/Log.java @@ -67,6 +67,9 @@ public interface Log extends BasicLogger { @Message(value = "Unknown I/O error when listing xa resource recovery files in %s (File.list() returned null)") void listXAResourceRecoveryFilesNull(File dir); + @LogMessage(level = Logger.Level.WARN) + @Message(value = "Error while removing imported transaction of xid %s from the underlying transaction manager") + void cannotRemoveImportedTransaction(Xid xid, @Cause XAException e); // Debug @@ -112,6 +115,10 @@ public interface Log extends BasicLogger { @Message(value = "Recovered in doubt xa resource (%s) from xa resource recovery registry %s") void xaResourceRecoveredFromRecoveryRegistry(URI uri, Path filePath); + @LogMessage(level = Logger.Level.TRACE) + @Message(value = "Unknown xid %s to be removed from the instances known to the wfly txn client") + void unknownXidToBeRemovedFromTheKnownTransactionInstances(Xid xid); + // Regular messages @Message(id = 0, value = "No transaction associated with the current thread") diff --git a/src/main/java/org/wildfly/transaction/client/provider/jboss/JBossLocalTransactionProvider.java b/src/main/java/org/wildfly/transaction/client/provider/jboss/JBossLocalTransactionProvider.java index 415b3ca..508f6da 100755 --- a/src/main/java/org/wildfly/transaction/client/provider/jboss/JBossLocalTransactionProvider.java +++ b/src/main/java/org/wildfly/transaction/client/provider/jboss/JBossLocalTransactionProvider.java @@ -226,7 +226,22 @@ public void afterCompletion(final int status) { final ConcurrentMap known = JBossLocalTransactionProvider.this.known; final Iterator iterator = timeoutSet.headSet(new XidKey(SimpleXid.EMPTY, timeTick)).iterator(); while (iterator.hasNext()) { - known.remove(iterator.next().getId()); + SimpleXid xidToRemove = iterator.next().getId(); + Entry knownEntry = known.remove(xidToRemove); + + if (knownEntry == null) { + Log.log.unknownXidToBeRemovedFromTheKnownTransactionInstances(xidToRemove); + } else { + final Transaction transaction = knownEntry.getTransaction(); + if (transaction instanceof ImportedTransaction) { + try { + ext.removeImportedTransaction(getXid(transaction)); + } catch (XAException xae) { + Log.log.cannotRemoveImportedTransaction(xidToRemove, xae); + } + } + } + iterator.remove(); } }