ジョブログの監視(WATCH)

監視(WATCH) という機能」で IBM i の「監視(WATCH)」という機能を簡単に紹介しました。

その記事でのサンプルコーディングは RPG でしたが、RPG でしか処理プログラムを実装できないというわけではありません。
CL でもコーディングできますし、後続の処理を何かさせたいような場合はかえって CL の方がやりやすいように思います。

今回は、ジョブログの監視の仕方、CL でのコーディング例、ということでの紹介です。

CL の場合、前回と同じように単純にメッセージの送信を行いたい時には、受け取ったパラメータから該当部分を切り出して SNDPGMMSG コマンドなどのパラメータにそのままセットして実行するだけなのでとてもシンプルなコーディングになります。

             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 SNDMSG)                       
      /* CPC2955 PF IS COPIED */                                                
             IF         COND((%SST(&TYPE 1 6) = '*MSGID') & (&MSGID +           
                          = 'CPC2955')) THEN(GOTO SNDMSG)                       
             ELSE       CMD(GOTO CMDLBL(EXIT))                                  
                                                                                
 SNDMSG:     DO                                                                 
                                                                                
             CHGVAR     VAR(&MSGTEXT) VALUE('The Next Message is +              
                          sent by ' || &JOBNBR |<  '/'  || +                    
                          &JOBUSER |<  '/'  || &JOBNAME)                        
             SNDPGMMSG  MSG(&MSGTEXT) MSGTYPE(*INFO)                            
                                                                                
             CHGVAR     VAR(&MSGDTAP) VALUE(%ADDR(&DATA))                       
             CHGVAR     VAR(%OFFSET(&MSGDTAP)) +                                
                          VALUE(%OFFSET(&MSGDTAP) + &OFFSET)                    
             SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGF) MSGDTA(&MSGDTA) +             
                          MSGTYPE(*INFO)                                        
             CHGVAR     VAR(&ERROR) VALUE('          ')                         
             GOTO       CMDLBL(EXIT)                                            
             ENDDO                                                              
                                                                                
 ERROR:      CHGVAR     VAR(&ERROR) VALUE('*ERROR    ')                         
                                                                                
 EXIT:       ENDPGM

↑の例は、システム上の複数のジョブを監視して、ある特定の処理を行った場合にそのジョブとメッセージを記録する、といったような処理になっています。
さらに &MSGDTA の内容を見て、特定のファイルに対しての処理だった場合にログする、といったことも可能ですね。

↓のように STRWCH コマンドを実行して監視(Watch)ジョブを開始させます。
対話型ジョブ(QPADEV で始まるジョブ)のジョブログをすべて監視する、という設定になっています。

STRWCH SSNID(WCH_CPYF) WCHPGM(APITEST/WCH_CPYF) WCHMSG((CPF2880) (CPC2955)) WCHMSGQ((*JOBLOG)) WCHJOB((*ALL/QPADEV*))

この例は単に監視を行っているジョブに情報メッセージとして SNDPGMSG しているだけですが、ここはもちろんいろんな記録/メッセージ方法が考えられますね。

[Top Pageに戻る]

Ads by TOK2