Alterando Aplicativos para o Comportamento setRollbackOnly da "Versão Específica" do WebSphere
Use esta tarefa para permitir que aplicativos pós-EJB 3.0 exibam o comportamento pré-EJB 3.0 e para permitir que aplicativos pré-EJB 3.0 exibam o comportamento pós-EJB 3.0. As etapas nessa tarefa que fornecem esse comportamento de processamento são baseadas em um cenário de processamento muito específico, que é explicado na sessão Sobre esta tarefa.
Sobre Esta Tarefa
Cenário de Processamento: A configuração básica para esta tarefa é o cenário de processamento a seguir.
É chamado um método EJB que inicia uma transação global. Na execução deste método, é chamado outro método EJB que continua sendo executado na mesma transação. Durante a execução deste método, o método setRollbackOnly() é chamado. O comportamento de Contêiner EJB quando este cenário é encontrado é indicado pela Especificação EJB. Porém, esse comportamento foi solicitado a mudar no WebSphere Application Server para suporte do EJB 3.0.
A seção 13.6.2.8 do documento JSR 220: Enterprise JavaBeans™,Version 3.0 EJB Core Contracts and Requirements, bem como versões anteriores da especificação EJB, indica que
"Se o contêiner iniciou a transação imediatamente antes de despachar o método de negócios para a instância (em oposição à transação que está sendo herdada do responsável pela chamada), o contêiner deverá observar que a instância chamou o método setRollbackOnly. Quando a solicitação de método de negócios estiver concluída, o contêiner deverá retroceder em vez de confirmar a transação. Se o método de negócios retornou normalmente ou com uma exceção de aplicativo, o contêiner deverá passar o resultado do método ou a exceção de aplicativo para o cliente após o contêiner ter executado o retrocesso." Além disso, a seção 14.3.11 afirma: "No entanto, o contêiner não deve lançar o javax.ejb.EJBException ou java.rmi.RemoteException, ou se o contêiner executar um retrocesso de transação porque a instância chamou o método setRollbackOnly em seu objeto EJBContext. Neste caso, o contêiner deve retroceder a transação e passar o resultado do método de negócios ou a exceção de aplicativo lançada pelo método de negócios para o cliente."
Historicamente, o WebSphere Application Server interpretou as seções anteriores da especificação de forma a determinar que o comportamento do setRollbackOnly deve ser aplicado apenas se a transação tiver sido marcada como RollbackOnly dentro do método que iniciou a transação. No entanto, o Compatibility Test Suite para a especificação EJB 3.0 requer que uma transação que foi marcada como RollbackOnly exiba o comportamento setRollbackOnly fornecido, independentemente de a transação ter sido marcada como RollbackOnly dentro do método que iniciou a transação, ou em outro método na mesma transação que foi chamada a partir do método EJB original.
- Um aplicativo chama um método, art, no EJB A com o suporte a Transações Gerenciadas por Contêiner, TX_REQUIRED.
- O contêiner inicia uma transação e chama o método.
- O método A.art() chama um método, bob, no EJB B com o suporte a Transações Gerenciadas por Contêiner, TX_REQUIRED.
- Em B.bob(), o método setRollbackOnly é chamado na transação e, em seguida, é concluído.
Comportamento anterior ao EJB 3.0: Como a transação não é iniciada com o método B.bob(), uma TranactionRolledbackException é lançada para A.art() e, portanto, para o aplicativo cliente.
Comportamento introduzido no EJB 3.0 e mais recente: O método B.bob() retorna normalmente ao método A.art(). O método A.art() executa um retrocesso na transação e retorna os resultados ao cliente sem nenhuma exceção lançada para o aplicativo cliente, conforme indicado pela especificação EJB.
- com.ibm.websphere.ejbcontainer.limitSetRollbackOnlyBehaviorToInstanceFor : Essa propriedade permite ao usuário especificar nomes de aplicativos nos quais ele deseja que os EJBs em seus módulos EJB 3.0 demonstrem o comportamento setRollbackOnly pré-EJB 3.0, descrito anteriormente nesta seção.
- com.ibm.websphere.ejbcontainer.extendSetRollbackOnlyBehaviorBeyondInstanceFor : Essa propriedade permite ao usuário especificar nomes de aplicativos nos quais ele deseja que os EJBs em seus módulos pré-EJB 3.0 demonstrem o comportamento setRollbackOnly do EJB 3.0, descrito anteriormente nesta seção.