Développement d'applications qui utilisent des zones de travail

Les applications interagissent avec le service WorkArea via l'implémentation de l'interface UserWorkArea. Cette interface définit toutes les méthodes permettant la création, la manipulation et l'achèvement de zones de travail.

Pourquoi et quand exécuter cette tâche

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;
}
Avertissement : Les applications EJB (JavaBeans) ne peuvent utiliser l'interface UserWorkArea que dans l'implémentation des méthodes de l'interface éloignée ou locale ; de même, les servlets ne peuvent utiliser l'interface que dans la méthode de service de la classe HTTPServlet. L'utilisation de zones de travail dans une méthode de cycle de vie d'un servlet ou d'un bean enterprise est considérée comme un écart par rapport au modèle de programmation de zone de travail et n'est pas prise en charge.
Le service Work Area définit les exceptions suivantes destinées à être utilisées avec l'interface UserWorkArea :
NoWorkArea
Exception émise lorsqu'une demande requiert une zone de travail associée et qu'il n'en existe aucune.
NotOriginator
Exception émise lorsqu'une demande tente de manipuler le contenu d'une zone de travail importée.
PropertyReadOnly
Exception émise lorsqu'une demande tente de modifier une propriété en lecture seule ou en lecture seule fixe.
PropertyFixed
Exception émise par la méthode remove lorsque la propriété désignée comporte un des modes fixes.

