Anwendungen für die Verwendung von Arbeitsbereichen entwickeln

Anwendungen interagieren mit dem Arbeitsbereichsservice durch die Implementierung der Schnittstelle "UserWorkArea". Diese Schnittstelle definiert alle Methoden, die zum Erstellen, Bearbeiten und Beenden von Arbeitsbereichen verwendet werden.

Informationen zu diesem Vorgang

package com.ibm.websphere.workarea;

public interface UserWorkArea {
   void begin(String name);
   void complete() throws NoWorkArea, NotOriginator;

   String getName();
   String[] retrieveAllKeys();
   void set(String key, java.io.Serializable value)
      throws NoWorkArea, NotOriginator, PropertyReadOnly;
   void set(String key, java.io.Serializable value, PropertyModeType mode)
      throws NoWorkArea, NotOriginator, PropertyReadOnly;
   java.io.Serializable get(String key);
   PropertyModeType getMode(String key);
   void remove(String key)
      throws NoWorkArea, NotOriginator, PropertyFixed;
}
Achtung: EJB-Anwendungen (Enterprise JavaBeans) können die Schnittstelle "UserWorkArea" nur innerhalb der Implementierung von Methoden in der fernen und/oder der lokalen Schnittstelle verwenden. In ähnlicher Weise können Servlets die Schnittstelle nur innerhalb der Servicemethode der Klasse "HTTPServlet" verwenden. Die Verwendung von Arbeitsbereichen innerhalb einer Lifecycle-Methode eines Servlets oder einer Enterprise-Bean wird als Abweichung vom Programmiermodell des Arbeitsbereichs betrachtet und nicht unterstützt.
Der Arbeitsbereichsservice definiert die folgenden Ausnahmen zur Verwendung mit der Schnittstelle "UserWorkArea":
NoWorkArea
Diese Ausnahme wird ausgelöst, wenn für eine Anforderung ein zugeordneter Arbeitsbereich erforderlich ist, aber keiner vorhanden ist.
NotOriginator
Diese Ausnahme wird zurückgegeben, wenn eine Anforderung versucht, den Inhalt des importierten Arbeitsbereichs zu ändern.
PropertyReadOnly
Diese Ausnahme wird zurückgegeben, wenn eine Anforderung versucht, eine Eigenschaft mit dem Modus "Read-only" oder "Fixed read-only" zu ändern.
PropertyFixed
Diese Ausnahme wird von der Methode "Remove" zurückgegeben, wenn der angegebenen Eigenschaft ein Fixed-Modus zugeordnet ist.

