WATCH ジョブのデバッグと可変長メッセージデータの受け取り (V7R1)

ジョブログの監視(WATCH) V6R1編」などで紹介した Watch 機能を使えば、データベースサーバージョブのレコードロックの監視と問題発生時の状況についての資料取得を行うことができます。

かなり大量のジョブがある環境でWatch を使用した監視を行ってみたことがありますが、まったくレスポンスの低下やシステム負荷の増加などは見られませんでした。(つまり、監視を行ったからといってCPUなどの使用率が上がったり、SQLの応答時間が長くなったり、ということはありませんでした。少なくとも Power5、Power7 では)


メッセージデータの受け取り方法

Watchで受け取るデータ構造の中に、Watchで監視しているメッセージのメッセージデータが入ってきます。

そのメッセージデータを取り出し、メッセージIDを指定してSNDPGMMSGコマンドを実行すれば、いわば“メッセージの転送”のようなことができるわけです。つまり、ジョブログに出たメッセージを QSYSOPR にそのまま転送することでができるんですね。

ジョブログの監視(WATCH) V6R1編の例でも、↓の部分でその“メッセージデータの取り出し”処理と“転送”処理を行っています。

             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)

固定長の場合

メッセージデータの中身は、各メッセージID(とメッセージファイル名)を指定してDSPMSGDコマンドを実行し、出てきた画面の「2. フィールド・データの表示」を見ればわかります。

上記リンクの例にあるCPF2880であれば、↓のような画面が出てきます。

↑の例で見れば、&MSGDTAをアタマから10桁づつ区切ればそれぞれがファイル名、ライブラリー名になる、ということを示しています。

固定長の場合は &MSGDTA をそのまま↓のようにパラメータ値を切り出せば OK です。

             CHGVAR     VAR(&FILE) VALUE(%SST(&MSGDTA  1 10))
             CHGVAR     VAR(&LIB)  VALUE(%SST(&MSGDTA 11 10))

可変長の場合

ほとんどは↑の例のように固定長で区切られているのですが、↓のように可変長のものもあります。
桁数が *VARY となっていることからわかりますね

可変長の場合は、各パラメータ値の前に2バイト(↑の「構成桁数」からわかります)余計についており、その2バイト内に該当パラメータ値の桁数が入っています。
コーディング例としては↓のようになります。

             CHGVAR     VAR(&LEN) VALUE(%BIN(&MSGDTA 1 2))                      
             CHGVAR     VAR(&STR) VALUE(3)                                      
             CHGVAR     VAR(&FILE) VALUE(%SST(&MSGDTA &STR &LEN))         
             CHGVAR     VAR(&STR) VALUE(&STR + &LEN)                            
             CHGVAR     VAR(&LEN) VALUE(%BIN(&MSGDTA &STR 2))                   
             CHGVAR     VAR(&STR) VALUE(&STR + 2)                               
             CHGVAR     VAR(&LIB) VALUE(%SST(&MSGDTA &STR &LEN))          
             CHGVAR     VAR(&STR) VALUE(&STR + &LEN)                            
             CHGVAR     VAR(&LEN) VALUE(%BIN(&MSGDTA &STR 2))                   
             CHGVAR     VAR(&STR) VALUE(&STR + 2)                               
             CHGVAR     VAR(&TYPE) VALUE(%SST(&MSGDTA &STR &LEN))    

バッチジョブのデバッグ

こうしたプログラムのデバッグには STRSRVJOB コマンドを使います。

STRWCH をした後で、

STRSRVJOB JOB(QSCWCHPS) と実行します。

ジョブが候補として複数出てきた場合は、最新のものを選んでおけば通常は OK です。

STRSRVJOB コマンドが実行されている状態で、STRDBG コマンドを実行します。

↓のようにデバッグ画面が出てくると思いますので、ここでブレイクポイント等の設定などを行います。F10 キーで抜ければアタマからのトレースになりますね。

レコードロックを発生させると(つまり、Watch の条件と合致すると)↓のように、STRDBG を実行した対話型ジョブで自動的にデバッガ画面が出てきます。

デバッグが終わったら、通常どおりの ENDDBG コマンドでデバッグを終了させ、ENDSRVJOB コマンドでバッチジョブへのサービス操作を終了させます。

[Top Pageに戻る]

Ads by TOK2