0 Replies Latest reply on Sep 13, 2018 8:24 AM by Thomas Mauch

    EJBException in TransactionPhase.AFTER_SUCCESS annotated with TransactionAttributeType.NEVER

    Thomas Mauch Newbie

      I encounter the following issue with Wildlfy which can be reproduced by the attached test case if the method testEvent is executed.

      - testEvent() is executed in transactional context and fires an event

      - afterTransaction() listens for the event with TransactionPhase.AFTER_SUCCESS

      - afterTransaction is annotated withTransactionAttributeType.NEVER which makes Wildfly throw an execption


      I have the issue on both Wildlfy 10.1.0-FINAL and Wildfly 13.0.0-FINAL.


      ####2018-09-07 07:30:40,747 ThreadId:398 ERROR [logger: org.jboss.as.ejb3.invocation] - WFLYEJB0034: EJB Invocation failed on component X for method public void X(): javax.ejb.EJBException: WFLYEJB0063: Transaction present on server in Never call (EJB3

          at org.jboss.as.ejb3.tx.CMTTxInterceptor.never(CMTTxInterceptor.java:297)


          at org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:313)

          at org.jboss.weld.event.TransactionSynchronizedRunnable.afterCompletion(TransactionSynchronizedRunnable.java:54)

          at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1200)

          at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126)


      In my opinion this is an issue in Wildfly as the old transaction is already finished and I state that I do not want a transaction in the new call.

      You can also see in the stacktrace that Wildlfy calls commitAndDisassociate() which supports my opinion.

      Also the same test case works fine in Weblogic.



      public class TestEvent {

          private static final Logger LOGGER = LoggerFactory.getLogger(TestEvent.class);

          static class MyEvent {

          Event<MyEvent> eventSender;

          public void testEvent() {
              eventSender.fire(new MyEvent());

          public void afterTransaction(@Observes(during = TransactionPhase.AFTER_SUCCESS) MyEvent event) {