Methoden von Session-Beans der EJB Version 3.1 als asynchrone Methoden konfigurieren

Verwenden Sie diese Task, um Methoden von Session-Beans der Enterprise JavaBeans (EJB) Version 3.1 für eine asynchrone Ausführung zu konfigurieren. Sie können einige oder alle Beanmethoden als asynchrone Methoden konfigurieren.

Vorbereitende Schritte

Achtung: In Modulen der EJB Version 3.1 können Sie eine oder mehrere Session-Bean-Methoden als asynchrone Methoden konfigurieren und damit die Parallelverarbeitung in Ihrer Anwendung erweitern.
  • Wenn Sie mit den asynchronen Methoden der EJB Version 3.1 nicht vertraut sind, lesen Sie die Informationen zu den asynchronen Methoden der EJB Version 3.1, zum Clientprogrammiermodell für asynchrone EJB-Methoden, zum Programmiermodell der Beanimplementierung für asynchrone EJB-Methoden und zum Work Manager des EJB-Containers für asynchrone Methoden. Die Artikel enthalten eine Übersicht über asynchrone Methoden der EJB Version 3.1, beschreiben die Programmiermodelle der Client- und Beanimplementierung sowie den Work Manager, den der EJB-Container verwendet, um asynchrone Methoden zuzuteilen.
  • Entwickeln Sie eine neue Session-Bean der EJB Version 3.1 für Ihre Anwendung, oder ändern Sie eine vorhandene Session-Bean so, dass sie den Voraussetzungen des Programmiermodells der EJB Version 3.1 für asynchrone Methoden entspricht. Allgemeine Informationen hierzu finden Sie im Artikel zum Entwickeln von Enterprise-Beans.

Informationen zu diesem Vorgang

Nachdem Sie eine Session-Bean entwickelt haben, führen Sie die folgenden Schritte aus, um eine oder mehrere Beanmethoden als asynchrone Methoden zu konfigurieren.

