Substituindo Propriedades da Área de Trabalho
Sobre Esta Tarefa
As áreas de trabalho são inerentemente associadas ao processo que as cria. No aplicativo de amostra, o cliente começa uma área de trabalho e define para ela as propriedades identificador de site e prioridade. Essa área de trabalho é propagada para o servidor quando o cliente faz uma chamada remota.
Os aplicativos aninham as áreas de trabalho para substituir temporariamente as propriedades importadas de um processo cliente. O mecanismo de aninhamento é automático; a chamada de begin na interface UserWorkArea a partir do escopo de uma área de trabalho existente cria uma área de trabalho aninhada que herda as propriedades da área de trabalho circundante. As propriedades definidas na área de trabalho aninhada estão estritamente associadas ao processo no qual a área de trabalho foi começada; a área de trabalho aninhada deve ser concluída dentro do processo que a criou. Se uma área de trabalho não for concluída pelo processo de criação, o recurso work-area finalizará a área de trabalho após a saída do processo. Depois que uma área de trabalho aninhada é concluída, a exibição original da área de trabalho circundante é restaurada. No entanto, a exibição do conjunto completo de áreas de trabalho associadas a um encadeamento não pode ser decomposta por processos de recebimento de dados.
Os aplicativos definem propriedades para uma área de trabalho utilizando os modos de propriedades na garantia de que uma propriedade específica seja fixa (não removível) ou somente leitura (não substituível) no escopo da área de trabalho especificada.
Exemplo
No exemplo de código a seguir, o bean de amostra do lado do servidor tenta gravar diretamente na área de trabalho importada. Como a partição UserWorkArea não está definida como bidirecional, essa ação não é permitida e a exceção NotOriginator será emitida. Quando a partição UserWorkArea não está definida como bidirecional, o bean de amostra deve começar sua própria área de trabalho para substituir quaisquer propriedades importadas, conforme mostrado no segundo exemplo de código. Se uma área de trabalho em uma partição definida pelo usuário for utilizada e estiver definida como bidirecional, esse bean poderá definir contexto na área de trabalho antes de começar outra área de trabalho. Esse contexto definido no caso bidirecional será propagado de volta para o responsável pela chamada. Consulte o artigo Serviço de Partição da Área de Trabalho para obter informações adicionais.
public class SimpleSampleBeanImpl implements SessionBean { public String [] test() { ... String invoker = userWorkArea.getName(); try { userWorkArea.set("key", "value"); } catch (NotOriginator e) { } ... } }
O exemplo de código a seguir demonstra o começo de uma área de trabalho aninhada, utilizando o nome da classe de criação para identificar a área de trabalho aninhada.
public class SimpleSampleBeanImpl implements SessionBean { public String [] test() { ... String invoker = userWorkArea.getName(); try { userWorkArea.set("key", "value"); } catch (NotOriginator e) { } // Começar uma área de trabalho aninhada. Utilizando o nome da classe de // criação como o nome da área de trabalho, pode-se evitar // definir explicitamente o nome da classe de criação na // área de trabalho. userWorkArea.begin("SimpleSampleBean"); ... } }
No aplicativo de exemplo, o cliente define a propriedade do identificador de site como de leitura; que garante que o pedido seja sempre associado à identidade da empresa do cliente. Um servidor não pode substituir esse valor em uma área de trabalho aninhada. No exemplo de código a seguir, o SimpleSampleBean tenta alterar o valor da propriedade identificador de site na área de trabalho aninhada que ele criou.
public class SimpleSampleBeanImpl implements SessionBean { public String [] test() { ... String invoker = userWorkArea.getName(); try { userWorkArea.set("key", "value"); } catch (NotOriginator e) { } // Começar uma área de trabalho aninhada. userWorkArea.begin("SimpleSampleBean"); try { userWorkArea.set("company", SimpleSampleCompany.London_Development); } catch (NotOriginator e) { } ... } }