Configurando os Métodos de Bean de Sessão do EJB 3.1 para Assíncronos

Use essa tarefa para configurar os métodos do bean de sessão do Enterprise JavaBeans (EJB) 3.1 para executar de modo assíncrono. É possível fazer alguns ou todos os métodos de bean assíncronos.

Antes de Iniciar

Atenção: Nos módulos EJB 3.1, é possível configurar um ou mais métodos de bean de sessão como assíncrono, ampliando o processamento paralelo no seu aplicativo.
  • Se você ainda não estiver familiarizado com os métodos assíncronos EJB 3.1, leia sobre os métodos assíncronos do EJB 3.1, o modelo de programação do cliente para métodos assíncronos EJB, o modelo de programação de implementação do bean para métodos assíncronos EJB e o gerenciador de trabalho de contêiner EJB para métodos assíncronos. Os tópicos fornecem uma visão geral dos métodos assíncronos do EJB 3.1, descrevem os modelos de programação de implementação do cliente e do bean e discutem o gerenciador de trabalho que o contêiner EJB usa para despachar métodos assíncronos.
  • Desenvolva um novo bean de sessão EJB 3.1 para seu aplicativo ou altere um bean de sessão existente para que esteja em conformidade com os requisitos de modelo de programação EJB 3.1 para métodos assíncronos. Para obter informações gerais, consulte as informações sobre o desenvolvimento de enterprise beans.

Sobre Esta Tarefa

Depois de ter desenvolvido um bean de sessão, conclua as seguintes etapas para tornar um ou mais métodos de bean assíncronos.

