@Override protected void manageTransaction() throws Throwable { // first associate the tx on this thread, by resuming the tx final Transaction transaction = this.transactionsRepository.getImportedTransaction(this.xidTransactionID); if (transaction == null) { if (EjbLogger.EJB3_INVOCATION_LOGGER.isDebugEnabled()) { // this happens if no ejb invocations where made within the TX EjbLogger.EJB3_INVOCATION_LOGGER.debug( "Not forgetting transaction " + this.xidTransactionID + " as is was not found on the server"); } return; } this.resumeTransaction(transaction); // "forget" final Xid xid = this.xidTransactionID.getXid(); try { // get the subordinate tx final SubordinateTransaction subordinateTransaction = SubordinationManager.getTransactionImporter().getImportedTransaction(xid); if (subordinateTransaction == null) { throw new XAException(XAException.XAER_INVAL); } // invoke forget subordinateTransaction.doForget(); } catch (Exception ex) { final XAException xaException = new XAException(XAException.XAER_RMERR); xaException.initCause(ex); throw xaException; } finally { SubordinationManager.getTransactionImporter().removeImportedTransaction(xid); // disassociate the tx that was associated (resumed) on this thread. // This needs to be done explicitly because the SubOrdinationManager isn't responsible // for clearing the tx context from the thread this.transactionsRepository.getTransactionManager().suspend(); } }