Vorgehensweise

  1. Sie haben zwei Möglichkeiten, auf eine Partition zuzugreifen:
    • Zugriff auf die UserWorkArea-Partition
    • Zugriff auf eine benutzerdefinierte Arbeitsbereichspartition, um auf einen benutzerdefinierten Arbeitsbereich zuzugreifen
    In den folgenden Schritten wird die Verwendung der UserWorkArea-Partition veranschaulicht; eine benutzerdefinierte Partition kann jedoch auf exakt dieselbe Weise verwendet werden.
  2. Beginnen Sie einen neuen Arbeitsbereich.

    Erstellen Sie mit der Methode "begin" einen neuen Arbeitsbereich und ordnen Sie ihn dem aufrufenden Thread zu. Ein Arbeitsbereich ist dem Thread zugeordnet, der ihn aufgerufen hat, und kann nicht von mehreren Threads verwendet werden. Die Methode "begin" verwendet eine Zeichenfolge als Argument. Die Zeichenfolge wird als Name für den Arbeitsbereich verwendet. Das Argument darf nicht null sein, da andernfalls die Ausnahme "java.lang.NullPointer" zurückgegeben wird. Im folgenden Codebeispiel beginnt die Anwendung einen neuen Arbeitsbereich mit dem Namen "SimpleSampleServlet":

    public class SimpleSampleServlet {
    ...
       try {
          ...
          userWorkArea = (UserWorkArea)jndi.lookup(
             "java:comp/websphere/UserWorkArea");
       }
       ...
    
       userWorkArea.begin("SimpleSampleServlet");
       ...
    }

    Die Methode "begin" wird auch zum Erstellen verschachtelter Arbeitsbereiche verwendet. Ist beim Aufruf der Methode "begin" ein Arbeitsbereich einem Thread zugeordnet, dann erstellt die Methode einen neuen Arbeitsbereich, der im vorhandenen Arbeitsbereich verschachtelt wird.

    Die den Arbeitsbereichen zugeordneten Namen werden vom Arbeitsbereichsservice nicht verwendet. Sie können für die Arbeitsbereiche beliebige Namen festlegen. Die Namen müssen nicht eindeutig sein, das Debug wird aber erleichtert, wenn Sie innerhalb der Anwendung eindeutige und sinnvolle Namen verwenden. Anwendungen können mit der Methode "getName" den Namen abrufen, der einem Arbeitsbereich mit der Methode "begin" zugeordnet wurde.

  3. Legen Sie Eigenschaften im Arbeitsbereich fest.

    Eine Anwendung mit einem aktuellen Arbeitsbereich kann Eigenschaften in den Arbeitsbereich einfügen und Eigenschaften aus dem Arbeitsbereich abrufen. Die Schnittstelle "UserWorkArea" stellt zwei Setter-Methoden bereit, um Eigenschaften festzulegen, sowie eine Getter-Methode, mit der Eigenschaften abgerufen werden können. Die Methode "set" mit zwei Argumenten fügt die Eigenschaft mit dem Eigenschaftsmodus "Normal" zum Arbeitsbereich hinzu. Die Methode "set" mit drei Argumenten verwendet den Eigenschaftsmodus als drittes Argument Beide Setter-Methoden verwenden den Schlüssel und den Wert als Argumente. Der Schlüssel ist eine Zeichenfolge. Der Wert ist ein Objekt des Typs "java.io.Serializable". Keines der Argumente darf null sein, weil andernfalls die Ausnahme "java.lang.NullPointer" zurückgegeben wird.

    Die folgende Anwendung "SimpleSample" verwendet Objekte aus zwei Klassen (Klasse "SimpleSampleCompany" und Klasse "SimpleSampleProperty") als Werte für Eigenschaften. Die Klasse "SimpleSampleCompany" wird zur Identifizierung der Site verwendet und die Klasse "SimpleSamplePriority" für die Priorität.

    public class SimpleSampleServlet {
       ...
       userWorkArea.begin("SimpleSampleServlet");
    
       try {
          // Site festlegen (Standardwert ist Main).
          userWorkArea.set("company",
             SimpleSampleCompany.Main, PropertyModeType.read_only);
    
          // Priorität festlegen.
          userWorkArea.set("priority", SimpleSamplePriority.Silver);
       }
    
       catch (PropertyReadOnly e) {
         // Das Unternehmen (company) wurde mit dem Modus "Read-only"
         // oder "Fixed read-only" definiert.
         ...
       }
    
        catch (NotOriginator e) {
         // Der Arbeitsbereich wurde in einem anderen Prozess begonnen
         // und kann daher nicht hier geändert werden.
         ...
       }
    
       catch (NoWorkArea e) {
          // Für diesen Thread wurde kein Arbeitsbereich begonnen.
          ...
       }
    
       // Die Anwendungsarbeit ausführen.
       ...
    }

    Die Methode get verwendet den Schlüssel als Argument und gibt ein serialisierbares Java-Objekt (Java™ Serializable) als zugehörigen Wert für den Schlüssel zurück. Um beispielsweise den Wert des Schlüssels "company" aus dem Arbeitsbereich abzurufen, verwendet das obige Codebeispiel die Methode "get" für den Arbeitsbereich.

    Modi für Eigenschaften festlegen. Die Methode "set" mit zwei Argumenten der Schnittstelle "UserWorkArea" verwendet einen Schlüssel und einen Wert als Argumente und fügt die Eigenschaft mit dem Standardeigenschaftsmodus "Normal" ein. Zum Festlegen einer Eigenschaft mit einem anderen Modus müssen Anwendungen die Methode "set" mit drei Argumenten verwenden, die einen Eigenschaftsmodus als drittes Argument verwendet. Folgende Werte werden zum Anfordern der Eigenschaftsmodi verwendet:
    • Normal: PropertyModeType.normal
    • Fixed normal: PropertyModeType.fixed_normal
    • Read-only: PropertyModeType.read_only
    • Fixed read-only: PropertyModeType.fixed_readonly
  4. Verwalten Sie lokale Arbeiten mit einem Arbeitsbereich.
  5. Beenden Sie den Arbeitsbereich.

    Wenn eine Anwendung einen Arbeitsbereich nicht mehr benötigt, muss sie den Arbeitsbereich durch Aufrufen der Methode "complete" in der Schnittstelle "UserWorkArea" beenden. Dadurch wird die Zuordnung zum aufrufenden Thread beendet und der Arbeitsbereich wird gelöscht. Wird die Methode "complete()" für einen verschachtelten Arbeitsbereich aufgerufen, dann wird der verschachtelte Arbeitsbereich beendet, und der übergeordnete Arbeitsbereich wird zum aktuellen Arbeitsbereich. Falls dem aufrufenden Thread kein Arbeitsbereich zugeordnet ist, wird die Ausnahme "NoWorkArea" ausgelöst. Jeder Arbeitsbereich muss beendet werden, und jeder Arbeitsbereich kann nur von dem Prozess beendet werden, von dem er erstellt wurde. Wenn ein Server beispielsweise die Methode "complete" für einen Arbeitsbereich aufruft, der in einem Client erstellt wurde, wird die Ausnahme "NotOriginator" ausgelöst. Arbeitsbereiche, die in einem Serverprozess erstellt wurden, werden niemals an den aufrufenden Clientprozess weitergegeben.

    Achtung: Der Arbeitsbereichsservice fordert eine vollständige lokal-ferne Transparenz. Selbst wenn zwei Beans in demselben Server eingesetzt werden, und daher dieselbe JVM und derselbe Prozess verwendet werden, wird ein Arbeitsbereich, der aufgrund eines Aufrufs aus einem anderen Arbeitsbereich begonnen wurde, beendet, und die Bean, die die Anforderung stellte, befindet sich nach jedem fernen Aufruf immer in demselben Status.

    Das folgende Codebeispiel zeigt die Beendigung eines Arbeitsbereichs, der in der Clientanwendung erstellt wurde.

    public class SimpleSampleServlet {
       ...
       userWorkArea.begin("SimpleSampleServlet");
       userWorkArea.set("company",
           SimpleSampleCompany.Main, PropertyModeType.read_only);
       userWorkArea.set("priority", SimpleSamplePriority.Silver);
       ...
    
       // Die Anwendungsarbeit ausführen.
       ...
    
       // Beenden Sie den Arbeitsbereich.
       try {
          userWorkArea.complete();
       }
    
       catch (NoWorkArea e) {
          // Diesem Thread ist kein Arbeitsbereich zugeordnet.
          ...
       }
    
       catch (NotOriginator e) {
          // Der Arbeitsbereich wurde in diesen Prozess importiert.
          ...
       }
      ...
    }

    Das folgende Codebeispiel zeigt, wie die Beispielanwendung den verschachtelten Arbeitsbereich beendet, den sie früher im fernen Aufruf erstellt hat.

    public class SimpleSampleBeanImpl implements SessionBean {
    
        public String [] test() {
          ...
    
          // Einen verschachtelten Arbeitsbereich beginnen.
          userWorkArea.begin("SimpleSampleBean");
          try {
            userWorkArea.set("company",
                             SimpleSampleCompany.London_Development);
          }
          catch (NotOriginator e) {
          }
    
          SimpleSampleCompany company =
             (SimpleSampleCompany) userWorkArea.get("company");
          SimpleSamplePriority priority =
             (SimpleSamplePriority) userWorkArea.get("priority");
    
          // Vor Rückkehr alle verschachtelten Arbeitsbereiche beenden.
          try {
            userWorkArea.complete();
          }
          catch (NoWorkArea e) {
          }
          catch (NotOriginator e) {
          }
       }
    }
    

