Desarrollo de aplicaciones que utilicen áreas de trabajo

Las aplicaciones interactúan con el servicio de área de trabajo implementando la interfaz UserWorkArea. Esta interfaz define todos los métodos utilizados para crear, manipular y terminar áreas de trabajo.

Acerca de esta tarea

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;
}
Atención: Las aplicaciones EJB (Enterprise JavaBeans) sólo pueden utilizar la interfaz UserWorkArea en la implementación de métodos en la interfaz remota y/o local; de la misma forma, los servlets sólo pueden utilizar la interfaz en el método de servicio de la clase HTTPServlet. El uso de áreas de trabajo dentro de cualquier método de ciclo de vida de un servlet o enterprise bean se considera una desviación del modelo de programación del área de trabajo y no tiene soporte.
El servicio de área de trabajo define las excepciones siguientes para utilizarlas con la interfaz UserWorkArea:
NoWorkArea
Se genera cuando una solicitud necesita un área de trabajo asociada pero no existe ninguna.
NotOriginator
Se genera cuando una solicitud intenta manipular el contenido de un área de trabajo importada.
PropertyReadOnly
Se genera cuando una solicitud intenta modificar una propiedad read-only o fixed read-only.
PropertyFixed
La genera el método remove cuando la propiedad designada tiene una de las modalidades fixed.