Procédure

  1. Accédez à la partition de l'une des manières suivantes :
    • Accès à la partition UserWorkArea.
    • Accès à une partition Work Area définie par l'utilisateur.
    Dans les étapes ci-dessous, la partition UserWorkArea est utilisée comme exemple. Toutefois, vous pouvez utiliser une partition définie par l'utilisateur exactement de la même manière.
  2. Début d'une nouvelle zone de travail.

    Utilisez la méthode begin pour créer une zone de travail et associer cette dernière à l'unité d'exécution appelante. La zone de travail est limitée à l'unité d'exécution qui l'a débutée et n'est pas accessible à plusieurs unités d'exécution. La méthode begin utilise une chaîne comme argument ; la chaîne sert à nommer la zone de travail. L'argument ne doit pas avoir pour valeur NULL, sinon l'exception java.lang.NullPointer est générée. Dans l'exemple de code suivant, l'application crée une zone de travail dont le nom est SimpleSampleServlet :

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

    La méthode begin sert également à créer des zones de travail imbriquées ; si une zone de travail est associée à une unité d'exécution lorsque la méthode begin est appelée, la méthode crée une zone de travail imbriquée dans la zone de travail existante.

    Le service Work Area n'utilise pas les noms associés aux zones de travail ; vous pouvez nommer les zones de travail selon la procédure de votre choix. Les noms ne doivent pas être uniques, mais l'utilité des noms pour le débogage est améliorée si les noms sont distincts et significatifs au sein de l'application. Les applications peuvent utiliser la méthode getName pour renvoyer le nom associé à une zone de travail par la méthode begin.

  3. Définition des propriétés dans la zone de travail.

    Une application comportant une zone de travail en cours peut insérer dans cette dernière des propriétés et en extraire les propriétés. L'interface UserWorkArea fournit deux méthodes set permettant la définition des propriétés, ainsi qu'une méthode get permettant l'extraction des propriétés. La méthode set à deux arguments insère la propriété avec le mode de propriété normal. La méthode set à trois arguments utilise un mode de propriété comme troisième argument. Les deux méthodes set utilisent la clé et la valeur comme arguments. La clé correspond à une chaîne et la valeur à un objet du type java.io.Serializable. Aucun des arguments ne peut avoir pour valeur NULL, sinon l'exception java.lang.NullPointer est générée.

    L'application SimpleSample ci-dessous utilise des objets appartenant à deux classes (SimpleSampleCompany et SimpleSampleProperty) comme valeurs de propriétés. La classe SimpleSampleCompany est utilisée pour l'identificateur de site et la classe SimpleSamplePriority pour la priorité.

    public class SimpleSampleServlet {
       ...
       userWorkArea.begin("SimpleSampleServlet");
    
       try {
          // Set the site-identifier (default is Main).
          userWorkArea.set("company",
             SimpleSampleCompany.Main, PropertyModeType.read_only);
    
          // Set the priority.
          userWorkArea.set("priority", SimpleSamplePriority.Silver);
       }
    
       catch (PropertyReadOnly e) {
         // The company was previously set with the read-only or
         // fixed read-only mode.
         ...
       }
    
        catch (NotOriginator e) {
         // The work area originated in another process,
         // so it can't be modified here.
         ...
       }
    
       catch (NoWorkArea e) {
          // There is no work area begun on this thread.
          ...
       }
    
       // Do application work.
       ...
    }

    La méthode get utilise la clé comme argument et renvoie un objet Java™ sérialisable comme valeur associée à la clé. Par exemple, pour extraire la valeur de la clé de société à partir de la zone de travail, l'exemple de code précédent utilise la méthode get sur la zone de travail.

    Définition des modes de propriété. La méthode set à deux arguments sur l'interface UserWorkArea utilise une clé et une valeur comme arguments et insère la propriété avec le mode de propriété par défaut de normal. Pour définir une propriété avec un mode différent, les applications doivent utiliser la méthode set à trois arguments qui fait appel à un mode de propriété comme troisième argument. Les valeurs utilisées pour demander les modes de propriété sont les suivantes :
    • Normal : PropertyModeType.normal
    • Normal fixe : PropertyModeType.fixed_normal
    • Lecture seule : PropertyModeType.read_only
    • Lecture seule fixe : PropertyModeType.fixed_readonly
  4. Gestion d'un travail local avec une zone de travail.
  5. Fin de la zone de travail.

    A la fin de l'utilisation d'une zone de travail par une application, cette dernière doit mettre fin à la zone de travail en appelant la méthode complete sur l'interface UserWorkArea. Ainsi, l'association à l'unité d'exécution appelante prend fin et la zone de travail est détruite. Si la méthode complete est appelée sur une zone de travail imbriquée, cette dernière prend fin et la zone de travail parent devient la zone de travail en cours. Si aucune zone de travail n'est associée à l'unité d'exécution appelante, l'exception NoWorkArea est créée. Toutes les zones de travail doivent être terminées et les zones de travail ne peuvent être terminées que par le processus d'origine. Par exemple, si un serveur tente d'appeler la méthode complete sur une zone de travail provenant d'un client, une exception NotOriginator est créée. Les zones de travail créées dans un processus serveur ne sont jamais propagées de nouveau à un processus client appelant.

    Avertissement : Le service Work Area utilise la transparence locale-distante totale. Même si deux beans sont déployés sur le même serveur et donc sur la même machine JVM et dans le même processus, une zone de travail créée lors d'un appel établi par une autre est terminée et le bean d'origine de la demande est toujours dans le même état après tous les appels à distance.

    L'exemple de code ci-dessous présente la fin de la zone de travail créée dans l'application cliente.

    public class SimpleSampleServlet {
       ...
       userWorkArea.begin("SimpleSampleServlet");
       userWorkArea.set("company",
           SimpleSampleCompany.Main, PropertyModeType.read_only);
       userWorkArea.set("priority", SimpleSamplePriority.Silver);
       ...
    
       // Do application work.
       ...
    
       // Terminate the work area.
       try {
          userWorkArea.complete();
       }
    
       catch (NoWorkArea e) {
          // There is no work area associated with this thread.
          ...
       }
    
       catch (NotOriginator e) {
          // The work area was imported into this process.
          ...
       }
      ...
    }

    L'exemple de code ci-dessous présente une application qui met fin à la zone de travail imbriquée qu'elle a créée auparavant lors de l'appel à distance.

    public class SimpleSampleBeanImpl implements SessionBean {
    
        public String [] test() {
          ...
    
          // Begin a nested work area.
          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");
    
          // Complete all nested work areas before returning.
          try {
            userWorkArea.complete();
          }
          catch (NoWorkArea e) {
          }
          catch (NotOriginator e) {
          }
       }
    }
    

Exemple

Types d'objet de zone de travail. Dans l'exemple ci-dessous, le client crée une zone de travail et y insère deux propriétés : un identificateur de site et un priorité. L'identificateur de site est défini sous forme de propriété en lecture seule : le client n'autorise pas les destinataires de la zone de travail à remplacer l'identificateur de site. Cette propriété est constituée de la société clé et d'une instance statique d'un objet SimpleSampleCompany. La propriété est constituée de la priorité clé et d'une instance statique d'un objet SimpleSamplePriority. Les types d'objet sont définis comme suit dans l'exemple de code ci-dessous :

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;
}

