Eigenschaften des Arbeitsbereichs überschreiben
Informationen zu diesem Vorgang
Arbeitsbereiche sind automatisch dem Prozess zugeordnet, der sie erstellt hat. In der Beispielanwendung beginnt der Client einen Arbeitsbereich und legt darin Eigenschaften zur Identifizierung der Site und zur Priorität fest. Dieser Arbeitsbereich wird an den Server weitergegeben, wenn der Client einen fernen Aufruf ausführt.
Anwendungen verschachteln Arbeitsbereiche, um Eigenschaften, die aus einem Clientprozess importiert wurden, temporär zu überschreiben. Die Verschachtelung erfolgt automatisch. Wird über die Schnittstelle "UserWorkArea" die Methode "begin()" innerhalb eines vorhandenen Arbeitsbereichs aufgerufen, wird ein verschachtelter Arbeitsbereich erstellt, der die Eigenschaften des übergeordneten Arbeitsbereichs übernimmt. Die Eigenschaften, die im verschachtelten Arbeitsbereich definiert sind, sind dem Prozess, in dem der Arbeitsbereich begonnen wurde, direkt zugeordnet. Der verschachtelte Arbeitsbereich muss in dem Prozess beendet werden, in dem er erstellt wurde. Wird ein Arbeitsbereich nicht von dem Prozess beendet, der ihn erstellt hat, dann wird er von der WorkArea-Funktion beendet, wenn der Prozess verlassen wird. Nachdem ein verschachtelter Arbeitsbereich beendet wurde, wird die ursprüngliche Ansicht des übergeordneten Arbeitsbereichs wiederhergestellt. Die Ansicht aller Arbeitsbereiche, die einem Thread zugeordnet sind, kann von untergeordneten Prozessen jedoch nicht aufgelöst werden.
Anwendungen definieren Eigenschaften in einem Arbeitsbereich, indem sie Modi für die Eigenschaften festlegen, um sicherzustellen, dass eine bestimmte Eigenschaft innerhalb des Geltungsbereichs dieses Arbeitsbereichs feststehend ist, d. h. nicht gelöscht werden darf (Fixed), oder dass es nur gelesen, aber nicht überschrieben werden darf (Read-only).
Beispiel
Im folgenden Codebeispiel versucht die Beispiel-Bean auf der Serverseite, direkt in den importierten Arbeitsbereich zu schreiben. Diese Aktion ist nicht zulässig, und daher wird die Ausnahme "NotOriginator" ausgelöst. Wenn die UserWorkArea-Partition nicht als bidirektional definiert ist, muss die Beispiel-Bean, wie im zweiten Codebeispiel gezeigt, einen eigenen Arbeitsbereich beginnen, um importierte Eigenschaften zu überschreiben. Wenn ein Arbeitsbereich in einer benutzerdefinierten Partition verwendet wird und als bidirektional definiert ist, kann diese Bean Kontext im Arbeitsbereich festlegen, bevor sie einen anderen Arbeitsbereich beginnt. Dieser Kontext, der im Falle einer bidirektionalen Partition festgelegt wird, wird zurück an den Aufrufenden geleitet. Weitere Informationen finden Sie im Artikel zum Service für Arbeitsbereichspartitionen.
public class SimpleSampleBeanImpl implements SessionBean { public String [] test() { ... String invoker = userWorkArea.getName(); try { userWorkArea.set("key", "value"); } catch (NotOriginator e) { } ... } }
Das folgende Codebeispiel zeigt, wie ein verschachtelter Arbeitsbereich begonnen wird. Dabei wird für den verschachtelten Arbeitsbereich der Name der erstellenden Klasse verwendet.
public class SimpleSampleBeanImpl implements SessionBean { public String [] test() { ... String invoker = userWorkArea.getName(); try { userWorkArea.set("key", "value"); } catch (NotOriginator e) { } // Einen verschachtelten Arbeitsbereich beginnen. Da der Name der // erstellenden Klasse als Name für den Arbeitsbereich verwendet wird, // muss der Name der erstellenden Klasse nicht explizit im // Arbeitsbereich angegeben werden. userWorkArea.begin("SimpleSampleBean"); ... } }
In der Beispielanwendung definiert der Client die Eigenschaft zur Identifizierung der Site als Read-only (nur Lesezugriff). Damit wird sichergestellt, dass die Anforderung immer dem angegebenen Unternehmen (company) des Clients zugeordnet wird. Ein Server kann diesen Wert im verschachtelten Arbeitsbereich nicht überschreiben. Im folgenden Codebeispiel versucht die SimpleSampleBean, den Wert der Eigenschaft zur Identifizierung der Site in dem von ihm erstellten verschachtelten Arbeitsbereichs zu ändern.
public class SimpleSampleBeanImpl implements SessionBean { public String [] test() { ... String invoker = userWorkArea.getName(); try { userWorkArea.set("key", "value"); } catch (NotOriginator e) { } // Einen verschachtelten Arbeitsbereich beginnen. userWorkArea.begin("SimpleSampleBean"); try { userWorkArea.set("company", SimpleSampleCompany.London_Development); } catch (NotOriginator e) { } ... } }