Procedimiento

  1. Acceda a una partición mediante una de estas acciones:
    • Acceso a la partición UserWorkArea, para acceder a la partición UserWorkArea.
    • Acceso a una partición de área de trabajo definida por el usuario, para acceder a un área de trabajo.
    En los pasos siguientes se utiliza la partición UserWorkArea como ejemplo; aunque se puede utilizar una partición definida por el usuario del mismo modo.
  2. Comenzar una área de trabajo nueva.

    Utilice el método begin para crear un área de trabajo nueva y asociarla a la hebra de llamada. Un área de trabajo tiene el ámbito de la hebra que ha iniciado el área de trabajo y no pueden acceder a él varias hebras. El método begin acepta como argumento una serie de caracteres; la serie se utiliza para dar nombre al área de trabajo. El argumento no debe ser null, lo que produciría que se lance la excepción java.lang.NullPointer. En el código de ejemplo siguiente, la aplicación comienza un área de trabajo nueva con el nombre SimpleSampleServlet:

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

    El método begin también se utiliza para crear áreas de trabajo anidadas; si se asocia un área de trabajo a la hebra cuando se invoca el método begin, el método crea un área de trabajo nueva anidada dentro del área de trabajo existente.

    El servicio de área de trabajo no utiliza los nombres asociados a las áreas de trabajo; se puede poner nombres a las áreas de trabajo de la forma que se quiera. No es necesario que los nombres sean exclusivos, pero la utilidad de los nombres es clara cuando se depura una aplicación, si los nombres asignados son distintos y significativos. Las aplicaciones pueden utilizar el método getName para devolver el nombre asociado al área de trabajo por el método begin.

  3. Establecer las propiedades en el área de trabajo.

    Una aplicación con un área de trabajo actual puede insertar propiedades en el área de trabajo y recuperar las propiedades del área de trabajo. La interfaz UserWorkArea proporciona dos métodos set para el establecimiento de propiedades y un método get para la recuperación de propiedades. El método set de dos argumentos inserta la con la modalidad "normal". El método set de tres argumentos acepta como tercer argumento una modalidad de propiedad. Los dos métodos set aceptan como argumentos la clave y el valor. La clave es una serie (String); el valor es un objeto de tipo java.io.Serializable. Ninguno de los argumentos puede ser null, lo que haría que se lanzara la excepción java.lang.NullPointer.

    La aplicación SimpleSample siguiente utiliza objetos de dos clases, SimpleSampleCompany y SimpleSampleProperty, como valores para las propiedades. La clase SimpleSampleCompany la utiliza el identificador de sitio (site identifier) y la clase SimpleSamplePriority se utiliza para la prioridad.

    public class SimpleSampleServlet {
       ...
       userWorkArea.begin("SimpleSampleServlet");
    
       try {
          // Establecer site-identifier -identificador de sitio- (el valor predeterminado es Main).
          userWorkArea.set("company",
             SimpleSampleCompany.Main, PropertyModeType.read_only);
    
          // Establecer la prioridad.
          userWorkArea.set("priority", SimpleSamplePriority.Silver);
       }
    
       catch (PropertyReadOnly e) {
         // La empresa (company) se ha establecido anteriormente con la modalidad read-only o
         // read-only fija.
         ...
       }
    
        catch (NotOriginator e) {
         // El área de trabajo se originó en otro proceso,
         // por lo que no se puede modificar aquí.
         ...
       }
    
       catch (NoWorkArea e) {
          // No hay área de trabajo que se haya iniciado en esta hebra.
          ...
       }
    
       // Hacer el trabajo de la aplicación.
       ...
    }

    El método get acepta como argumento la clave, y devuelve un objeto Serializable Java™ como valor asociado a la clave. Por ejemplo, para recuperar el valor de la clave de empresa (company) desde el área de trabajo, el código de ejemplo anterior utiliza el método get sobre el área de trabajo para recuperar dicho valor.

    Establecimiento de modalidades de propiedad. El método set de dos argumentos de la interfaz UserWorkArea acepta como argumentos una clave y un valor e inserta la propiedad con la modalidad de propiedad predeterminada "normal". Para establecer una propiedad con una modalidad distinta, las aplicaciones deben utilizar el método set de tres argumentos, que acepta como tercer argumento una modalidad de propiedad. Los valores utilizados para solicitar las modalidades de propiedad son como siguen:
    • Normal: PropertyModeType.normal
    • Fixed normal: PropertyModeType.fixed_normal
    • Read-only: PropertyModeType.read_only
    • Fixed read-only: PropertyModeType.fixed_readonly
  4. Gestione un área local con un área de trabajo.
  5. Complete el área de trabajo.

    Una vez que una aplicación ha terminado de utilizar un área de trabajo, debe completarla mediante la invocación del método complete en la interfaz UserWorkArea. Así se termina la asociación con la hebra llamante y destruye el área de trabajo. Si se invoca el método complete en un área de trabajo anidada, se termina el área anidada y su área de trabajo padre pasa a ser el área de trabajo activa. Si no hay área de trabajo asociada a la hebra llamante, se genera una excepción NoWorkArea. Todas las áreas de trabajo deben ser completadas, y ha de hacerse sólo desde el proceso que las originó. Por ejemplo, si un servidor intenta llamar al método complete sobre un área de trabajo originada en un cliente, se genera la excepción NottOriginator. Las áreas de trabajo creadas en un proceso servidor nunca se propagan de vuelta a un proceso cliente que se invoca.

    Atención: El servicio de área de trabajo precisa de transparencia total entre local-remoto. Incluso si dos beans se despliegan en el mismo servidor y, por lo tanto, el mismo JVM y proceso, se comienza un área de trabajo en una invocación desde otra completada y el bean en que se ha originado la solicitud siempre está en el mismo estado tras cualquier llamada remota.

    El código de ejemplo siguiente muestra la terminación del área de trabajo creada en la aplicación cliente.

    public class SimpleSampleServlet {
       ...
       userWorkArea.begin("SimpleSampleServlet");
       userWorkArea.set("company",
           SimpleSampleCompany.Main, PropertyModeType.read_only);
       userWorkArea.set("priority", SimpleSamplePriority.Silver);
       ...
    
       // Hacer el trabajo de la aplicación.
       ...
    
       // Terminar el área de trabajo.
       try {
          userWorkArea.complete();
       }
    
       catch (NoWorkArea e) {
          // No hay área de trabajo asociada a esta hebra.
          ...
       }
    
       catch (NotOriginator e) {
          // El área de trabajo asociada se ha importado en este proceso.
          ...
       }
      ...
    }

    El ejemplo de código siguiente muestra la aplicación de ejemplo que completa el área de trabajo anidada que ha creado anteriormente en la invocación remota.

    public class SimpleSampleBeanImpl implements SessionBean {
    
        public String [] test() {
          ...
    
          // Comenzar un área de trabajo anidada.       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");
    
          // Completar todas las áreas de trabajo anidadas antes de devolver el control.
          try {
            userWorkArea.complete();
          }
          catch (NoWorkArea e) {
          }
          catch (NotOriginator e) {
          }
       }
    }
    

Ejemplo

Tipos de objeto de área de trabajo. En el ejemplo siguiente, el cliente crea un área de trabajo e inserta en ella dos propiedades: site identifier y priority (identificador de sitio y prioridad). site-identifier se establece como propiedad read-only; el cliente no permite a los destinatarios del área de trabajo que alteren temporalmente el identificador de sitio. Esta propiedad está compuesta por la empresa (company) clave y una instancia estática de un objeto SimpleSampleCompany. La propiedad priority está compuesta por la prioridad de clave y una instancia estática de un objeto SimpleSamplePriority. Los tipos de objetos están definidos según se muestra en el código de ejemplo siguiente:

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

