Verwendung des Natural RPC im konversationellen Modus

Dieses Kapitel behandelt die folgenden Themen:


Eine Konversation eröffnen

Beginn der AnweisungslisteUm eine Konversation zu eröffnen:

  1. Geben Sie auf der Client-Seite ein OPEN CONVERSATION-Statement an.

  2. 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.

Zusätzliche Einschränkungen

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.

Eine Konversation beenden

Beginn der AnweisungslisteUm eine Konversation zu beenden:

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.

Eine Konversation mit implizitem BACKOUT TRANSACTION (Rollback) schließen

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.

Eine Konversation mit implizitem END TRANSACTION (Commit) beenden

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.

Einen Konversationskontext definieren

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.

Systemvariable *CONVID ändern

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.