Desenvolvendo Aplicativos que Utilizam Áreas de Trabalho

Os aplicativos interagem com o serviço de área de trabalho implementando a interface UserWorkArea. Esta interface define todos os métodos usados para criar, manipular e finalizar áreas de trabalho.

Sobre Esta Tarefa

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;
}
Atenção: Os aplicativos EJB (Enterprise JavaBeans) podem utilizar a interface UserWorkArea apenas na implementação de métodos na interface remota ou local ou ambas; do mesmo modo, os servlets podem utilizar a interface apenas no método de serviço da classe HTTPServlet. A utilização de áreas de trabalho dentro de qualquer método de ciclo de vida de um servlet ou enterprise bean é considerada um desvio do modelo de programação de área de trabalho e não é suportada.
O serviço de área de trabalho define as seguintes exceções para utilização com a interface UserWorkArea:
NoWorkArea
Emitida quando um pedido requer uma área de trabalho associada, mas nenhuma está presente.
NotOriginator
Emitida quando um pedido tenta manipular o conteúdo de uma área de trabalho importada.
PropertyReadOnly
Emitida quando um pedido tenta modificar uma propriedade somente leitura ou somente leitura fixa.
PropertyFixed
Emitida pelo método de remoção quando a propriedade designada possui um dos modos fixos.