El cliente realiza entonces la invocación de un objeto remoto. El área de trabajo se propaga automáticamente; ninguno de los métodos del objeto remoto acepta un argumento área de trabajo. En el lado remoto, la solicitud la maneja primero SimpleSampleBean; el bean lee primero las propiedades site identifier y priority (identificador de sitio y prioridad) del área de trabajo. A continuación y de forma intencionada, el bean intenta -y obtiene un error- grabar directamente en el área de trabajo importada y también alterar temporalmente la propiedad site-identifier que es read-only (de sólo lectura).

SimpleSampleBean comienza correctamente un área de trabajo anidada, en la que altera temporalmente la prioridad del cliente y luego llama a otro bean, SimpleSampleBackendBean. SimpleSampleBackendBean lee las propiedades del área de trabajo, que contienen el identificador de sitio (site identifier) establecido en el cliente y la prioridad (priority) establecida en SimpleSampleBean. Finalmente, SimpleSampleBean completa su área de trabajo anidada, graba un mensaje que utiliza la propiedad site-identifier, y devuelve el control.

Utilización del gestor de particiones de área de trabajo. El siguiente ejemplo de código ilustra el uso de la interfaz de gestor de particiones de área de trabajo. El ejemplo ilustra cómo crear y recuperar una partición de área de trabajo mediante programación. Tenga en cuenta que la creación mediante programación de una partición de área de trabajo sólo está disponible en el cliente Java Platform, Enterprise Edition (Java EE). Para crear una partición de área de trabajo en el servidor, se debe utilizar la consola administrativa. Consulte el artículo del Servicio de partición de área de trabajo para conocer los parámetros de configuración disponibles para configurar una partición.

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;

//Este ejemplo demuestra cómo recuperar una instancia de la
//implementación de WorkAreaPartitionManager y cómo utilizar esa
//instancia para crear una partición de área de trabajo y recuperar una partición.
//NOTA: la creación de una partición del modo que se muestra más abajo sólo está disponible
//en un cliente J2EE. Para crear una partición en el servidor, utilice la
//consola administrativa de WebSphere. La recuperación de una partición de área de
//trabajo se efectúa de la misma manera tanto en el cliente como en el servidor.

public class Example {

     //Nombre de la partición que deber crearse/recuperarse
     String partitionName = "myPartitionName";
     //Nombre en denominación java al que está vinculada la instancia de WorkAreaPartitionManager
     String jndiName = "java:comp/websphere/WorkAreaPartitionManager";

     //En un cliente J2EE un usuario crearía una partición del modo siguiente:
     public UserWorkArea myCreate(){
         //Variable que ostenta nuestra referencia WorkAreaPartitionManager
         WorkAreaPartitionManager partitionManager = null;
         //Obtiene una instancia de la implementación de WorkAreaPartitionManager
         try {
             InitialContext initialContext = new InitialContext();
             partitionManager = (WorkAreaPartitionManager) initialContext.lookup(jndiName);
         } catch (Exception e) {  }

         //Establece las propiedades para configurar nuestra partición de área de trabajo
         Properties props = new Properties();
         props.put("maxSendSize","12345");
         props.put("maxReceiveSize","54321");
         props.put("Bidirectional","true");
  			 			 props.put("DeferredAttributeSerialization","true");

         //Variable que se utiliza para ostentar la partición de área de trabajo recién creada
         UserWorkArea myPartition = null;

         try{
             //Así se crea una partición en el cliente J2EE. Utilice la
             //Consola administrativa de WebSphere para crear una partición
             //de área de trabajo en el servidor.
             myPartition = partitionManager.createWorkAreaPartition(partitionName,props);
         }
         catch (PartitionAlreadyExistsException e){  }
         catch (IllegalAccessException e){  }

         return myPartition;
     }

     //. . . .

     //Para recuperar una partición de área de trabajo más adelante o
     //de otra clase, haga lo siguiente (desde el cliente o el servidor):
     public UserWorkArea myGet(){
         //Variable que ostenta nuestra referencia WorkAreaPartitionManager
         WorkAreaPartitionManager partitionManager = null;
         //Obtiene una instancia de la implementación de WorkAreaPartitionManager
         try {
             InitialContext initialContext = new InitialContext();
             partitionManager = (WorkAreaPartitionManager) initialContext.lookup(jndiName);
         } catch (Exception e) {  }

         //Variable que se utiliza para ostentar la partición de área de trabajo recuperada
         UserWorkArea myPartition = null;
         try{
             myPartition = partitionManager.getWorkAreaPartition(partitionName);
         }catch(NoSuchPartitionException e){  }

         return myPartition;
     }
}

Qué hacer a continuación

Para obtener información adicional sobre el área de trabajo, consulte el paquete com.ibm.websphere.workarea en la API. La documentación de la API generada está disponible en la tabla de contenido del centro de información en la vía de acceso Referencia > API - Interfaces de programación de aplicaciones.


Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twa_develop
File name: twa_develop.html