3 Replies Latest reply on Dec 31, 2014 1:21 PM by Luan Cestari

    Dúvida sobre Stateless CMT EJB

    Filipe Ferraz Newbie

      Estou com certa dificuldade para compreender a propagação de uma transação dentro dos EJBs.

       

      Tenho 3 EJBs Stateless e gostaria de que ao ser lançada uma exceção em parte da transação fosse feito o rollback automático do todo.

      A única forma que encontrei de fazer isso é tratando a exceção e marcando a SessionContext com setRollbackOnly(), mas não funciona ao utilizar em um ManagedBean com @Named e @Transactional em um método já que não consigo injectar o SessionContext que foi onde começou o problema.

      Tentei utilizar  @Transactional(rollbackOn = [Exception.class]) que também não resolveu. Indo mais a fundo no problema vi que no EjbTest3 as transações do EjbTest1 e EjbTes2 já não faziam rollback ao lançar exceção em uma das duas.

      Os métodos realizaProcedimento() persistem dados no BD.

       

      Alguém tem alguma sugestão ou pode explicar uma forma de resolver este problema? Estou utilizando o Wildfly 8.1.0.Final.

       

      @Staleless
      @LocalBean
      class EjbTest1 {
           ...
           public void realizaProcedimento() {...}
      }
      
      @Staleless
      @LocalBean
      class EjbTest2 {
           ...
           public void realizaProcedimento() {
                throw new RuntimeException();
           }
      }
      
      @Staleless
      @LocalBean
      class EjbTest3 {
           @Inject
           private EJBTest1 ejb1;
           @Inject
           private EJBTest2 ejb2;
           ...
           public void realizaProcedimento() {
                ejb1.realizaProcedimento();
                ejb2.realizaProcedimento();
           }
      }