IBM i ジョブ・キューを制御するスケルトン・ユーティリティー・プログラム
IBM i 運用の観点から、ジョブ・キュー管理を自動化しなければならないシナリオがいくつかあります。ジョブ・キューで待機しているジョブのパラメーターを 1 つ以上自動的に変更しなければならないような状況として、次のような状況があります。
- 特定のジョブを探し、それを自動的に別のジョブ・キューに移動する
- ジョブの動きが遅いジョブや、まとめて応答を待っているジョブの背後で渋滞している場合に、すべてのジョブを異なるジョブ・キューに移動する
- あるジョブが他のジョブの前後に実行されるよう、ジョブ優先順位を変更する
- キュー中にある余分な数のジョブを検出し、監視要員にアラートを送信する
キューで待機しているジョブの情報を収集し、それらのジョブを調整する自動化ジョブを設定するため、WRKJOBQDB CL プログラムを作成しました。WRKJOBQDB は、特定のジョブ・キューで実行中のすべてのジョブに関するデータを収集し、それらのジョブに対して具体的なアクションを実行するスケルトン・プログラムです。以下のサンプル・プログラムでは、WRKJOBQDB は、ジョブ・キュー・データを収集し、特定のジョブ名のジョブをすべて、新規ジョブより低い優先順位で実行するよう変更します (新規ジョブが変更されたジョブより先に実行できるようにします)。WRKJOBQDB は、ジョブ・キュー管理のスケルトン・コードとして機能し、他の機能を実行するよう簡単に変更できます。
WRKJOBQDB は、非常にシンプルなデータベースとフォーマットを備えています。特定のジョブ・キューの情報を収集し、そのジョブ・キューのジョブに関する情報を含むデータベースを作成し、それらのジョブがキューに見つかった場合に、待機している特定のジョブに対してアクションを実行します。
WRKJOBQPF データベース・ファイルと WRKJOBQDB プログラムの詳細コードを以下に示します。
WRKJOBQPF データベース
ジョブ・キュー情報は、Work with Job Queue (WRKJOBQ) コマンドをターゲット・ジョブ・キューで実行したときに作成される印刷出力から転送されます。このユーティリティーで使用される WRKJOBQPF ファイルのDDS 、および物理ファイル・レイアウトを以下に示します。
サンプル・プログラムについては、RUNLIB というライブラリーに WRKJOBQPF を作成しました。
このファイルは 132 文字長で、コードで示しているように、発生元の QPRTSPLQ プリンター・ファイル出力と同じレポート幅です。このファイルは、使用しているプログラムがターゲット・ジョブ・キューで待機しているジョブを検査し、変更するのに使用するコア・エンジンです。
WRKJOBQPF は各ジョブのジョブ番号によって降順 (DESC) にキー入力されています。これは、キュー中の最も古いジョブを最初に処理し、実行依頼された順番にジョブを変更できるようにするためです。これにより、ジョブが変更中の順序を外れて実行されないようにします。
また、WRKJOBQPF フィールドがすべて英数字である点に注目してください。これは、QPRTSPLQ スプール・ファイルのコンテンツ全体を、レポート・ヘッダー、列見出しなどを含め、そのファイルにダンピングし、スプール・ファイルのデータベース・コピーを作成しようとしているためです。スケルトン・プログラムは、ファイル・レコードをソートし、関心のあるジョブ・キュー項目のみ処理します。レポート・ヘッダーのデータなど、WRKJOBQPF における関連性がないデータは無視します。
待機ジョブを変更する
以下に示す WRKJOBQDB CL プログラム・コードは、ターゲット・ジョブ・キュー・コンテンツを (プログラムに渡されたように) WRKJOBQPF ファイルにコピーし、ファイルを読み取り、ジョブ優先順位 6 で実行するよう、特定のジョブ・キュー項目を変更します。
コードの実行内容は次の通りです。
行 0001.00 は、検査したい jobq 名 (&JOBQNAME) と jobq ライブラリー (&JOBQLIB) に等しいパラメーターを指定したプログラムを呼び出すことを宣言します。&JOBQNAME と &JOBQLIB は、行 0004.00 と 0005.00 で定義されています。
行 0002.00 は、 WRKJOBQPF ファイルをプログラムに定義します。
行 0007.00 と 0008.00 は、QTEMP ライブラリーの WRKJOBQPF ファイルのインスタンスを捜し、その作業ファイルがあれば削除します。
行 0012.00 と 0013.00 の Create Duplicate Object (CRTDUPOBJ) コマンドは、実行中ジョブの QTEMP ライブラリーにある WRKJOBQPF ファイルのコピーを作成します。これによって、複数バージョンの WRKJOBQDB プログラムを同時に実行できます。各コピーはそれぞれ自分のデータベースのコピーを備えることになるためです。
行 0014.00 は、WRKJOBQPF で利用可能なレコードより多くのジョブがキューにある場合に備えて、WRKJOBQPF ファイルに含めることができるレコードの数を増やします。
行 0016.00 と 0017.00 は、WRKJOBQPF ファイルを行 0014.00 で作成された新しいコピーにオーバーライドします。このプログラムの WRKJOBQPF へのすべての参照は、QTEMP のコピーにポイントします。
行 0019.00 と 0020.00 の Work with Job Queue (WRKJOBQ) コマンドは、ジョブ・キューのコンテンツに関する情報を含む QPRTSPLQ スプール・ファイルを作成します。
行 0022.00 は、行 0019.00-0020.00 で作成された QPRTSPLQ スプール・ファイルのコンテンツを、 QTEMP の新規作成された WRKJOBQPF ファイルにコピーします。
行 0024.00 から 0034.00 は、QTEMP/WRKJOBQPF ファイルの全レコードを処理するループを作成します。プログラムがファイルの終わり (行 0026.00) になると、行 0037.00 の ENDLOOP ラベルに分岐して、プログラムは終了します。
行 0028.00 から 32.00 は、着信レコードをそれぞれ検査します。ジョブ名が 'JOB1' または 'JOB2' と等しい場合、Change Job (CHGJOB) コマンドがジョブのジョブ優先順位を '6' に変更します。デフォルトでは、ほとんどのジョブは優先順位 '5' でシステムに入ります。ジョブを優先順位 '6' に変更することで、ジョブ JOB1 または JOB2 の前にシステムに入るあらゆるジョブが即座に実行開始できるようにします。キュー中のジョブ JOB1 と JOB2 が実行依頼される前に新しいジョブが優先され、実行を開始します。
また、行 0031.00. MONMSG の Monitor Message (MONMSG) コマンドが、 CHGJOB コマンド実行時に次のメッセージを探し、WRKJOBQDB にそれらのメッセージを無視するよう指示している点に注目してください。
- CPA0701 (&3 received by &1 at &4. (C D I R)--A message was received by WRKJOBQDB (メッセージが WRKJOBQDB により受信されました)
- CPF1321 (Job &1 user &2 job number &3 not found)--The job is no longer in the system (ジョブはシステムにありません)
このコードは、実行が完了し、システムにないジョブの優先順位をプログラムが変更しようとしている場合に必要です。
行 0037.00 から 0039.00 はジョブ・ログを印刷出力し、プログラムを終了します。
WRKJOBQDB は、ジョブ・キュー項目を見て、必要に応じて変更できる簡単なプログラムです。1 つ以上のジョブが IBM i の処理問題の原因となっている場合に、既知のワークフロー状態に便利な特殊ツールです。必要に応じて変更してください。