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.

Para ilustrar este requisito, considere o seguinte exemplo:
  • 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.

Como este processamento introduz uma mudança no comportamento para aplicativos que são migrados para o EJB 3.0 ou mais recente de uma versão anterior, as seguintes propriedades de sistema JVM ficam disponíveis para alterar este comportamento de acordo com seus requisitos:
  • 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.
Os valores destas propriedades são configurados para os nomes de aplicativos (appName1:appName2:appName3) que precisam demonstrar o comportamento desejado.

Procedimento

  1. Abra o administrative console.
  2. Selecione Servidores.
  3. Selecione Tipos de Servidores.
  4. Selecione Servidores de Aplicativos WebSphere.
  5. Selecione o servidor que você deseja configurar.
  6. Em Infraestrutura do Servidor, selecione Gerenciamento de Java e Processos > Definição de Processo.
  7. Em Propriedades Adicionais, selecione Java Virtual Machine > Propriedades Customizadas > Novo.
  8. No campo de entrada Nome, digite a propriedade de sistema JVM.

    com.ibm.websphere.ejbcontainer.limitSetRollbackOnlyBehaviorToInstanceFor

    ou

    com.ibm.websphere.ejbcontainer.extendSetRollbackOnlyBehaviorBeyondInstanceFor

  9. No campo de entrada Valor, digite (appName1:appName2:appName3....). . Nomes do(s) aplicativo(s) ao(s) qual(is) o comportamento deve ser aplicado.
  10. Selecione OK.
  11. Salve a configuração.
  12. Reinicie o servidor.

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_version_specific
Nome do arquivo: tejb_version_specific.html