非同期 API について

CICS ® TS 5.4 には、アプリケーション開発者が子タスクを非同期で実行できる非同期プログラミング・モデルを使用できるようにする一連の新しい非同期 API コマンドが用意されています。

非同期 API の要素

非同期 API は、以下の要素で構成されています。
  • 要求を送信し、応答を受け取るための API コマンド。
  • EXEC CICS RUN TRANSID コマンドおよび EXEC CICS FETCH コマンドを発行して子タスクを開始し、子タスクと対話する親タスク。
  • 親プログラムの完了前に子に関連付けられているリソースを解放するための FREE CHILD コマンド。
  • 別個の作業単位として親タスクとは非同期で実行される子タスク。 各親は 1 つ以上の子を持つことができます。
  • 必要に応じて親タスクと子タスクの間でデータを渡すためにオプションで使用できるチャネル。

非同期 API は、親タスクと子タスクの状態を管理して、関連付けられているすべてのリソースをクリーンアップし、チャネル内のデータを標準として管理します。 API を使用すると、Web サービス・アプリケーションなど、従来からの長時間実行タスクで大きなメリットを得られます。このような長時間実行タスクでは、従来の方法の代わりに、必要に応じて子タスクを作成して解放し、システム・フットプリントを最小限に抑えることができるようになります。

非同期 API の仕組み

親タスクとは、 EXEC CICS RUN TRANSID コマンドと EXEC CICS FETCH コマンドを使用して子タスクを開始し、子タスクと対話するプログラムを実行するタスクのことです。 この例では、親プログラムは EXEC CICS PUT CONTAINER コマンドを使用して、子プログラムと通信するためのコンテナーとチャネルを作成し、次に EXEC CICS RUN TRANSID コマンドを使用して子タスクを作成します。これにより、transid で定義された子プログラムが実行されます。 子プログラムは指定されたチャネルのコピーを受け取り、処理を開始します。その間、親プログラムは他のロジックで処理を続けることができます。 子タスクの結果または完了状況が必要な場合、親は EXEC CICS FETCH CHILD コマンドを実行できます。 子タスクが正常に完了し、チャネルを渡して戻すと、EXEC CICS GET CONTAINER コマンドが使用されて出力が取得されます。

EXEC CICS PUT CONTAINER(container) CHANNEL(channel)
                    FROM(struct)  FLENGTH(len_struct) BIT
                    RESP(reason) RESP2(response)

EXEC CICS RUN TRANSID(transid) CHILD(child)
            CHANNEL(channel) RESP(reason) RESP2(response)

…

EXEC CICS FETCH CHILD(child)
                  ABCODE(abcode)
                  COMPSTATUS(child_status)
                  CHANNEL(fetch_channel)
                  RESP(reason) RESP2(response)

EXEC CICS GET CONTAINER(container) CHANNEL(fetch_channel)
                      INTO(struct) FLENGTH(len_struct)
                      RESP(reason) RESP2(response)

子プログラムは CICS API コマンドを通常どおり使用できますが、通常は EXEC CICS GET CONTAINER コマンドと EXEC CICS PUT CONTAINER コマンドを使用して親プログラムと対話します。 この子プログラムの例では、 EXEC CICS GET CONTAINER コマンドを使用して親プログラムによって渡されたコンテナーを取得し、他のロジックを実行して内容を変更し (...)、 EXEC CICS PUT CONTAINER コマンドを使用して親によって取り込まれる結果を送り返します。

EXEC CICS GET CONTAINER(container) CHANNEL(channel)
                INTO(struct) FLENGTH(len_struct)
                RESP(reason) RESP2(response)

 ...

  EXEC CICS PUT CONTAINER(container) CHANNEL(channel)
                FROM(struct) FLENGTH(len_struct) BIT
                RESP(reason) RESP2(response)

チャネルを使用した親プログラムと子プログラムの間の通信はオプションです。 例えば、親プログラムで子タスクが正常に完了したかどうかのみを把握する必要がある場合、EXEC CICS FETCH コマンドで十分です。