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

    Dúvida sobre Stateless CMT EJB

    filipeferraz

      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();
           }
      }
      
      
        • 1. Re: Dúvida sobre Stateless CMT EJB
          lcestari

          Bem, pelo exemplo eu diria que não deve dar o problema descrito pela spec ou memso já testei algo parecido. Teria como você criar um exemplo basico no github (pode basear em jdf / helloworld) msotrando o problema?

          • 2. Re: Dúvida sobre Stateless CMT EJB
            rimolive

            Se eu entendi direito, você quer que quanto esse fluxo chegar nessa linha:

             

            1. throw new RuntimeException(); 


            Ele faça o rollback automático, certo? Porque se for, a spec diz que uma application exception (que é a exceção tratada pelo EJB) deve ser uma subclasse de Exception ou RuntimeException e a utilização direta de RuntimeException fará com que o EJB entre em um estado "Does Not Exist", o que acredito não ser o que você precisa.


            Tente criar uma classe que extenda RuntimeException e lance nesse método.

            1 of 1 people found this helpful
            • 3. Re: Dúvida sobre Stateless CMT EJB
              lcestari

              Acho que ele quer mais o contrario (que faca rollback) e isso nao acaba contecendo (nao tenho certeza, pode ser que entendi errado). Se for nessa linha de raciocinio, deveria dar rollback nos outros EJB beans (por isso queria ver se ele reproduzia esse comportamento em um projeto maven no github)