Beispiel

Arbeitsbereichsobjekttypen. Im folgenden Beispiel erstellt der Client einen Arbeitsbereich und fügt zwei Eigenschaften zum Arbeitsbereich hinzu: eine Eigenschaft zur Siteidentifizierung und eine Prioritätseigenschaft. Die Site-Angabe wird als schreibgeschützte Eigenschaft (nur Lesezugriff) festgelegt, d. h., der Client erlaubt es den Empfängern des Arbeitsbereichs nicht, diese Site-Angabe zu überschreiben. Diese Eigenschaft besteht aus dem Schlüssel "company" und aus einer statischen Instanz des Objekts SimpleSampleCompany. Die Prioritätseigenschaft besteht aus der Priorität des Schlüssels und aus einer statischen Instanz des Objekts SimpleSamplePriority. Die Objekttypen sind wie im folgenden Codebeispiel definiert:

public static final class SimpleSampleCompany {
   public static final SimpleSampleCompany Main;
   public static final SimpleSampleCompany NewYork_Sales;
   public static final SimpleSampleCompany NewYork_Development;
   public static final SimpleSampleCompany London_Sales;
   public static final SimpleSampleCompany London_Development;
}

public static final class SimpleSamplePriority {
   public static final SimpleSamplePriority Platinum;
   public static final SimpleSamplePriority Gold;
   public static final SimpleSamplePriority Silver;
   public static final SimpleSamplePriority Bronze;
   public static final SimpleSamplePriority Tin;
}