Vorgehensweise

  1. Definieren Sie eine oder mehrere Methoden der Beanimplementierungsklasse als asynchrone Methoden. Zu diesem Zweck können Sie @Asynchronous-Annotationen im Beanquellcode hinzufügen, <async-method>-Zeilengruppen in Ihrem Modulimplementierungsdeskriptor hinzufügen oder eine Kombination von Annotationen und Implementierungsdeskriptorzeilengruppen hinzufügen. Sie können die Annotation "@Asynchronous" nur auf Ihre Bean-Implementierungsklasse und die zugehörigen Superklassen anwenden. Die Annotation kann nicht auf Schnittstellenklassen angewendet werden. Wird die Annotation auf Klassenebene angewendet, werden alle Methoden dieser Klasse zu asynchronen Methoden. Alle Methoden einer Bean werden auch dann zu asynchronen Methoden, wenn das Element <method-name> mit dem Wert "*" im Implementierungsdeskriptor angewendet wird.
    Sehen Sie sich die folgenden Beispiele für die Anwendung der Annotation "@Asynchronous" an:
    • Annotation "@Asynchronous" auf eine einzige Methode einer Bean mit einer Ansicht ohne Schnittstelle anwenden. In diesem Beispiel ist die Methode "m1" synchron und die Methode "m2" asynchron.
      @Stateless @LocalBean
      public class MyLocalBean {
      
         public void m1() {
      
            // Methodencode
         }
      
         @Asynchronous
         public Future<String> m2() {
      
            // Methodencode
      
            return new javax.ejb.AsyncResult("Hello, Async World!");
         }
      }
      Wichtig: Das Objekt "javax.ejb.AsyncResult<V>" ist eine optionale Implementierung der Schnittstelle "Future<V>". Weitere Einzelheiten finden Sie in der API-Dokumentation.
    • Annotation "@Asynchronous" auf Klassenebene einer Beanklasse anwenden. In diesem Beispiel sind die Methoden "m1" und "m2" in dieser Bean mit einer Ansicht ohne Schnittstelle asynchron.
      @Stateless @LocalBean @Asynchronouspublic class MyLocalBean {
      
         public void m1() {
      
            // Methodencode
         }
      
         public Future<String> m2() { 
      
            // Methodencode
      
            return new javax.ejb.AsyncResult("Hello, Async World!");
         }
      
      }
    • Annotation "@Asynchronous" auf eine einzige Methode einer Beanimplementierungsklasse anwenden. In diesem Beispiel ist die Methode "m1" synchron und die Methode "m2" asynchron. Dieses Beispiel veranschaulicht auch, wie sich die Rückgabetypen der Geschäftsschnittstelle und der Implementierungsklasse unterscheiden:
      public interface MyIntf {
      
         public void m1();
      
         public Future<Integer> m2();
      
      }
      @Stateless @Local(MyIntf.class)
      public class MyBean {
      
         public void m1() {
      
            // Methodencode
         }
      
         @Asynchronous
         public Integer m2() {
      
            // Methodencode
      
            return new Integer(3);
         }
      }
    • Annotation "@Asynchronous" auf Klassenebene einer Beanimplementierungsklasse anwenden. In diesem Beispiel sind die Methoden "m1" und "m2" asynchron.
      @Stateless @Local(MyIntf.class) @Asynchronous
      public class MyBean {
      
         public void m1() {
      
            // Methodencode
         }
      
         public Integer m2() {
      
            // Methodencode
      
            return new Integer(8);
         }
      }
      
    Sehen Sie sich die folgenden Beispiele zum Ändern des Implementierungsdeskriptors des EJB-Moduls, ejb-jar.xml:, an.
    • In diesem Beispiel werden alle Geschäftsmethoden der Beanimplementierungsklasse "FullAyncBean" und der zugehörigen Superklassen mithilfe des Platzhalters (*) im Element "tmethod-name" als asynchron konfiguriert.
      <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> 
                                     
    • In diesem Beispiel werden nur die angegebenen Methoden und Signaturen (alle Methoden mit dem Namen m1 und die Methode m2 mit einem einzigen Zeichenfolgeparameter) in der Beanimplementierungsklasse als asynchron konfiguriert.
      <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> 
                                    
    Sehen Sie sich die folgenden Beispiele zum Anwenden einer Kombination von @Asynchronous-Annotationen im Beanquellcode und zum Ändern des Implementierungsdeskriptors des EJB-Moduls, ejb-jar.xml, an:
    • In diesem Beispiel konfiguriert die Annotation "@Asynchronous" Methode "m2" als asynchrone Methode, und der Implementierungsdeskriptor konfiguriert Methode "m1" ebenfalls als asynchrone Methode.
      @Stateless @LocalBean
      public class MyLocalBean {
      
         public void m1() {
      
            // Methodencode
         }
      
         @Asynchronous
         public Future<String> m2() {
      
            // Methodencode
      
            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> 
      
      
    • In diesem Beispiel wird die Annotation "@Asynchronous" für die Methode "m2" ignoriert, weil der Implementierungsdeskriptorheader das Flag "metadata-complete="true"" enthält. Dieses Flag bewirkt, dass Konfigurationsdaten nur den Elementen im Implementierungsdeskriptor entnommen werden. Das Ergebnis ist, dass nur Methode "m1" der Implementierung "MyLocalBean" als asynchrone Methode konfiguriert wird.
      @Stateless @LocalBean
      public class MyLocalBean {
      
         public void m1() {
      
            // Methodencode
         }
      
         @Asynchronous
         public Future<String> m2() {
      
            // Methodencode
      
            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. Vergewissern Sie sich, dass das auf asynchrone Methoden angewendete Transaktionsattribut REQUIRED, REQUIRES_NEW oder NOT_SUPPORTED ist. Diese Transaktionsattributtypen sind die einzigen, die in asynchronen Methoden zulässig sind. Sie können diese Aktion ausführen, indem Sie @TransactionAttribute-Annotationen im Beanquellcode anwenden, <container-transaction>-Zeilengruppen in der Datei ejb-jar.xml hinzufügen oder eine Kombination von Annotationen und <container-transaction>-Zeilengruppen im Implementierungsdeskriptor hinzufügen.
    Sehen Sie sich das folgende Beispiel für die Definition des Transaktionsattributs einer asynchronen Methode mithilfe von Annotationen an:
    @Singleton @LocalBean
    public class FullAsyncBean {
    	@Asynchronous
    		@TransactionAttribute(REQUIRED) // Standardwert, zur Veranschaulichung angegeben
    	public void m1() {
    		// ...
    	}
    
    	@Asynchronous
    		@TransactionAttribute(NOT_SUPPORTED)
    	public void m2() {
    		// ...
    	}
    
    	@Asynchronous
    		@TransactionAttribute(REQUIRES_NEW)
    	public void m3() {
    		// ...
    	}
    
    	// ...
    }
    
    Sehen Sie sich das folgende Beispiel für die Definition des Transaktionsattributs einer asynchronen Methode mithilfe des XML-Implementierungsdeskriptors an:
      <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>
    Sehen Sie sich das folgende Beispiel für die Verwendung einer Kombination von Annotationen und XML-Implementierungsdeskriptor an, um die Transaktionsattribute einer Bean zu konfigurieren. In diesem Beispiel überschreiben die Zeilengruppen im Implementierungsdeskriptor für die Methode "m3" die Annotation auf Klassenebene. Das Ergebnis ist, dass Methode "m3" mit REQUIRES_NEW konfiguriert wird, während die Methoden "m1" und "m2" mit REQUIRED konfiguriert werden:
    @Singleton @LocalBean
    @Asynchronous
    	@TransactionAttribute(REQUIRED) // Standardwert, zur Veranschaulichung angegeben
    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>

Nächste Schritte

Fahren Sie mit der Entwicklung weiterer Komponenten für Ihre Anwendung fort, bzw., assemblieren und implementieren Sie Ihre Anwendung, falls Sie alle für Ihre Anwendung erforderlichen Komponenten erstellt haben. Weitere Informationen finden Sie im Artikel zum Assemblieren und Implementieren von EJB-Modulen.

Wenn Sie Ihre Anwendung ausführen und der erste Versuch, eine Session-Bean zu verwenden, die eine asynchrone enthält, scheitert, liegt möglicherweise ein Konfigurationsfehler vor. Suchen Sie in der Systemprotokolldatei nach Nachrichten zu Konfigurationsfehlern.

Analysieren Sie die Tracedaten, oder leiten Sie sie an die entsprechende Organisation zur Analyse weiter. Die Planung und der Aufruf asynchroner EJB-Methoden werden im EJB-Container-Trace verfolgt. Anweisungen zum Aktivieren dieses Trace finden Sie in den Informationen zum Aktivieren der Traceerstellung in einem aktiven Server. Verwenden Sie zum Analysieren von Tracedaten die Informationen zur Traceausgabe.


Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_dvamethods
Dateiname:tejb_dvamethods.html