/** * Called by the RecoveryManager RECOVERY_BACKOFF_PERIOD seconds * after the completion of the first pass */ @Override public void periodicWorkSecondPass() { txbridgeLogger.logger.trace("InboundBridgeRecoveryManager.periodicWorkSecondPass()"); cleanupRecoveredParticipants(); // the XTS recovery module is registered and hence run before us. Therefore by the time we get here // we know deserialize has been called for any BridgeDurableParticipant for which a log exists. // thus if it's not in our participantsAwaitingRecovery list by now, it's presumed rollback. orphanedXAResourcesAreIdentifiable = true; // Inbound tx may have a JCA tx log but no corresponding XTS Participant (i.e. BridgeDurableParticipant) log. // these can now be identified and rolled back. List<Xid> indoubtSubordinates = getIndoubtSubordinates(); for(Xid xid : indoubtSubordinates) { if(checkXid(xid) == XAResourceOrphanFilter.Vote.ROLLBACK) { txbridgeLogger.logger.trace("rolling back orphaned subordinate tx "+xid); try { xaTerminator.rollback(xid); } catch(XAException e) { txbridgeLogger.i18NLogger.error_ibrm_rollbackerr(XAHelper.xidToString(xid), e); } } } }