Anschließend ruft der Client ein fernes Objekt auf. Der Arbeitsbereich wird automatisch weitergegeben. Keine der Methoden des fernen Objekts verwendet ein Arbeitsbereichsargument. Auf der fernen Seite wird die Anforderung zunächst von der SimpleSampleBean bearbeitet. Die Bean liest die Eigenschaften zur Site-Identifizierung und Priorität aus dem Arbeitsbereich. Anschließend versucht die Bean gezielt, direkt in den importierten Arbeitsbereich zu schreiben und die schreibgeschützte Eigenschaft zur Site-Identifizierung zu überschreiben.

Die SimpleSampleBean beginnt erfolgreich einen verschachtelten Arbeitsbereich, in dem sie die Priorität des Clients überschreibt, und ruft dann eine andere Bean auf, die SimpleSampleBackendBean. Die SimpleSampleBackendBean liest die Eigenschaften aus dem Arbeitsbereich, die auch die im Client festgelegte Eigenschaft zur Site-Identifizierung und die in der SimpleSampleBean festgelegte Priorität umfassen. Schließlich beendet die SimpleSampleBean ihren verschachtelten Arbeitsbereich und schreibt auf der Basis der Eigenschaft zur Site-Identifizierung eine Nachricht. Anschließend wird die Bean zurückgegeben.

Work Area Partition Manager verwenden. Das nachfolgende Codebeispiel veranschaulicht die Verwendung der Schnittstelle des Work Area Partition Manager. Das Beispiel veranschaulicht, wie eine Arbeitsbereichspartition über das Programm erstellt und abgerufen wird. Beachten Sie, dass die programmgesteuerte Erstellung einer Arbeitsbereichspartition nur im Java-EE-Client (Java Platform, Enterprise Edition) unterstützt wird. Wenn Sie auf dem Server eine Arbeitsbereichspartition erstellen möchten, müssen Sie die Administrationskonsole verwenden. Im Artikel zum Service für Arbeitsbereichspartitionen finden Sie Informationen zu den Konfigurationsparametern für die Konfiguration einer Partition.