Procedimento

  1. Acesse uma partição por uma das opções a seguir:
    • Acessando a partição UserWorkArea, para acessar a partição UserWorkArea.
    • Acessando uma partição da área de trabalho definida pelo usuário, para acessar uma área de trabalho definida pelo usuário.
    As etapas a seguir usam a partição UserWorkArea como um exemplo; no entanto, é possível usar uma partição definida pelo usuário da mesma maneira.
  2. Inicie uma nova área de trabalho.

    Utilize o método begin para criar uma nova área de trabalho e associá-la ao encadeamento de chamada. Uma área de trabalho tem seu escopo definido para o encadeamento que iniciou a área de trabalho e não é acessível por vários encadeamentos. O método begin utiliza uma cadeia como um argumento; a cadeia é utilizada para nomear a área de trabalho. O argumento não deve ser nulo, o que causa a emissão da exceção java.lang.NullPointer. No exemplo de código a seguir, o aplicativo começa uma nova área de trabalho com o nome SimpleSampleServlet:

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

    O método begin também é utilizado para criar áreas de trabalho aninhadas; se uma área de trabalho estiver associada a um encadeamento quando o método begin for chamado, o método criará uma nova área de trabalho aninhada na área de trabalho existente.

    O serviço de área de trabalho não utiliza os nomes associados a áreas de trabalho; você pode nomear as áreas de trabalho como desejar. Os nomes não precisam ser exclusivos, mas o aproveitamento dos nomes para depuração será melhorado se os nomes forem distintos e significativos no aplicativo. Os aplicativos podem utilizar o método getName para retornar o nome associado a uma área de trabalho pelo método begin.

  3. Defina as propriedades na área de trabalho.

    Um aplicativo com uma área de trabalho atual pode inserir propriedades na área de trabalho e recuperar as propriedades da área de trabalho. A interface UserWorkArea fornece dois métodos de definição para a definição de propriedades e um método get para recuperar propriedades. O método de definição de dois argumentos insere a propriedade com o modo de propriedade normal. O método de definição de três argumentos utiliza um modo de propriedade como o terceiro argumento. Os dois métodos de definição utilizam a chave e o valor como argumentos. A chave é uma Cadeia; o valor é um objeto do tipo java.io.Serializable. Nenhum dos argumentos pode ser nulo, o que ocasiona a emissão de uma exceção java.lang.NullPointer.

    O seguinte aplicativo SimpleSample usa objetos de duas classes, a classe SimpleSampleCompany e a classe SimpleSampleProperty, como valores para propriedades. A classe SimpleSampleCompany é utilizada para o identificador de site e a classe SimpleSamplePriority é utilizada para a prioridade.

    public class SimpleSampleServlet {
       ...
       userWorkArea.begin("SimpleSampleServlet");
    
       try {
          // Definir o identificador de site (o padrão é Main).
          userWorkArea.set("company",
             SimpleSampleCompany.Main, PropertyModeType.read_only);
    
          // Definir a prioridade.
          userWorkArea.set("priority", SimpleSamplePriority.Silver);
       }
    
       catch (PropertyReadOnly e) {
         // A companhia foi definida anteriormente com o modo somente leitura ou
         // somente leitura fixo.
         ...
       }
    
        catch (NotOriginator e) {
         // A área de trabalho se originou em outro processo,
         // portanto, ela não pode ser modificada aqui.
         ...
       }
    
       catch (NoWorkArea e) {
          // Nenhuma área de trabalho foi começada neste encadeamento.
          ...
       }
    
       // Executar trabalho do aplicativo.
       ...
    }

    O método get utiliza a chave como um argumento e retorna um objeto Java™ Serializable como o valor associado à chave. Por exemplo, para recuperar o valor da chave da empresa da área de trabalho, o exemplo de código anterior usa o método get na área de trabalho para recuperar o valor.

    Definindo Modos de Propriedades. O método de definição de dois argumentos na interface UserWorkArea utiliza uma chave e um valor como argumentos e insere a propriedade com o modo de propriedade padrão normal. Para definir uma propriedade com um modo diferente, os aplicativos devem utilizar o método de definição com três argumentos, que utiliza um modo de propriedade como o terceiro argumento. Os valores utilizados para solicitar os modos de propriedades são os seguintes:
    • Normal: PropertyModeType.normal
    • Normal fixo: PropertyModeType.fixed_normal
    • Somente leitura: PropertyModeType.read_only
    • Somente leitura fixo: PropertyModeType.fixed_readonly
  4. Gerencie o trabalho local com uma área de trabalho.
  5. Concluir a área de trabalho.

    Depois que um aplicativo concluiu a utilização de uma área de trabalho, ele deve concluir a área de trabalho, chamando o método complete na interface UserWorkArea. Isso finaliza a associação com o encadeamento de chamada e destrói a área de trabalho. Se o método de conclusão for chamado em uma área de trabalho aninhada, a área de trabalho aninhada será finalizada e a área de trabalho pai se tornará a atual. Se não houver área de trabalho associada ao encadeamento de chamada, será criada uma exceção NoWorkArea. Toda área de trabalho deve ser concluída e as áreas de trabalho podem ser concluídas apenas pelo processo originário. Por exemplo, se um servidor tentar chamar o método complete em uma área de trabalho que se originou em um cliente, será criada uma exceção NotOriginator. As áreas de trabalho criadas em um processo de servidor nunca são propagadas de volta para um processo de cliente de chamada.

    Atenção: O serviço de área de trabalho requer total transparência local-remota. Mesmo que dois beans sejam implementados no mesmo servidor e, portanto, na mesma JVM e processo, uma área de trabalho iniciada em uma chamada a partir de uma outra será concluída e o bean no qual o pedido se originou sempre estará no mesmo estado após qualquer chamada remota.

    O exemplo de código a seguir mostra a conclusão da área de trabalho criada no aplicativo cliente.

    public class SimpleSampleServlet {
       ...
       userWorkArea.begin("SimpleSampleServlet");
       userWorkArea.set("company",
           SimpleSampleCompany.Main, PropertyModeType.read_only);
       userWorkArea.set("priority", SimpleSamplePriority.Silver);
       ...
    
       // Executar trabalho do aplicativo.
       ...
    
       // Finalizar a área de trabalho.
       try {
          userWorkArea.complete();
       }
    
       catch (NoWorkArea e) {
          // Não há área de trabalho associada a este encadeamento.
          ...
       }
    
       catch (NotOriginator e) {
          // A área de trabalho foi importada para este processo.
          ...
       }
      ...
    }

    O exemplo de código a seguir mostra o aplicativo de amostra concluindo a área de trabalho aninhada criada anteriormente na chamada remota.

    public class SimpleSampleBeanImpl implements SessionBean {
    
        public String [] test() {
          ...
    
          // Começar uma área de trabalho aninhada.
          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");
    
          // Concluir todas as áreas de trabalho aninhadas antes de retornar.
          try {
            userWorkArea.complete();
          }
          catch (NoWorkArea e) {
          }
          catch (NotOriginator e) {
          }
       }
    }
    

Exemplo

Tipos de Objetos da Área de Trabalho. No exemplo a seguir, o cliente cria uma área de trabalho e insere nela duas propriedades: um identificador de site e uma prioridade. O identificador de site é definido como uma propriedade somente leitura; o cliente não permite que os destinatários da área de trabalho substituam o identificador de site. Essa propriedade consiste na chave company e uma instância estática de um objeto SimpleSampleCompany. A propriedade da prioridade consiste na prioridade principal e em uma instância estática de um objeto SimpleSamplePriority. Os tipos de objeto são definidos como mostrado no exemplo de código a seguir:

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