Le client établit ensuite un appel sur un objet éloigné. La zone de travail est automatiquement propagée ; aucune des méthodes de l'objet éloigné n'utilise un argument de zone de travail. A l'extrémité distante, la demande est gérée par SimpleSampleBean, puis le bean lit d'abord les propriétés d'identificateur de site et de priorité à partir de la zone de travail. Le bean tente ensuite intentionnellement d'écrire directement dans la zone de travail importée et de remplacer la propriété d'identificateur de site en lecture seule , mais cette tentative échoue.

SimpleSampleBean crée avec succès une zone de travail imbriquée dans laquelle il remplace la priorité du client, puis appelle un autre bean, SimpleSampleBackendBean. SimpleSampleBackendBean lit les propriétés de la zone de travail qui contient l'identificateur de site défini sur le client et la priorité définie dans SimpleSampleBean. Finalement, SimpleSampleBean met fin à sa zone de travail imbriquée, écrit un message basé sur la propriété d'identificateur de site, puis revient.

Utilisation du gestionnaire de partition de zone de travail. L'exemple de code ci-dessous illustre l'utilisation de l'interface de gestion de partition de zone de travail (Work Area). Il indique comment créer et extraire par programme une partition Work Area. La création à l'aide d'un programme d'une partition Work Area ne peut s'effectuer qu'à partir d'un client Java EE (Java Platform, Enterprise Edition). Pour créer une partition Work Area sur le serveur, il convient d'utiliser la console d'administration. Pour connaître les paramètres disponibles pour configurer une partition, consultez l'article Service de partition Work Area.

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;

//This sample demonstrates how to retrieve an instance of the 
//WorkAreaPartitionManager implementation and how to use that
//instance to create a WorkArea partition and retrieve a partition.  
//NOTE: Creating a partition in the way listed is only available 
//on a J2EE client.  To create a partition on the server use the 
//WebSphere administrative console.  Retrieving a WorkArea
//partition is performed in the same way on both client and server.

public class Example {

     //The name of the partition to create/retrieve
     String partitionName = "myPartitionName";
     //The name in java naming the WorkAreaPartitionManager instance is bound to
     String jndiName = "java:comp/websphere/WorkAreaPartitionManager";

     //On a J2EE client a user would create a partition as follows:
     public UserWorkArea myCreate(){
         //Variable to hold our WorkAreaPartitionManager reference
         WorkAreaPartitionManager partitionManager = null;
         //Get an instance of the WorkAreaPartitionManager implementation
         try {
             InitialContext initialContext = new InitialContext();
             partitionManager = (WorkAreaPartitionManager) initialContext.lookup(jndiName);
         } catch (Exception e) {  }

         //Set the properties to configure our WorkArea partition
         Properties props = new Properties();
         props.put("maxSendSize","12345");
         props.put("maxReceiveSize","54321");
         props.put("Bidirectional","true");
  			 props.put("DeferredAttributeSerialization","true");

         //Variable used to hold the newly created WorkArea Partition
         UserWorkArea myPartition = null;

         try{
             //This is the way to create a partition on the J2EE client.  Use the
             //WebSphere Administrative Console to create a WorkArea Partition
             //on the server.
             myPartition = partitionManager.createWorkAreaPartition(partitionName,props);
         }
         catch (PartitionAlreadyExistsException e){  }
         catch (IllegalAccessException e){  }

         return myPartition;
     }

     //. . . .

     //In order to retrieve a WorkArea partition at some time later or 
     //from some other class, do the following (from client or server):
     public UserWorkArea myGet(){
         //Variable to hold our WorkAreaPartitionManager reference
         WorkAreaPartitionManager partitionManager = null;
         //Get an instance of the WorkAreaPartitionManager implementation
         try {
             InitialContext initialContext = new InitialContext();
             partitionManager = (WorkAreaPartitionManager) initialContext.lookup(jndiName);
         } catch (Exception e) {  }

         //Variable used to hold the retrieved WorkArea partition
         UserWorkArea myPartition = null;
         try{
             myPartition = partitionManager.getWorkAreaPartition(partitionName);
         }catch(NoSuchPartitionException e){  }

         return myPartition;
     }
}

Que faire ensuite

Pour plus d'informations sur Work Area, voir le package com.ibm.websphere.Fiworkarea dans la documentation sur les API. La documentation sur les API générées est disponible dans la table des matières du centre de documentation, sous Référence > APIs - Application programming interfaces.


Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twa_develop
Nom du fichier : twa_develop.html