ジョブログの監視(WATCH) V6R1編

監視(WATCH)関連の動作を V6R1でチェックできる機会がありました。

かなり設計が変わっていて、STRWCH コマンドで実行されるジョブからして違います。

たとえば、V5R4 では STRWCH コマンドで指定した監視 ID と同じ名前のジョブが監視用に生成されるので、結果や状況はそのジョブのジョブログをチェックすればよかったわけです。
それが V6R1 では、あたかも JDBC リクエストに対して QZDASOINIT という大量の事前開始ジョブがプールされて N対N で対処するような、そんなかんじの事前開始ジョブになっています。(しかもジョブ名の最初の文字は"Q")

ジョブログの監視(WATCH)」で書いたサンプルはそのまま V6R1 で実行できはするのですが、目論見のように特定のジョブログをチェックするだけではすまなくなってしまっているので、それに変わるものとして特定のメッセージ待ち行列に送信するようにしました。(要は最小限にしか変更しなかった、ということです)
もちろんデータベースに書き込んでもいいですし、データ待ち行列か何かにしてそこから何かのアクションを起こすようにしてもいいかもしれませんね。


プログラム例

↓が修正済みのものです。

             PGM        PARM(&TYPE &SESSION &ERROR &DATA)

   /* INPUT PARMS */
             DCL        VAR(&TYPE) TYPE(*CHAR) LEN(10)
             DCL        VAR(&SESSION) TYPE(*CHAR) LEN(10)
             DCL        VAR(&ERROR) TYPE(*CHAR) LEN(10)
             DCL        VAR(&DATA) TYPE(*CHAR) LEN(1024)

   /* RECEIVE DATA */
             DCL        VAR(&MSGID) TYPE(*CHAR) STG(*DEFINED) LEN(7) +
                          DEFVAR(&DATA 5)
             DCL        VAR(&MSGF) TYPE(*CHAR) STG(*DEFINED) LEN(10) +
                          DEFVAR(&DATA 391)
             DCL        VAR(&OFFSET) TYPE(*INT) STG(*DEFINED) LEN(4) +
                          DEFVAR(&DATA 441)
             DCL        VAR(&MSGDTAP) TYPE(*PTR)
             DCL        VAR(&MSGDTA) TYPE(*CHAR) STG(*BASED) +
                          LEN(1024) BASPTR(&MSGDTAP)

             DCL        VAR(&JOBNAME) TYPE(*CHAR) STG(*DEFINED) +
                          LEN(10) DEFVAR(&DATA 33)
             DCL        VAR(&JOBUSER) TYPE(*CHAR) STG(*DEFINED) +
                          LEN(10) DEFVAR(&DATA 43)
             DCL        VAR(&JOBNBR) TYPE(*CHAR) STG(*DEFINED) +
                          LEN(6) DEFVAR(&DATA 53)

             DCL        VAR(&MSGTEXT) TYPE(*CHAR) LEN(128)

     /* PROCEDURE */
             MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))

     /* CPF2880 PF IS CREATED */
             IF         COND((%SST(&TYPE 1 6) = '*MSGID') & (&MSGID +
                          = 'CPF2880')) THEN(GOTO CMDLBL(SNDMSG))
     /* CPC2955 PF IS COPIED */
             IF         COND((%SST(&TYPE 1 6) = '*MSGID') & (&MSGID +
                          = 'CPC2955')) THEN(GOTO CMDLBL(SNDMSG))
             ELSE       CMD(GOTO CMDLBL(EXIT))

 SNDMSG:     DO

             CHGVAR     VAR(&MSGTEXT) VALUE('The Next Message is +
                          sent by ' || &JOBNBR |< '/' || &JOBUSER +
                          |< '/' || &JOBNAME)
             SNDPGMMSG  MSG(&MSGTEXT) TOMSGQ(APITEST/JOBLOGMSGQ) +
                          MSGTYPE(*INFO)

             CHGVAR     VAR(&MSGDTAP) VALUE(%ADDR(&DATA))
             CHGVAR     VAR(%OFFSET(&MSGDTAP)) +
                          VALUE(%OFFSET(&MSGDTAP) + &OFFSET)
             SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGF) MSGDTA(&MSGDTA) +
                          TOMSGQ(APITEST/JOBLOGMSGQ) MSGTYPE(*INFO)
             CHGVAR     VAR(&ERROR) VALUE('          ')
             GOTO       CMDLBL(EXIT)
             ENDDO

 ERROR:      CHGVAR     VAR(&ERROR) VALUE('*ERROR    ')

 EXIT:       ENDPGM

実行例

監視の開始と状況確認

STRWCH コマンドでジョブログの監視を開始します。

WRKWCH コマンドで状況の確認を行います。

オプション 5 で「表示」すると、何をどういうオプションで監視しているかを確認することができます。

監視の実行例

監視対象のメッセージが発生する CPYF コマンドを実行してみましょう。
「監視されたジョブ」を *ALL と指定して STRWCH していますので、どのジョブで実行しても監視にひっかかるはずです。

修正したプログラムでは、監視していた事象が起きると APITEST/JOBLOGMSGQ というメッセージ待ち行列にメッセージが送られるようにしています。

確認してみると、CPYF コマンドの結果、QTEMP/TEST1111 というファイルが作成され、QCUSTCDT テーブルからレコード(行)が 12行読み出された、ということがわかります。

メッセージの送信元を見てみましょう。

QSCWCHPS というジョブからメッセージが送られていることが確認できます。

念のため、さらに CPYF コマンドを別のジョブから実行してみましょう。

ちゃんと監視されてますね。

[Top Pageに戻る]

Ads by TOK2