Remplacement des propriétés de zone de travail
Pourquoi et quand exécuter cette tâche
Les zones de travail sont par nature associés au processus qui les crée. Dans l'exemple d'application, le client crée une zone de travail et définit celle-ci dans les propriétés de propriété et d'identificateur de site. Cette zone de travail est propagée au serveur lorsque le client établit un appel à distance.
Les applications imbriquent des zones de travail afin de remplacer provisoirement les propriétés importées à partir du processus client. Le mécanisme d'imbrication est automatique ; l'appel de la méthode begin sur l'interface UserWorkArea à partir de la portée d'une zone de travail existante crée une zone de travail imbriquée qui hérite les propriétés de la zone de travail d'inclusion. Les propriétés définies dans la zone de travail imbriquée sont strictement associées au processus dans lequel la zone de travail a été créée ; la zone de travail imbriquée doit être terminée dans le processus qui l'a créée. Si une zone de travail n'est pas terminée par le processus de création, la fonction de zone de travail met fin à la zone de travail lors de la fermeture du processus. Une fois qu'une zone de travail imbriquée est terminée, la vue d'origine de la zone de travail d'inclusion est restaurée. Cependant, la vue de l'ensemble complet de zones de travail associées à une unité d'exécution ne peut pas être décomposée par les processus en aval.
Les applications définissent des propriétés dans une zone de travail à l'aide de modes de propriété, afin d'assurer qu'une propriété particulière est fixe (non supprimable) ou en lecture seule (non remplaçable) dans la portée de la zone de travail donnée.
Exemple
Dans l'exemple de code ci-dessous, l'exemple de bean côté serveur tente d'écrire directement dans la zone de travail importée. Etant donné que la partition UserWorkArea n'est pas définie comme étant bidirectionnelle, cette action n'est pas autorisée et l'exception NotOriginator est générée. Lorsque la partition UserWorkArea n'est pas définie comme étant bidirectionnelle, l'exemple de bean doit créer sa propre zone de travail afin de remplacer les propriétés importées, comme indiqué dans le deuxième exemple de code. Si une zone de travail d'une partition définie par l'utilisateur est utilisée et définie comme étant bidirectionnelle, ce bean peut définir le contexte dans la zone de travail avant de créer une autre zone de travail. Le contexte défini dans une configuration bidirectionnelle est propagé de nouveau à l'appelant. Pour plus d'informations, consultez l'article relatif au service de partitionnement de la zone de travail.
public class SimpleSampleBeanImpl implements SessionBean { public String [] test() { ... String invoker = userWorkArea.getName(); try { userWorkArea.set("key", "value"); } catch (NotOriginator e) { } ... } }
L'exemple de code ci-dessous démontre la création d'une zone de travail imbriquée, à l'aide du nom de la classe créatrice, qui identifie la zone de travail imbriquée.
public class SimpleSampleBeanImpl implements SessionBean { public String [] test() { ... String invoker = userWorkArea.getName(); try { userWorkArea.set("key", "value"); } catch (NotOriginator e) { } // Création d'une zone de travail imbriquée. L'utilisation du nom de la // classe créatrice comme nom de la zone de travail permet d'éviter la // définition explicite du nom de la classe créatrice dans // la zone de travail. userWorkArea.begin("SimpleSampleBean"); ... } }
Dans l'exemple d'application, le client définit la propriété d'identificateur de site comme étant en lecture seule ; cela garantit l'association systématique de la demande à l'identité de la société du client. Un serveur ne peut pas remplacer cette valeur dans une zone de travail imbriquée. Dans l'exemple de code ci-dessous, SimpleSampleBean tente de modifier la valeur de la propriété d'identificateur de site dans la zone de travail imbriquée qu'il a créée.
public class SimpleSampleBeanImpl implements SessionBean { public String [] test() { ... String invoker = userWorkArea.getName(); try { userWorkArea.set("key", "value"); } catch (NotOriginator e) { } // Création d'une zone de travail imbriquée. userWorkArea.begin("SimpleSampleBean"); try { userWorkArea.set("company", SimpleSampleCompany.London_Development); } catch (NotOriginator e) { } ... } }