Procedimento

  1. Especifique um ou mais métodos da classe de implementação de bean como assíncronos. Isso pode ser realizado ao incluir as anotações @Asynchronous no seu código de origem de bean ao incluir as sub-rotinas <async-method> no seu descritor de implementação de módulo ou ao incluir uma combinação de anotações e de sub-rotinas do descritor de implementação. É possível aplicar apenas a anotação @Asynchronous ou suas superclasses na sua classe de implementação de bean. Ela não pode ser aplicada nas classes de interface. Além disso, quando a anotação é aplicada no nível da classe, todos os métodos dessa classe são assíncronos. Da mesma forma, todos os métodos de um bean podem ser configurados como assíncronos ao aplicar "*" como o <method-name> no seu descritor de implementação.
    Consulte os seguintes exemplos da aplicação da anotação @Asynchronous:
    • Aplique a anotação @Asynchronous em um método de um bean com uma visualização de nenhuma interface. Nesse exemplo, o método m1 é síncrono e o método m2 é assíncrono.
      @Stateless @LocalBean
      public class MyLocalBean {
      
         public void m1() {
      
            // código de método
         }
      
         @Asynchronous
         public Future<String> m2() {
      
            // código de método
      
            return new javax.ejb.AsyncResult("Hello, Async World!");
         }
      }
      Importante: O objeto javax.ejb.AsyncResult<V> é uma implementação de conveniência da interface Future<V>. Consulte a documentação da API para obter detalhes adicionais.
    • Aplique a anotação @Asynchronous no nível de classe de uma classe de bean. Nesse exemplo, os métodos m1 e m2 são assíncronos nesse bean de visualização de nenhuma interface.
      @Stateless @LocalBean @Asynchronouspublic class MyLocalBean {
      
         public void m1() {
      
            // código de método
         }
      
         public Future<String> m2() { 
      
            // código de método
      
            return new javax.ejb.AsyncResult("Hello, Async World!");
         }
      
      }
    • Aplique a anotação @Asynchronous em um método de uma classe de implementação de bean. Nesse exemplo, o método m1 é síncrono e o método m2 é assíncrono. Esse exemplo também demonstra como os tipos de retorno podem diferir entre a interface de negócios e a classe de implementação.
      public interface MyIntf {
      
         public void m1();
      
         public Future<Integer> m2();
      
      }
      @Stateless @Local(MyIntf.class)
      public class MyBean {
      
         public void m1() {
      
            // código de método
         }
      
         @Asynchronous
         public Integer m2() {
      
            // código de método
      
            return new Integer(3);
         }
      }
    • Aplique a anotação @Asynchronous no nível de classe de uma classe de implementação de bean. Nesse exemplo, os métodos m1 e m2 são assíncronos.
      @Stateless @Local(MyIntf.class) @Asynchronous
      public class MyBean {
      
         public void m1() {
      
            // código de método
         }
      
         public Integer m2() {
      
            // código de método
      
            return new Integer(8);
         }
      }
      
    Consulte os seguintes exemplos para modificar o descritor de implementação do módulo EJB, ejb-jar.xml:
    • Nesse exemplo, todos os métodos de negócios da classe de implementação de bean FullAyncBean e suas superclasses são configurados como assíncronos com o elemento de nome de método curinga (*).
      <session>
         <display-name>FullAsyncEJB</display-name>
         <ejb-name>FullAsyncBean</ejb-name>
         <business-local>com.ibm.sample.async.ejb.FullAsyncIntf</business-local>
         <ejb-class>com.ibm.sample.async.ejb.FullAsyncBean</ejb-class>
         <session-type>Stateless</session-type>   <async-method>
            <method-name>*</method-name>
         </async-method>          
      </session>
                                     
    • Nesse exemplo, apenas os métodos e assinaturas especificados -- todos os métodos denominados m1 e o método m2 -- são configurados como assíncronos na classe de implementação de bean PartiallyAsyncBean.
      <session>
         <display-name>PartiallyAsyncEJB</display-name>
         <ejb-name>PartiallyAsyncEJB</ejb-name>
         <business-local>com.ibm.sample.async.ejb.PartiallyAsyncIntf</business-local>
         <ejb-class>com.ibm.sample.async.ejb.PartiallyAsyncBean</ejb-class>
         <session-type>Stateless</session-type>   <async-method>
            <method-name>m1</method-name>
         </async-method> 
         <async-method>
            <method-name>m2</method-name>
            <method-params>
               <method-param>java.lang.String</method-param>
            </method-params>
         </async-method>         
      </session>
                                    
    Consulte os seguintes exemplos de aplicar uma combinação da anotação @Asynchronous no código de origem de bean e de modificar o descritor de implementação do módulo EJB, ejb-jar.xml:
    • Nesse exemplo, a anotação @Asynchronous configura o método m2 como assíncrono e o descritor de implementação configura o método m1 também como um método assíncrono.
      @Stateless @LocalBean
      public class MyLocalBean {
      
         public void m1() {
      
            // código de método
         }
      
         @Asynchronous
         public Future<String> m2() {
      
            // código de método
      
            return new javax.ejb.AsyncResult("Hello, Async World!");
         }
      }
      
      
      <session>
         <display-name>MyLocalEJB</display-name>
         <ejb-name>MyLocalEJB</ejb-name>
         <local-bean/>
         <ejb-class>com.ibm.sample.async.ejb.MyLocalBean</ejb-class>
         <session-type>Stateless</session-type>   <async-method>
            <method-name>m1</method-name>
         </async-method>          
      </session>
      
      
    • Nesse exemplo, a anotação @Asynchronous para o método m2 é ignorada porque o cabeçalho do descritor de implementação contém o sinalizador metadata-complete="true". Esse sinalizador faz com que as informações de configuração sejam obtidas apenas a partir dos elementos do descritor de implementação. O resultado é que apenas o método m1 da implementação MyLocalBean é configurado como assíncrono.
      @Stateless @LocalBean
      public class MyLocalBean {
      
         public void m1() {
      
            // código de método
         }
      
         @Asynchronous
         public Future<String> m2() {
      
            // código de método
      
            return new javax.ejb.AsyncResult("Hello, Async World!");
         }
      }
      
      
      <ejb-jar id="ejb-jar_ID" ...
      metadata-complete="true" version="3.1">
      ...
      <session>
         <display-name>MyLocalEJB</display-name>
         <ejb-name>MyLocalEJB</ejb-name>
         <local-bean/>
         <ejb-class>com.ibm.sample.async.ejb.MyLocalBean</ejb-class>
         <session-type>Stateless</session-type>   <async-method>
            <method-name>m1</method-name>
         </async-method>          
      </session>
      ...
      </ejb-jar> 
      
  2. Verifique se o atributo de transação aplicado a qualquer um dos métodos assíncronos é REQUIRED, REQUIRES_NEW ou NOT_SUPPORTED. Esses tipos de atributos de transação são os únicos tipos de atributos de transação suportados nos métodos assíncronos. Essa ação pode ser concluída ao aplicar as anotações @TransactionAttribute ao código de origem do bean, ao incluir as sub-rotinas <container-transaction> no arquivo ejb-jar.xml ou ao incluir uma combinação das anotações e das sub-rotinas <container-transaction> no descritor de implementação.
    Consulte o seguinte exemplo de configuração do atributo de transação de um método assíncrono usando as anotações:
    @Singleton @LocalBean
    public class FullAsyncBean {
    	@Asynchronous
    	@TransactionAttribute(REQUIRED) // o padrão; especificado para ilustração
    	public void m1() {
    		// ...
    	}
    
    	@Asynchronous
    	@TransactionAttribute(NOT_SUPPORTED)
    	public void m2() {
    		// ...
    	}
    
    	@Asynchronous
    	@TransactionAttribute(REQUIRES_NEW)
    	public void m3() {
    		// ...
    	}
    
    	// ...
    }
    
    Consulte o seguinte exemplo de configuração do atributo de transação de um método assíncrono usando o descritor de implementação XML:
      <assembly-descriptor>
        <container-transaction>
          <method>
            <ejb-name>FullAsyncBean</ejb-name>
            <method-name>m1</method-name>
          </method>
          <trans-attribute>Required</trans-attribute>
        </container-transaction>
      
        <container-transaction>
          <method>
            <ejb-name>FullAsyncBean</ejb-name>
            <method-name>m2</method-name>
          </method>
          <trans-attribute>NotSupported</trans-attribute>
        </container-transaction>
    
        <container-transaction>
          <method>
            <ejb-name>FullAsyncBean</ejb-name>
            <method-name>m3</method-name>
          </method>
          <trans-attribute>RequiresNew</trans-attribute>
        </container-transaction>
      </assembly-descriptor>
    Consulte o seguinte exemplo do uso de uma combinação de anotações e do descritor de implementação XML para configurar os atributos de transação de um bean. Nesse exemplo, as sub-rotinas do descritor de implementação para o método m3 substitui a anotação no nível de classe. O resultado é que o método m3 é configurado como REQUIRES_NEW, enquanto que os métodos m1 e m2 são configurados como REQUIRED:
    @Singleton @LocalBean
    @Asynchronous
    @TransactionAttribute(REQUIRED) // o padrão; especificado para ilustração
    public class FullAsyncBean {
    
    	public void m1() {
    		// ...
    	}
    
    	public void m2() {
    		// ...
    	}
    
    	public void m3() {
    		// ...
    	}
    
    	// ...
    }
    
    
    <assembly-descriptor>
        
       <container-transaction>
          <method>
             <ejb-name>FullAsyncBean</ejb-name>
             <method-name>m3</method-name>
          </method>
          <trans-attribute>RequiresNew</trans-attribute>
       </container-transaction>
    
    </assembly-descriptor>

O que Fazer Depois

Continue desenvolvendo componentes adicionais para seu aplicativo ou, se você tiver concluído todos os componentes necessários pelo seu aplicativo, monte e implemente seu aplicativo. Consulte as informações sobre a montagem dos módulos EJB e sobre a implementação dos módulos EJB.

Quando você executa seu aplicativo, se ele falhar quando tentar usar pela primeira vez um bean de sessão que possui um método assíncrono, poderá haver um erro de configuração. Procure no arquivo de log do sistema por mensagens de erro de configuração.

Analise os dados de rastreio ou encaminhe-os à organização apropriada para análise. O planejamento e a chamada do método assíncrono EJB são rastreados no rastreio de contêiner EJB. Para obter instruções sobre a ativação desse rastreio, consulte as informações sobre a ativação do rastreio em um servidor em execução. Para analisar os dados de rastreio, consulte as informações sobre a saída de rastreio.


Í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_dvamethods
Nome do arquivo: tejb_dvamethods.html