Dieses Kapitel behandelt die folgenden Themen:
Um eine Konversation zu eröffnen:
Geben Sie auf der Client-Seite ein
OPEN
CONVERSATION
-Statement an.
Geben Sie in dem OPEN CONVERSATION
-Statement eine
Liste von Diensten (Services, die in Form von Subprogrammen realisiert sind)
als Teilnehmer dieser Konversation an.
Das OPEN CONVERSATION
-Statement weist der
Systemvariablen *CONVID
ein eindeutige Konversationskennung zu.
Es kann mehr als eine Konversation parallel geöffnet sein. Wenn
Subprogramme sich gegenseitig stören, sind die Anwendungsprogramme dafür
zuständig, die verschiedenen Konversationen zu verwalten, indem sie die
entsprechende Systemvariable *CONVID
setzen, die
vom CALLNAT
-Statement
ausgewertet wird.
Ist das Subprogramm Teil der aktuellen Konversation (durch
*CONVID
referenziert), wird es in der Server-Task
ausgeführt, die ausschließlich für diese Konversation reserviert ist.
Ist es nicht Teilnehmer der aktuellen Konversation, wird es in einer anderen Server-Task ausgeführt. Dies gilt auch für unterschiedliche Konversationen.
Eine Konversation kann auf jeder Programmebene geöffnet werden und
CALLNAT
-Statements innerhalb dieser Konversation können auf jeder
anderen Programmebene darunter oder darüber ausgeführt werden.
Es ist möglich, eine Client-Konversation innerhalb eines entfernt
(remote) auf einem Server ausgeführten CALLNAT
zu öffnen, so dass
der Server als Agent fungiert. Da der Client nur seine eigenen Konversationen
kontrolliert und nicht die des Servers, muss der Anwendungsprogrammierer
sicherstellen, dass die Konversation auf dem Server ordnungsgemäß beendet wird,
bevor der Haupt-Client geschlossen wird.
Der konversationelle RPC kann noch lokal getestet werden. Um das
Verhalten identisch zu halten, wenn Sie einen konversationellen
CALLNAT
entfernt (remote) oder lokal ausführen, gelten die
folgenden zusätzlichen Einschränkungen:
Ein CLOSE
CONVERSATION
ist nicht möglich innerhalb eines Objekts, das
gerade als Teilnehmer an dieser Konversation läuft. Dies entspricht der
Einschränkung, dass es nicht möglich ist, eine Konversation aus einem entfernt
(remote) laufenden Programm heraus zu beenden.
Es ist nicht möglich, ein konversationelles
CALLNAT
, das Mitglied der Konversation ist, aus einem anderen
(oder demselben) Teilnehmer an dieser Konversation heraus auszuführen. Dies
entspricht der Einschränkung, dass es nicht möglich ist, ein konversationelles
CALLNAT
, das Mitglied der Konversation des Clients ist, von einem
Server-Subprogramm aus auszuführen.
Es wird nicht empfohlen, eine Konversation aus einem Subprogramm einer anderen Konversation heraus zu eröffnen.
Um eine Konversation zu beenden:
Geben Sie ein CLOSE
CONVERSATION
-Statement auf der Client-Seite an.
Damit kann der Client eine bestimmte Konversation oder alle Konversationen schließen. Alle Kontextvariablen der beendeten Konversation werden dann freigegeben und die Server-Task ist wieder für einen anderen Client verfügbar.
Wenn Sie Natural beenden, schließen Sie damit implizit alle Konversationen.
Wenn ein Server ein CLOSE CONVERSATION
-Anforderung
erhält, gibt er ein CLOSE CONVERSATION ALL
-Statement aus, so dass
alle Konversationen, die der Server (als Agent) geöffnet haben könnte,
ebenfalls geschlossen werden.
Wenn ein CLOSE CONVERSATION
-Statement ausgeführt wird,
wird standardmäßig die Rollback-Option zusammen mit dem CLOSE
CONVERSATION
-Statement an den Server gesendet. Dies führt am Ende der
Konversationsverarbeitung zu einem impliziten
BACKOUT
TRANSACTION
auf der Server-Seite.
Sie können die in der Library SYSEXT
verfügbare
Anwendungsprogrammierschnittstelle USR2032N
verwenden, um ein
implizites END
TRANSACTION
auf der Serverseite auszulösen.
Die Anwendungsprogrammierschnittstelle muss vor der Ausführung des
nächsten CLOSE CONVERSATION
-Statement aufgerufen werden. Dies hat
zur Folge, dass die Commit-Option zusammen mit dem CLOSE
CONVERSATION
-Statement an den Server gesendet wird und der Server am
Ende der Konversationsverarbeitung ein END TRANSACTION
-Statement
ausführt.
Die Commit-Option gilt für das nächste CLOSE
CONVERSATION
-Statement, das von der Client-Anwendung ausgeführt wird.
Nachdem die Konversation(en) beendet wurde(n), wird wieder die Standardoption
verwendet. Das bedeutet, dass das folgenden CLOSE
CONVERSATION
-Statement wieder zu einem
BACKOUT
TRANSACTION
-Statement führt.
Während einer Konversation können die Subprogramme, die Mitglieder dieser Konversation sind, einen gemeinsamen Kontextbereich auf diesem Server nutzen.
Dazu deklarieren Sie in jedem der betroffenen Unterprogramme einen
Datenbereich mit dem
DEFINE DATA
CONTEXT
-Statement.
Die Subprogramme, die einen Kontextbereich verwenden, verhalten sich
so, als ob die Konversation lokal oder remote wäre. Das
DEFINE DATA
CONTEXT
-Statement entspricht weitgehend dem
DEFINE DATA
INDEPENDENT
-Statement. Alle Regeln, die für die Definition
von AIV-Variablen gelten,
gelten auch für Kontextvariablen, mit der Ausnahme, dass einer Kontextvariablen
kein Pluszeichen (+) vorangestellt werden muss.
Der Compiler prüft keine Format-/Längendefinition, da dies voraussetzt, dass die Variablen durch Ausführen eines Programms erstellt werden, das alle Definitionen für diese Anwendung enthält (wie bei AIVs üblich). Bei Kontextvariablen hat dies keinen Sinn, da eine Library, die RPC-Service-Routinen enthält, normalerweise nicht anwendungsabhängig ist.
Im Gegensatz zu AIVs werden die Kontextvariablen des Aufrufers nicht
über CALLNAT
-Grenzen
hinweg übergeben. Kontextvariablen werden durch ihren Namen und die
Kontextkennung, für die sie gelten, referenziert. Eine Kontextvariable wird von
allen Service-Routinen, die sich innerhalb einer Konversation auf denselben
Variablennamen beziehen, gemeinsam genutzt. Daher hat jede Konversation ihren
eigenen Satz an Kontextvariablen. Kontextvariablen können nicht von
verschiedenen Konversationen gemeinsam genutzt werden, auch wenn sie denselben
Variablennamen haben.
Der Kontextbereich wird auf die Anfangswerte zurückgesetzt, wenn ein
OPEN
CONVERSATION
-Statement oder ein nicht-konversationelles
CALLNAT
-Statement ausgeführt wird.
Die Systemvariable *CONVID
(Format I4) wird durch das OPEN
CONVERSATION
-Statement gesetzt und kann durch das
Anwendungsprogramm geändert werden.
Eine Änderung von *CONVID
ist nur
notwendig, wenn Sie mehrere Konversationen parallel verwenden.