今回は、メッセージ待ち行列によるメッセージ監視とハンドリングをシステム応答リストで行う方法についてご紹介するとともに、メッセージモニター機能をご紹介します。この方法はAS/400 V1から存在している機能でIBM i OSで最も基本的な使用方法の一つです。
全体概要は図1のようになります。
▲図1.
それでは各手順について見ていきましょう。
処理するテーブルの属性(収納可能なレコード数の設定値)
まず最初にコピー操作をするテーブル(PF)には初期レコード数の上限(100)と、1回の拡張操作で追加できる増分レコード数(10)、拡張処理の最大回数を指定した増分の最大回数(3)が指定されています。つまりこのテーブルUSRLIB/TOKMSPは初期状態で最大100レコード格納可能で、101レコード目を書き込もうとすると10レコードだけ上限値を増やし、以降3回繰り返し、最大で130レコードまで自動的に(ユーザー操作なしに)テーブルレコード数を拡張します。
▲図2.
このテーブルに131行目を追加しようとすると、後述のように、CPA5305がレコードを追加しようとしている(例ではCPYFコマンドを実行している)ユーザーに送信され、ユーザーまたはオペレーターの応答を待つ状態になります。このように、通常はオペレーターの操作待ちになるメッセージIDと、その応答処置を事前に登録しておき、プログラムやジョブから参照させ、自動処理させるのがシステム応答リストの目的と言えます。
システム応答リストを使用しない場合の処理の流れ
システム応答リストとは、監視したいメッセージIDとその処置を指定するテーブルです。IBM i には様々なエラーや一定条件が発生した場合(例えばプリンターの用紙切れやデータベーステーブルの数値フィールドにヌル値や文字列が見つかった場合、その他プログラムが正常実行継続できないエラーが発生した場合等)に即時にエラー・プログラムを出して異常終了とせずに、プログラム実行元のユーザーやオペレーター(ユーザーQSYSOPRなど)にエラーを通知して、エラーのリカバリー処理を要求して、エラー発生中のプログラムをウェイトさせる機能が備わっています。
最も基本的な運用の場合、当連載第3回で記載したメッセージタイプ *INQ(照会)のメッセージは、ユーザーやオペレーターからの応答に応じて後続の処理を決定するために(たとえばジョブを異常終了させる、何らかの処置を行ってジョブを正常に継続させる、等)プログラムの処理をいったん停止して、ユーザー・オペレーターからの応答待ちで待機します。このジョブはユーザー・オペレーターが、たとえば5250画面からメッセージに対する応答を入力すると、後続の処理を継続します。
図3はテーブル(PF)が指定レコード数上限に達してしまった場合、レコード数を拡張するのか、拡張せずコピー処理を終了するのかを待っている画面です。最下行に「メッセージ待ち行列QSYSOPRのメッセージへの応答を待機中。」と表示されています。
▲図3.
上記の状態で、DSPMSG QSYSOPR コマンドを実行すると、下記のようにユーザー・操作員からの応答待ちで、CPYFコマンドが処理を中断して待機していることが確認できます。メッセージには下線が表示され、ユーザー・オペレーターが応答を入力可能であることが分かります。
▲図4.
さらに上の画面で下線の行(またはその一つ上のメッセージ本文)にカーソルしF1キーを押すと、詳細なメッセージ画面が表示されます。
▲図5.
この画面(または一つ前の画面)の下線に入力可能な応答は以下の通りです。
- C:コピー操作をこれ以上実行しません。現在テーブル(PF)の設定値上限までコピーされているが、それ以降のレコードはコピーせずにCPYFコマンドを終了します。
- I:このエラーを無視して、テーブルに指定されたレコード数を1増分単位(この例では10レコード)拡張してコピー処理を継続します。
これを選択すると更に11行目をコピーしようとした際に同じメッセージが表示されることになります。さらにコピーするレコードが10以下なら処理は正常完了します。 - 1から9999:指定した回数、テーブルの増分レコード数を追加してコピー処理を継続できます。指定した回数拡張してもさらにコピーするレコードがある場合、同じメッセージCPA5305が出力されます。
ここでは 9999 を入力したとして処理を進めます。
▲図6.
すると、今回の例では全体で211レコードのテーブルコピーでしたので、コピーは正常に完了します。
以上の処理をまとめると図7のようになります。
▲図7.
ここまで見てきたように、正常ケースで予期しないエラーが起こった際に、即時にプログラムを異常終了させるのではなく、ユーザー・オペレーターの操作を待ってプログラム処理を継続できるところが便利な点です。一方で、あるエラーの場合には特定の決まった応答を返せばよい、というユーザー環境も多いでしょう。そのような場合に、メッセージIDとその応答を登録しておく場所がシステム応答リストになります。
②システム応答リストへのメッセージIDと応答内容の登録 と
①システム応答リストの確認
図1の順番が前後しますが、まずシステム応答リストの現在の登録内容は WRKRPYLE (Work RePlY List Entry)コマンドで確認します。(図8)
▲図8.
図8では、8888行目にCPA5305の処理を登録した後の状態になっています(デフォルトでは登録されていません)。システム応答リストは、順序番号の小さい方から順番にメッセージIDを調べていき、該当のメッセージIDが見つかったところでその行の処理を実行します。今回の例では CPA5305のメッセージが出力された際に、図3で見たような処理を自動的に応答させるのが目的となります。今回は 9999 回までテーブルの最大レコード数を拡張させる、という設定を行います。
コマンドとしては①のコマンドを実行します。
▲図9.①のコマンド
登録が完了すると図8の状態になります。
③システム応答リストを参照するようにジョブ属性を変更する
実はシステム応答リストに登録しただけでは、ジョブはシステム応答リストを参照してくれません。ジョブの実行属性の中に照会メッセージ応答INQMSGRPYパラメーターがあり、システム応答リストを参照するよう、下記に書き換える必要があります。
▲図10.
以上①、(②、)③の設定を実施した後に、130レコード以上のレコード数をターゲットのテーブルにCPYF実行すると、以下のようにメッセージが自動応答され、エラーメッセージ応答を介さずに処理が完了します。
▲図11.
以上の処理をまとめた全体図が図12になります。
▲図12.
筆者
日本アイ・ビー・エム株式会社 多数の執筆記事を、iWorldに寄稿中。 |