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.