import com.ibm.websphere.workarea.WorkAreaPartitionManager;
import com.ibm.websphere.workarea.UserWorkArea;
import com.ibm.websphere.workarea.PartitionAlreadyExistsException;
import com.ibm.websphere.workarea.NoSuchPartitionException;
import java.lang.IllegalAccessError;
import java.util.Properties;
import javax.naming.InitialContext;

//Dieses Beispiel veranschaulicht, wie eine Instanz der
//WorkAreaPartitionManager-Implementierung abgerufen und zum Erstellen
//einer WorkArea-Partition sowie zum Abrufen einer Partition verwendet wird.
//ANMERKUNG: Das Erstellen einer Partition wie unten dargestellt, ist nur
//auf einem J2EE-Client möglich. Verwenden Sie, um eine Partition serverseitig
//zu erstellen, die WebSphere-Administrationskonsole. Das Abrufen einer
//WorkArea-Partition verläuft auf Client und Server gleich.

public class Example {

     //Der Name der Partition, die erstellt/abgerufen werden soll
     String partitionName = "myPartitionName";
     //Der Name in Java Naming, an den die WorkAreaPartitionManager-Instanz gebunden ist
     String jndiName = "java:comp/websphere/WorkAreaPartitionManager";

     //Auf einem J2EE-Client erstellt ein Benutzer eine Partition wie folgt:
     public UserWorkArea myCreate(){
         //Variable zur Angabe der WorkAreaPartitionManager-Referenz
         WorkAreaPartitionManager partitionManager = null;
         //Instanz der WorkAreaPartitionManager-Implementierung abrufen
         try {
             InitialContext initialContext = new InitialContext();
             partitionManager = (WorkAreaPartitionManager) initialContext.lookup(jndiName);
         } catch (Exception e) {  }

         //Die Eigenschaften für die Konfiguration der Arbeitsbereichspartition festlegen
         Properties props = new Properties();
         props.put("maxSendSize","12345");
         props.put("maxReceiveSize","54321");
         props.put("Bidirectional","true");
  			 			 props.put("DeferredAttributeSerialization","true");

         //Variable zur Angabe der neu erstellten WorkArea-Partition
         UserWorkArea myPartition = null;

         try{
             //Auf diese Weise wird eine Partition auf dem J2EE-Client erstellt. Verwenden
             //Sie die WebSphere-Administrationskonsole, um eine WorkArea-Partition
             //auf dem Server zu erstellen.
             myPartition = partitionManager.createWorkAreaPartition(partitionName,props);
         }
         catch (PartitionAlreadyExistsException e){  }
         catch (IllegalAccessException e){  }

         return myPartition;
     }

     //. . . .

     //Wenn Sie eine WorkArea-Partition zu einem späteren Zeitpunkt oder von einer
     //anderen Klasse abrufen möchten, gehen Sie wie folgt vor (auf Client oder Server):
     public UserWorkArea myGet(){
         //Variable zur Angabe der WorkAreaPartitionManager-Referenz
         WorkAreaPartitionManager partitionManager = null;
         //Instanz der WorkAreaPartitionManager-Implementierung abrufen
         try {
             InitialContext initialContext = new InitialContext();
             partitionManager = (WorkAreaPartitionManager) initialContext.lookup(jndiName);
         } catch (Exception e) {  }

         //Variable zur Angabe der abgerufenen WorkArea-Partition
         UserWorkArea myPartition = null;
         try{
             myPartition = partitionManager.getWorkAreaPartition(partitionName);
         }catch(NoSuchPartitionException e){  }

         return myPartition;
     }
}

Nächste Schritte

Weitere Informationen zum Arbeitsbereich finden Sie im Paket "com.ibm.websphere.workarea" in der API-Dokumentation. Sie finden die generierte API-Dokumentation im Inhaltsverzeichnis des Information Center unter Referenz > APIs - Anwendungsprogrammierschnittstellen.


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=twa_develop
Dateiname:twa_develop.html