diff --git a/ejb3/src/main/java/org/jboss/as/ejb3/logging/EjbLogger.java b/ejb3/src/main/java/org/jboss/as/ejb3/logging/EjbLogger.java index 8b7c4e913cdb..fcf685f93618 100644 --- a/ejb3/src/main/java/org/jboss/as/ejb3/logging/EjbLogger.java +++ b/ejb3/src/main/java/org/jboss/as/ejb3/logging/EjbLogger.java @@ -43,6 +43,7 @@ import javax.ejb.EJBAccessException; import javax.ejb.EJBException; import javax.ejb.EJBTransactionRequiredException; +import javax.ejb.EJBTransactionRolledbackException; import javax.ejb.IllegalLoopbackException; import javax.ejb.LockType; import javax.ejb.NoMoreTimeoutsException; @@ -2986,7 +2987,8 @@ public interface EjbLogger extends BasicLogger { void failedToRefreshTimers(String timedObjectId); @Message(id = 457, value = "Unexpected Error") - String convertUnexpectedError(); + @Signature(String.class) + EJBTransactionRolledbackException unexpectedErrorRolledBack(@Cause Error error); //@LogMessage(level = ERROR) //@Message(id = 458, value = "Failure in caller transaction.") diff --git a/ejb3/src/main/java/org/jboss/as/ejb3/tx/CMTTxInterceptor.java b/ejb3/src/main/java/org/jboss/as/ejb3/tx/CMTTxInterceptor.java index d82d53688c9a..052cf99e3a8b 100644 --- a/ejb3/src/main/java/org/jboss/as/ejb3/tx/CMTTxInterceptor.java +++ b/ejb3/src/main/java/org/jboss/as/ejb3/tx/CMTTxInterceptor.java @@ -119,36 +119,6 @@ protected void endTransaction(final Transaction tx) { } } - protected void handleInCallerTx(InterceptorContext invocation, Throwable t, Transaction tx, final EJBComponent component) throws Exception { - ApplicationExceptionDetails ae = component.getApplicationException(t.getClass(), invocation.getMethod()); - - if (ae != null) { - if (ae.isRollback()) setRollbackOnly(tx); - // an app exception can never be an Error - throw (Exception) t; - } - - Exception toThrow; - if (!(t instanceof EJBTransactionRolledbackException)) { - if (t instanceof Error) { - toThrow = new EJBTransactionRolledbackException(EjbLogger.ROOT_LOGGER.convertUnexpectedError()); - toThrow.initCause(t); - } else if (t instanceof NoSuchEJBException || t instanceof NoSuchEntityException) { - // If this is an NoSuchEJBException, pass through to the caller - toThrow = (Exception) t; - } else if (t instanceof RuntimeException) { - toThrow = new EJBTransactionRolledbackException(t.getMessage(), (Exception) t); - } else {// application exception - throw (Exception) t; - } - } else { - toThrow= (Exception) t; - } - - setRollbackOnly(tx); - throw toThrow; - } - public void handleExceptionInOurTx(InterceptorContext invocation, Throwable t, Transaction tx, final EJBComponent component) throws Exception { ApplicationExceptionDetails ae = component.getApplicationException(t.getClass(), invocation.getMethod()); if (ae != null) { @@ -161,9 +131,7 @@ public void handleExceptionInOurTx(InterceptorContext invocation, Throwable t, T // errors and unchecked are wrapped into EJBException if (t instanceof Error) { //t = new EJBException(formatException("Unexpected Error", t)); - Throwable cause = t; - t = EjbLogger.ROOT_LOGGER.unexpectedError(); - t.initCause(cause); + t = EjbLogger.ROOT_LOGGER.unexpectedError(t); } else if (t instanceof RuntimeException) { t = new EJBException((Exception) t); } else { @@ -209,10 +177,28 @@ public Object processInvocation(InterceptorContext invocation) throws Exception protected Object invokeInCallerTx(InterceptorContext invocation, Transaction tx, final EJBComponent component) throws Exception { try { return invocation.proceed(); + } catch (Error e) { + setRollbackOnly(tx); + throw EjbLogger.ROOT_LOGGER.unexpectedErrorRolledBack(e); + } catch (Exception e) { + ApplicationExceptionDetails ae = component.getApplicationException(e.getClass(), invocation.getMethod()); + + if (ae != null) { + if (ae.isRollback()) setRollbackOnly(tx); + throw e; + } + try { + throw e; + } catch (EJBTransactionRolledbackException | NoSuchEJBException | NoSuchEntityException e2) { + setRollbackOnly(tx); + throw e2; + } catch (RuntimeException e2) { + setRollbackOnly(tx); + throw new EJBTransactionRolledbackException(e2.getMessage(), e2); + } } catch (Throwable t) { - handleInCallerTx(invocation, t, tx, component); + throw new EJBException(new UndeclaredThrowableException(t)); } - throw new RuntimeException("UNREACHABLE"); } protected Object invokeInNoTx(InterceptorContext invocation, final EJBComponent component) throws Exception { diff --git a/testsuite/integration/basic/ObjectStore/ShadowNoFileLockStore/defaultStore/Recovery/TransactionStatusManager/0_ffffc0a80102_9b5b_5ac515c9_2 b/testsuite/integration/basic/ObjectStore/ShadowNoFileLockStore/defaultStore/Recovery/TransactionStatusManager/0_ffffc0a80102_9b5b_5ac515c9_2 new file mode 100644 index 000000000000..43d0538a0a39 Binary files /dev/null and b/testsuite/integration/basic/ObjectStore/ShadowNoFileLockStore/defaultStore/Recovery/TransactionStatusManager/0_ffffc0a80102_9b5b_5ac515c9_2 differ