O cliente faz uma chamada em um objeto remoto. A área de trabalho é propagada automaticamente; nenhum dos métodos no objeto remoto utiliza um argumento de área de trabalho. No lado remoto, o pedido é primeiro tratado pelo SimpleSampleBean; o bean primeiramente lê as propriedades de identificador de site e de prioridade a partir da área de trabalho. Em seguida, o bean tenta intencionalmente, mas falha, gravar diretamente na área de trabalho importada e substituir a propriedade somente leitura de identificador de site.

O SimpleSampleBean inicia com êxito uma substituir aninhada, na qual ele substitui a prioridade do cliente, em seguida, chama um outro bean, o SimpleSampleBackendBean. O SimpleSampleBackendBean lê as propriedades da área de trabalho, que contém o identificador de site definido no cliente e a prioridade definida no SimpleSampleBean. Por último, o SimpleSampleBean conclui sua área de trabalho aninhada, grava uma mensagem com base na propriedade de identificador de site e retorna.

Usando o Gerenciador de Partição da Área de Trabalho. O exemplo de código a seguir ilustra o uso da interface do gerenciador da partição da área de trabalho. A amostra ilustra como criar e recuperar uma partição de área de trabalho de maneira programática. Observe que a criação programática de uma partição da área de trabalho está disponível apenas no cliente Java Platform platform, Enterprise Edition (Java EE). Para criar uma partição da área de trabalho no servidor, é necessário utilizar o console administrativo. Consulte o artigo Serviço de Partição da Área de Trabalho para obter os parâmetros de configuração disponíveis para configurar uma partição.

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;

//Esta amostra demonstra como recuperar uma instância da 
//implementação do WorkAreaPartitionManager e como utilizar essa
//instância para criar uma partição de WorkArea e recuperar uma partição.  
//NOTE: Creating a partition in the way listed is only available 
//apenas em um cliente J2EE.  Para criar uma partição no servidor, utilize o 
//administrative console do WebSphere.  A recuperação de uma partição de WorkArea
//é executada da mesma maneira no cliente e no servidor.

public class Example {

     //O nome da partição a ser criada/recuperada
     String partitionName = "myPartitionName";
     //O nome na nomenclatura Java ao qual a instância WorkAreaPartitionManager está ligada
     String jndiName = "java:comp/websphere/WorkAreaPartitionManager";

     //Em um cliente J2EE, um usuário deve criar uma partição da seguinte maneira:
     public UserWorkArea myCreate(){
         //Variável para manter nossa referência do WorkAreaPartitionManager
         WorkAreaPartitionManager partitionManager = null;
         //Obter uma instância da implementação do WorkAreaPartitionManager
         try {
             InitialContext initialContext = new InitialContext();
             partitionManager = (WorkAreaPartitionManager) initialContext.lookup(jndiName);
         } catch (Exception e) {  }

         //Definir as propriedades para configurar nossa partição de WorkArea
         Properties props = new Properties();
         props.put("maxSendSize","12345");
         props.put("maxReceiveSize","54321");
         props.put("Bidirectional","true");
  			 props.put("DeferredAttributeSerialization","true");

         //Variável utilizada para manter a partição de WorkArea recém-criada
         UserWorkArea myPartition = null;

         try{
             //Esta é a maneira de criar uma partição no cliente J2EE client.  Utilize
             //o administrative console do WebSphere para criar uma partição de WorkArea
             //no servidor.
             myPartition = partitionManager.createWorkAreaPartition(partitionName,props);
         }
         catch (PartitionAlreadyExistsException e){  }
         catch (IllegalAccessException e){  }

         return myPartition;
     }

     //. . . .

     //Para recuperar uma partição de WorkArea posteriormente ou 
     //de alguma outra classe, proceda da seguinte maneira (no cliente ou no servidor):
     public UserWorkArea myGet(){
         //Variável para manter nossa referência do WorkAreaPartitionManager
         WorkAreaPartitionManager partitionManager = null;
         //Obter uma instância da implementação do WorkAreaPartitionManager
         try {
             InitialContext initialContext = new InitialContext();
             partitionManager = (WorkAreaPartitionManager) initialContext.lookup(jndiName);
         } catch (Exception e) {  }

         //Variável utilizada para manter a partição de WorkArea recuperada
         UserWorkArea myPartition = null;
         try{
             myPartition = partitionManager.getWorkAreaPartition(partitionName);
         }catch(NoSuchPartitionException e){  }

         return myPartition;
     }
}

O que Fazer Depois

Para obter informações adicionais sobre área de trabalho, consulte o pacote com.ibm.websphere.workarea na API. A documentação da API gerada está disponível no índice do centro de informações, no caminho Referência > APIs - Interfaces de Programação de Aplicativo.


Í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=twa_develop
Nome do arquivo: twa_develop.html