このセクションでは、次のトピックについて説明します。
会話を開くには、次の手順に従います。
クライアント側で OPEN CONVERSATION
ステートメントを指定します。
OPEN CONVERSATION
ステートメント内で、この会話のメンバとしてサービス(サブプログラム)のリストを指定します。
OPEN CONVERSATION
ステートメントは、システム変数 *CONVID
に一意の会話識別子を割り当てます。
複数の会話を並行して開くこともできます。 サブプログラムが相互にインターフェイスとなる場合は、アプリケーションプログラムは CALLNAT
指示により評価される適切な *CONVID
の設定でさまざまな会話の管理を行います。
サブプログラムが現在の会話(*CONVID
により参照)のメンバである場合は、この会話のために 排他的に確保したサーバータスクで実行されます。
現在の会話のメンバではない場合は、異なるサーバータスク内で実行されます。 これは、異なる会話へも適用します。
会話は任意のプログラムレベルで開くことができ、この会話内の CALLNAT
は他の任意の上位または下位プログラムレベルで実行できます。
サーバーがエージェントの役割を果たすよう、サーバー上で実行されたリモート CALLNAT
でクライアント会話を開くことができます。 クライアントはサーバーの会話ではなく独自の会話のみを制御するため、アプリケーションプログラマは、メインクライアントが閉じられる前にサーバー上の会話を正常に閉じることを保証する必要があります。
会話型 RPC をローカルにテストすることが可能です。 会話型 CALLNAT
をリモートまたはローカルに実行する場合に同一の動作を保持するには、次の追加制限を適用します。
この会話のメンバとして現在実行しているオブジェクト内では、CLOSE CONVERSATION
は行うことができません。これは、リモートに実行しているプログラム内から会話を閉じることができないという制限に相当します。
この会話の別(または同じ)メンバ内から、会話のメンバである会話型 CALLNAT
を実行することはできません。 これは、サーバーサブプログラムからクライアントの会話のメンバである会話型 CALLNAT
を実行できないという制限に相当します。
他の会話のサブプログラム内から会話を開くことは推奨できません。
会話を閉じるには、次の手順に従います。
クライアント側で CLOSE CONVERSATION
ステートメントを指定します。
これにより、クライアントは特定の会話またはすべての会話を閉じることができます。 閉じられた会話の全コンテキスト変数は、その後解放され、サーバータスクは別のクライアントのために再度有効になります。
Natural を終了すると、全会話は自動的に閉じます。
サーバーが CLOSE CONVERSATION
要求を受け取ると、CLOSE CONVERSATION ALL
ステートメントが発行され、エージェントとして開かれていたサーバーを含む全会話も閉じられます。
BACKOUT TRANSACTION
(Rollback)で会話を閉じる
デフォルトで、CLOSE CONVERSATION
ステートメントが実行されとき、Rollback オプションは CLOSE CONVERSATION
ステートメントでサーバーに送られます。 これにより、会話処理の終わりにサーバー側で暗黙の BACKOUT TRANSACTION
が生じます。
END TRANSACTION
(Commit)で会話を閉じる
サーバー側で暗黙の END TRANSACTION
を起こすように ライブラリ SYSEXT
で有効なインターフェイス USR2032N
を使用できます。
次の CLOSE CONVERSATION
ステートメントが実行される前に、出口を呼び出す必要があります。 結果として、CLOSE CONVERSATION
ステートメントとともに Commit オプションがサーバーに送られ、会話処理の終わりにサーバーで END TRANSACTION
ステートメントが実行されます。
Commit オプションは、クライアントアプリケーションにより実行される次の CLOSE CONVERSATION
ステートメントに適用されます。 会話(複数可)が閉じた後に、デフォルトオプションは再度使用されます。 これは、次の CLOSE CONVERSATION
ステートメントが再び BACKOUT TRANSACTION
ステートメントを結果として生じることを意味しています。
会話中、この会話のメンバであるサブプログラムは、このサーバー上でコンテキストエリアを共有することができます。
このことを行うには、関係している各サブプログラム内に DEFINE DATA CONTEXT
ステートメントでデータエリアを宣言します。
会話がローカルまたはリモートであった場合は、コンテキストエリアを使用するサブプログラムは同じ方法で動作します。 DEFINE DATA CONTEXT
ステートメントは、DEFINE DATA INDEPENDENT
ステートメントにほぼ一致します。 AIV 変数の定義に適用されるすべてのルールは、接頭文字としてプラス記号(+)の使用が必要でないことを除き、コンテキスト変数にも適用されます 。
(通常は AIV で)このアプリケーションに対する全定義を含むプログラムの実行により変数の作成を必要とするため、コンパイラはフォーマット/長さ定義のチェックを行いません。 RPC サービスルーチンを含むライブラリは通常アプリケーション依存ではないため、これはコンテキスト変数に対して何も意味を持ちません。
AIV と対比して、呼び出し元のコンテキスト変数は CALLNAT
境界を渡って送信されません。 コンテキスト変数は名前で参照され、コンテキスト ID で適用します。 1 コンテキスト変数は、1 会話内の同じ変数名を参照する全サービスルーチンにより共有されます。 つまり、各会話は独自のコンテキスト変数の集合を持ちます。
コンテキスト変数は、同じ変数名であっても異なる会話間では共有できません。
OPEN CONVERSATION
ステートメントまたは非会話型 CALLNAT
ステートメントが実行されたときに、コンテキストエリアは初期値にリセットされます。
システム変数 *CONVID
(フォーマット I4)は OPEN CONVERSATION
ステートメントにより設定され、アプリケーションプログラムにより修正できます。
*CONVID
の修正は、複数会話を並行して使用している場合にのみ必要です。