監視(WATCH) という機能

V5R4 くらいから「監視(WATCH)」という機能があり、その名のとおりシステムの各所で起きている"メッセージ"を監視させることができるようになっています。

STRWCH というコマンドを使用して、監視したメッセージ ID と、そのメッセージが送られてくる、監視対象となるメッセージ待ち行列を指定し、そのメッセージが到着した時に呼び出して処理をさせたいプログラムを指定します。(プログラムは自作します)

パラメーター

キーワード 記述 選択項目 ノーツ
SSNID セッションID 名前, *GEN 必須, 定位置 1
WCHPGM 監視プログラム 修飾オブジェクト名 必須, 定位置 2
修飾子 1: 監視プログラム 名前
修飾子 2: ライブラリー 名前, *LIBL, *CURLIB
CALLWCHPGM 監視プログラムの呼び出し 単一値: *WCHEVT
その他の値 (最大 2 回の繰り返し): *STRWCH, *ENDWCH
オプショナル
WCHMSG メッセージの監視 単一値: *NONE
その他の値 (最大 5 回の繰り返し): 要素リスト
オプショナル
要素 1: メッセージ識別コード 名前
要素 2: 比較データ 文字値, *NONE
要素 3: 比較対象 *MSGDTA, *FROMPGM, *TOPGM
WCHMSGQ 監視されたメッセージ待ち行列 値 (最大 3 回の繰り返し): 要素リスト オプショナル
要素 1: MSG 待ち行列 単一値: *SYSOPR, *JOBLOG, *HSTLOG
その他の値: 修飾オブジェクト名
修飾子 1: MSG 待ち行列 名前
修飾子 2: ライブラリー 名前, *LIBL
WCHJOB 監視されたジョブ 単一値: *
その他の値 (最大 5 回の繰り返し): 要素リスト
オプショナル
要素 1: ジョブ名 修飾ジョブ名
修飾子 1: ジョブ名 総称名, 名前, *ALL
修飾子 2: ユーザー 総称名, 名前, *ALL
修飾子 3: 番号 000001-999999, *ALL
WCHLICLOG LICログ項目の監視 単一値: *NONE
その他の値 (最大 5 回の繰り返し): 要素リスト
オプショナル
要素 1: メジャー コード 文字値, *ALL
要素 2: マイナー コード 文字値, *ALL
要素 3: 比較データ 文字値, *NONE
要素 4: 比較対象 *ALL, *TDENBR, *TASKNAME, *SVRTYPE, *JOBNAME, *JOBUSR, *JOBNBR, *THDID, *EXCPID, *MODNAME, *MODRUNAME, *MODEPNAME, *MODOFFSET, *MODTSP
WCHPAL PAL項目の監視 単一値: *NONE
その他の値 (最大 5 回の繰り返し): 要素リスト
オプショナル
要素 1: システム参照コード 文字値, *ALL
要素 2: 比較データ 文字値, *NONE
要素 3: 比較対象 *RSCNAME, *RSCTYPE, *RSCMODEL
RUNPTY 実行優先順位 1-99, 25 オプショナル

WCHMSGQ パラメータに "*JOBLOG" とあるのがわかりますね?!
その後に WCHJOB というパラメータもありますが、このことからすべての/特定のジョブの特定のメッセージを監視することもできるわけです。(今回は紹介しませんが)

たとえば、誰かがあるファイルをコピーするとジョブログには"xxx ファイルがコピーされた"旨のメッセージが出てきますよね??
これを監視しておけば… 他のシステムでここまで強力な監視の仕掛けはないような気がしますね。これはかなり凄いものです。

プログラムの仕様

指定されたプログラムはそのメッセージが到着すると呼び出されるわけで、言ってみればイベント起動型のプログラムになります。

監視プログラムは,次の場合に呼び出されます。

  • WCHMSGパラメーターに指定されたメッセージIDおよび関連する比較データの一致,WCHLICLOGパラメーターに指定されたライセンス内部コード(LIC)ログ項目および関連する比較データの一致,または,WCHPALパラメーターに指定されたプロダクト活動ログ(PAL)項目および関連する比較データの一致が発生した後。
  • 監視プログラムの呼び出し (CALLWCHPGM)パラメーターに監視プログラムが定義された場合。

以下のパラメーターと共に呼び出されるので、それに応じた処理をコーディングします。

監視プログラムに関連して3つの入力パラメーターと1つの出力パラメーターがあります。この4つのパラメーターは必須です。

1   監視オプション設定   入力  CHAR(10)
2   セッションID         入力  CHAR(10)
3   エラー検出           出力  CHAR(10)
4   イベント・データ     入力  CHAR(*)

「1 監視オプション設定」ですが、↓のような内容が送られてきます。
いくつかのメッセージで共通のプログラムを作成し、呼び出しタイプによって処理を変えることが可能なわけですね。

「監視オプション設定」パラメーターで許可される値は次の通りです。

*MSGID
WCHMSGパラメーターに指定されたメッセージIDおよび関連する比較データの一致が発生した。
*LICLOG
WCHLICLOGパラメーターに指定されたLICログおよび関連する比較データの一致が発生した。
*PAL
WCHPALパラメーターに指定されたプロダクト活動ログ(PAL)および関連する比較データの一致が発生した。
*STRWCH
監視プログラムは,イベントの監視を開始する前に呼び出されます。
*ENDWCH
監視プログラムは,監視セッションが終了するときに呼び出されます。考えられる理由は次のとおりです。
  • 監視の終了(ENDWCH)コマンドまたは監視の終了(QSCEWCH) APIが発行された。
  • 1つ以上のイベント監視ジョブが異常終了したか,ユーザー処置によって終了させられた。

注:監視セッションは,監視出口プログラムでエラーが検出されたために終了することもあります。その場合,監視プログラムは*ENDWCH時に呼び出されません。

「2 セッションID」の内容です。

「セッションID」パラメーターには,ユーザー出口プログラムを呼び出している監視セッションの名前が入れられます。

「3 エラー検出」の内容です。

「エラーの検出」パラメーターで許可される値は次の通りです。

*ERROR
監視出口プログラムによって検出されたエラー。セッションIDパラメーターで渡された監視セッションは終了します。終了される監視セッションで当初から複数のメッセージIDまたはLICログ項目またはPAL項目,が指定されていた場合には,それらがすべて監視されなくなります。監視セッション終了の原因となった出口プログラム内でのエラーを示すCPI3999メッセージがジョブ・ログおよびヒストリー・ログに送られます。
<ブランク>
監視出口プログラムによって検出されたエラーはありません。

注:

  • "*ERROR"または<ブランク>以外の値はすべてエラーとみなされ,セッションIDパラメーターを渡した監視セッションは終了されます。終了される監視セッションで当初から複数のメッセージIDまたはLICログ項目またはPAL項目,が指定されていた場合には,それらがすべて監視されなくなります。監視セッション終了の原因となった出口プログラム内でのエラーを示すCPI3999メッセージがジョブ・ログおよびヒストリー・ログに送られます。

「4 イベント・データ」の内容ですが、「1 監視オプション設定」で送られてきた内容によって形式が異なります。

「監視オプション設定」パラメーターに*MSGIDが指定された時に「イベント・データ」パラメーターで許可される値は次の構造となります。

オフセット  タイプ          フィールド
DEC HEX
  0    0   BINARY(4)    監視情報の長さ
  4    4   CHAR(7)      メッセージID
 11    B   CHAR(1)      予約済み
 12    C   CHAR(10)     メッセージ待ち行列名
 22   16   CHAR(10)     メッセージ待ち行列ライブラリー
 32   20   CHAR(10)     ジョブ名
 42   2A   CHAR(10)     ユーザー名
 52   34   CHAR(6)      ジョブ番号
 58   3A   CHAR(4)      予約済み
 62   3E   CHAR(256)    送信プログラム名
318  13E   CHAR(10)     送信モジュール名
328  148   BINARY(4)    送信プロシージャー名へのオフセット
332  14C   BINARY(4)    送信プロシージャー名の長さ
336  150   CHAR(10)     受信プログラム名
346  15A   CHAR(10)     受信モジュール名
356  164   BINARY(4)    受信プロシージャー名へのオフセット
360  168   BINARY(4)    受信プロシージャー名の長さ
364  16C   BINARY(4)    メッセージ重大度
368  170   CHAR(10)     メッセージ・タイプ
378  17A   CHAR(8)      メッセージのタイム・スタンプ
386  182   CHAR(4)      メッセージ・キー
390  186   CHAR(10)     メッセージ・ファイル名
400  190   CHAR(10)     メッセージ・ファイル・ライブラリー
410  19A   CHAR(2)      予約済み
412  19C   BINARY(4)    比較データへのオフセット
416  1A0   BINARY(4)    比較データの長さ
420  1A4   CHAR(10)     比較対象
430  1AE   CHAR(2)      予約済み
432  1B0   BINARY(4)    比較データのCCSID
436  1B4   BINARY(4)    比較データが見つからない位置のオフセット
440  1B8   BINARY(4)    置換データへのオフセット
444  1BC   BINARY(4)    置換データの長さ
448  1C0   BINARY(4)    置換データのCCSID
452  1C4   CHAR(10)     送信ユーザー・プロファイル
462  1CE   CHAR(10)     ターゲットのジョブ名
472  1D8   CHAR(10)     ターゲットのジョブ・ユーザー名
482  1E2   CHAR(6)      ターゲットのジョブ番号
 *   *     CHAR(*)      送信プロシージャー名
 *   *     CHAR(*)      受信プロシージャー名
 *   *     CHAR(*)      メッセージ比較データ
 *   *     CHAR(*)      メッセージ置換データ

「監視オプション設定」パラメーターに*LICLOGが指定された時に「イベント・データ」パラメーターで許可される値は次の構造となります。

オフセット  タイプ          フィールド
DEC HEX
  0    0   BINARY(4)    監視情報の長さ
  4    4   CHAR(4)      LICログ・メジャー・コード
  8    8   CHAR(4)      LICログ・マイナー・コード
 12    C   CHAR(8)      LICログID
 20   14   CHAR(8)      LICログのタイム・スタンプ
 28   1C   CHAR(8)      TDE番号
 36   24   CHAR(16)     タスク名
 52   34   CHAR(30)     サーバー・タイプ
 82   52   CHAR(2)      例外ID
 84   54   CHAR(10)     LICジョブ名
 94   5E   CHAR(10)     LICユーザー名
104   68   CHAR(6)      LICジョブ番号
110   6E   CHAR(4)      予約済み
114   72   CHAR(8)      スレッドID
122   7A   CHAR(8)      LICモジュールのコンパイル・タイム・スタンプ
130   82   CHAR(8)      LICモジュールのオフセット
138   8A   CHAR(8)      LICモジュールのRU名
146   92   CHAR(48)     LICモジュール名
194   DA   CHAR(128)    LICモジュールの入り口点名
322  142   CHAR(1)      LICログ比較の対象の指定
323  143   CHAR(1)      予約済み
324  144   BINARY(4)    比較データへのオフセット
328  148   BINARY(4)    比較データの長さ
332  14C   CHAR(10)     LICログ比較対象
 *   *     CHAR(*)      LICログ比較データ

「監視オプション設定」パラメーターに*PALが指定された時に「イベント・データ」パラメーターで許可される値は次の構造となります。

オフセット  タイプ          フィールド
DEC HEX
  0    0   BINARY(4)    監視情報の長さ
  4    4   CHAR(8)      システム参照コード
 12    C   CHAR(10)     装置名
 22   16   CHAR(4)      装置タイプ
 26   1A   CHAR(4)      型式
 30   1E   CHAR(15)     製造番号
 45   2D   CHAR(10)     資源名
 55   37   CHAR(8)      ログID
 63   3F   CHAR(8)      PALタイム・スタンプ
 71   47   CHAR(4)      参照コード
 75   4B   CHAR(8)      2次コード
 83   53   CHAR(8)      テーブルID
 91   5B   CHAR(1)      予約済み
 92   5C   BINARY(4)    順序
 96   60   BINARY(4)    比較データへのオフセット
 100  64   BINARY(4)    比較データの長さ
 104  68   CHAR(10)     PAL比較対象
 *   *     CHAR(*)      PAL比較データ

「監視オプション設定」パラメーターに*STRWCHまたは*ENDWCHが指定された時に「イベント・データ」パラメーターで許可される値は次の構造となります。

オフセット  タイプ       フィールド
DEC HEX
  0    0   BINARY(4)    監視情報の長さ
(ここでは常に4)

「1 監視オプション設定」で *MSGID が送られてくるものに対応する場合は、↓のようなパラメーターの指定になります。

     D wch_strend      PI                                                                           
     D  pType                        10                                                             
     D  pSession                     10                                                             
     D  pError                       10                                                             
     D  pData                              LIKEDS(DATA)                                             
      *                                                                                             
     D data            DS          1000    qualified                                                
     D  msgid                         7    OVERLAY(data:5)                                          
     D  msgf                         10    OVERLAY(data:391)                                        
     D  msgseverity                  10i 0 OVERLAY(data:365)                                        
     D  msgtype                      10a   OVERLAY(data:369)                                        
     D  msgtimestamp                  8a   OVERLAY(data:379)                                        
     D  msgkey                        4a   OVERLAY(data:387)                                        
     D  offset                       10i 0 OVERLAY(data:441)                                        
     D  length                       10i 0 OVERLAY(data:445)                                        
     D  job                          10    OVERLAY(data:33)                                         
     D  jobusr                       10    OVERLAY(data:43)                                         
     D  jobnbr                        6    OVERLAY(data:53)                                         
     D  sndPgmName                  256    OVERLAY(data:63)                                         
     D  sndModName                   10    OVERLAY(data:319)                                        
     D  ofssndprocnm                 10i 0 OVERLAY(data:329)                                        
     D  lensndprocnm                 10i 0 OVERLAY(data:329)                                        
     D  rcvpgmname                   10    OVERLAY(data:337)                                        
     D  rcvmodname                   10    OVERLAY(data:347)                                        
     D  ofsrcvprocnm                 10i 0 OVERLAY(data:357)                                        
     D  lenrcvprocnm                 10i 0 OVERLAY(data:361)                                        

コーディング例

メッセージ ID で、メッセージデータをそのまま受け取るような形になりますので、SNDPGMMSG コマンドやその同等 API にそのまま内容を引き渡してあげれば、メッセージのブローカーのようなことが可能になります。

     H DFTACTGRP(*NO)
      *
     D wch_strend      PR
     D  type                         10
     D  session                      10
     D  error                        10
     D  data                               LIKEDS(DATA)
     D wch_strend      PI
     D  pType                        10
     D  pSession                     10
     D  pError                       10
     D  pData                              LIKEDS(DATA)
      *
     D data            DS          1000    qualified
     D  msgid                         7    OVERLAY(data:5)
     D  msgf                         10    OVERLAY(data:391)
     D  msgseverity                  10i 0 OVERLAY(data:365)
     D  msgtype                      10a   OVERLAY(data:369)
     D  msgtimestamp                  8a   OVERLAY(data:379)
     D  msgkey                        4a   OVERLAY(data:387)
     D  offset                       10i 0 OVERLAY(data:441)
     D  length                       10i 0 OVERLAY(data:445)
     D  job                          10    OVERLAY(data:33)
     D  jobusr                       10    OVERLAY(data:43)
     D  jobnbr                        6    OVERLAY(data:53)
     D  sndPgmName                  256    OVERLAY(data:63)
     D  sndModName                   10    OVERLAY(data:319)
     D  ofssndprocnm                 10i 0 OVERLAY(data:329)
     D  lensndprocnm                 10i 0 OVERLAY(data:329)
     D  rcvpgmname                   10    OVERLAY(data:337)
     D  rcvmodname                   10    OVERLAY(data:347)
     D  ofsrcvprocnm                 10i 0 OVERLAY(data:357)
     D  lenrcvprocnm                 10i 0 OVERLAY(data:361)
      *
     D pMsgdta         S               *
     D msgdta          DS            75    based(pMsgdta)
      * depends on what MSGID you watch
     D* usrprf                       10    OVERLAY(msgdta:11)
     D* device                       10    OVERLAY(msgdta:21)
      *
     D CPF1124         DS                  based(pMsgdta) qualified
     D  job                          10
     D  user                         10
     D  jobno                         6
     D  time_in_sbs                   8
     D  date_in_sbs                   8
     D  time_in_sys                   8
     D  date_in_sys                   8
     D  sbs                          10
     D  sbslib                       10
      *
     D CPF1164         DS                  based(pMsgdta) qualified
     D  job                          10
     D  user                         10
     D  jobno                         6
     D  time_out_sys                  8
     D  date_out_sys                  8
     D  sec                          10i 0
     D  rtgstps                       5i 0
     D  endcode                       5i 0
     D  endcode2                      5i 0
      *
     D APIErr          DS                  qualified
     D  ErrSize                      10i 0 inz(%size(APIErr))
     D  Errlen                       10i 0 inz(0)
     D  ErrID                         7a
     D  rsvd                          1a
     D  ErrData                   32767a
      *
     D SndPgmMsg       PR                  EXTPGM('QMHSNDPM')
     D  MsgID                         7a   Const
     D  QualMsgF                     20a   Const
     D  MsgDta                      256a   Const
     D  MsgDtaLen                    10i 0 Const
     D  MsgType                      10a   Const
     D  CallStkEntry                 10a   Const
     D  CallStkCount                 10i 0 Const
     D  MsgKey                        4a   Const
     D  ErrorCode                          like(APIErr)
      *
     D MsgKey          S              4a
      *
      /free

          // Job Started (CPF1124)
          if (%trimR(pType) = '*MSGID' and pData.msgid = 'CPF1124');

              pMsgdta = %addr(pData) + pData.offset;

              SndPgmMsg( 'CPF1124' :
                         'QCPFMSG   *LIBL' :
                         %trimR(%trim(CPF1124)) :
                         %len(%trimR(%trim(CPF1124))) :
                         '*INFO' :
                         '*PGMBDY' :
                         1 :
                         MsgKey :
                         APIErr );

              pError = *blanks;

          elseif

          // Job Ended (CPF1164)
             (%trimR(pType) = '*MSGID' and pData.msgid = 'CPF1164');

              pMsgdta = %addr(pData) + pData.offset;

              SndPgmMsg( 'CPF1164' :
                         'QCPFMSG   *LIBL' :
                         %trimR(%trim(CPF1164)) :
                         %len(%trimR(%trim(CPF1164))) :
                         '*INFO' :
                         '*PGMBDY' :
                         1 :
                         MsgKey :
                         APIErr );

              pError = *blanks;

          endif;

          *inLR = *on;
          return;

      /end-free

多少実用的に変えてみたのが↓です。
データベーステーブルにログすることも簡単にできます。

      *                                                                                             
      *     CREATE TABLE APITEST/JOBSTR                                                             
      *            (JOB CHAR (10 ) NOT NULL WITH DEFAULT,                                           
      *             USR CHAR (10 ) NOT NULL WITH DEFAULT,                                           
      *             JOBNO CHAR (6 ) NOT NULL WITH DEFAULT,                                          
      *             SBSTIME CHAR (8 ) NOT NULL WITH DEFAULT,                                        
      *             SBSDATE CHAR (8 ) NOT NULL WITH DEFAULT,                                        
      *             SYSTIME CHAR (8 ) NOT NULL WITH DEFAULT,                                        
      *             SYSDATE CHAR (8 ) NOT NULL WITH DEFAULT,                                        
      *             SBSD CHAR (10 ) NOT NULL WITH DEFAULT,                                          
      *             SBSLIB CHAR (10 ) NOT NULL WITH DEFAULT,                                        
      *             KEY_TIMESTAMP TIMESTAMP NOT NULL WITH DEFAULT)                                  
      *                                                                                             
      *     CREATE TABLE APITEST/JOBEND                                                             
      *            (JOB CHAR (10 ) NOT NULL WITH DEFAULT,                                           
      *             USR CHAR (10 ) NOT NULL WITH DEFAULT,                                           
      *             JOBNO CHAR (6 ) NOT NULL WITH DEFAULT,                                          
      *             SYSTIME CHAR (8 ) NOT NULL WITH DEFAULT,                                        
      *             SYSDATE CHAR (8 ) NOT NULL WITH DEFAULT,                                        
      *             JOBRUN DEC (10, 0),                                                             
      *             RTGSTPS DEC (5, 0),                                                             
      *             ENDCODE DEC (5, 0),                                                             
      *             ENDCODE2 DEC (5, 0),                                                            
      *             KEY_TIMESTAMP TIMESTAMP NOT NULL WITH DEFAULT)                                  
      *                                                                                             
      *     STRWCH SSNID(WCH_STREND) WCHPGM(APITEST/WCH_STREND)                                     
      *            WCHMSG((CPF1124) (CPF1164)) WCHMSGQ((*HSTLOG))                                   
      *                                                                                             
      *     You can see this WCH working under QUSRWRK by WRKWCH *ALL                               
      *                                                                                             
     H DFTACTGRP(*NO)                                                                               
      *                                                                                             
     D wch_strend      PR                                                                           
     D  type                         10                                                             
     D  session                      10                                                             
     D  error                        10                                                             
     D  data                               LIKEDS(DATA)                                             
     D wch_strend      PI                                                                           
     D  pType                        10                                                             
     D  pSession                     10                                                             
     D  pError                       10                                                             
     D  pData                              LIKEDS(DATA)                                             
      *                                                                                             
     D data            DS          1000    qualified                                                
     D  msgid                         7    OVERLAY(data:5)                                          
     D  msgf                         10    OVERLAY(data:391)                                        
     D  msgseverity                  10i 0 OVERLAY(data:365)                                        
     D  msgtype                      10a   OVERLAY(data:369)                                        
     D  msgtimestamp                  8a   OVERLAY(data:379)                                        
     D  msgkey                        4a   OVERLAY(data:387)                                        
     D  offset                       10i 0 OVERLAY(data:441)                                        
     D  length                       10i 0 OVERLAY(data:445)                                        
     D  job                          10    OVERLAY(data:33)                                         
     D  jobusr                       10    OVERLAY(data:43)                                         
     D  jobnbr                        6    OVERLAY(data:53)                                         
     D  sndPgmName                  256    OVERLAY(data:63)                                         
     D  sndModName                   10    OVERLAY(data:319)                                        
     D  ofssndprocnm                 10i 0 OVERLAY(data:329)                                        
     D  lensndprocnm                 10i 0 OVERLAY(data:329)                                        
     D  rcvpgmname                   10    OVERLAY(data:337)                                        
     D  rcvmodname                   10    OVERLAY(data:347)                                        
     D  ofsrcvprocnm                 10i 0 OVERLAY(data:357)                                        
     D  lenrcvprocnm                 10i 0 OVERLAY(data:361)                                        
      *                                                                                             
     D pMsgdta         S               *                                                            
     D msgdta          DS            75    based(pMsgdta)                                           
      * depends on what MSGID you watch                                                             
      *                                                                                             
     D CPF1124         DS                  based(pMsgdta) qualified                                 
     D  job                          10                                                             
     D  user                         10                                                             
     D  jobno                         6                                                             
     D  time_in_sbs                   8                                                             
     D  date_in_sbs                   8                                                             
     D  time_in_sys                   8                                                             
     D  date_in_sys                   8                                                             
     D  sbs                          10                                                             
     D  sbslib                       10                                                             
      *                                                                                             
     D CPF1164         DS                  based(pMsgdta) qualified                                 
     D  job                          10                                                             
     D  user                         10                                                             
     D  jobno                         6                                                             
     D  time_out_sys                  8                                                             
     D  date_out_sys                  8                                                             
     D  sec                          10i 0                                                          
     D  rtgstps                       5i 0                                                          
     D  endcode                       5i 0                                                          
     D  endcode2                      5i 0                                                          
      *                                                                                             
     D APIErr          DS                  qualified                                                
     D  ErrSize                      10i 0 inz(%size(APIErr))                                       
     D  Errlen                       10i 0 inz(0)                                                   
     D  ErrID                         7a                                                            
     D  rsvd                          1a                                                            
     D  ErrData                   32767a                                                            
      *                                                                                             
     D SndPgmMsg       PR                  EXTPGM('QMHSNDPM')                                       
     D  MsgID                         7a   Const                                                    
     D  QualMsgF                     20a   Const                                                    
     D  MsgDta                      256a   Const                                                    
     D  MsgDtaLen                    10i 0 Const                                                    
     D  MsgType                      10a   Const                                                    
     D  CallStkEntry                 10a   Const                                                    
     D  CallStkCount                 10i 0 Const                                                    
     D  MsgKey                        4a   Const                                                    
     D  ErrorCode                          like(APIErr)                                             
      *                                                                                             
     D MsgKey          S              4a                                                            
      *                                                                                             
      /free                                                                                         
                                                                                                    
          // Job Started (CPF1124)                                                                  
          if (%trimR(pType) = '*MSGID' and pData.msgid = 'CPF1124');                                
                                                                                                    
              pMsgdta = %addr(pData) + pData.offset;                                                
                                                                                                    
              exec SQL                                                                              
                   INSERT INTO APITEST/JOBSTR                                                       
                     VALUES(                                                                        
                           :CPF1124.job,                                                            
                           :CPF1124.user,                                                           
                           :CPF1124.jobno,                                                          
                           :CPF1124.time_in_sbs,                                                    
                           :CPF1124.date_in_sbs,                                                    
                           :CPF1124.time_in_sys,                                                    
                           :CPF1124.date_in_sys,                                                    
                           :CPF1124.sbs,                                                            
                           :CPF1124.sbslib,                                                         
                           CURRENT_TIMESTAMP                                                        
                          ) ;                                                                       
                                                                                                    
              SndPgmMsg( 'CPF1124' :                                                                
                         'QCPFMSG   *LIBL' :                                                        
                         %trimR(%trim(CPF1124)) :                                                   
                         %len(%trimR(%trim(CPF1124))) :                                             
                         '*INFO' :                                                                  
                         '*PGMBDY' :                                                                
                         1 :                                                                        
                         MsgKey :                                                                   
                         APIErr );                                                                  
                                                                                                    
              pError = *blanks;                                                                     
                                                                                                    
          elseif                                                                                    
                                                                                                    
          // Job Ended (CPF1164)                                                                    
             (%trimR(pType) = '*MSGID' and pData.msgid = 'CPF1164');                                
                                                                                                    
              pMsgdta = %addr(pData) + pData.offset;                                                
                                                                                                    
              exec SQL                                                                              
                   INSERT INTO APITEST/JOBEND                                                       
                     VALUES(                                                                        
                           :CPF1164.job,                                                            
                           :CPF1164.user,                                                           
                           :CPF1164.jobno,                                                          
                           :CPF1164.time_out_sys,                                                   
                           :CPF1164.date_out_sys,                                                   
                           :CPF1164.sec,                                                            
                           :CPF1164.rtgstps,                                                        
                           :CPF1164.endcode,                                                        
                           :CPF1164.endcode2,                                                       
                           CURRENT_TIMESTAMP                                                        
                          ) ;                                                                       
                                                                                                    
              SndPgmMsg( 'CPF1164' :                                                                
                         'QCPFMSG   *LIBL' :                                                        
                         %trimR(%trim(CPF1164)) :                                                   
                         %len(%trimR(%trim(CPF1164))) :                                             
                         '*INFO' :                                                                  
                         '*PGMBDY' :                                                                
                         1 :                                                                        
                         MsgKey :                                                                   
                         APIErr );                                                                  
                                                                                                    
              pError = *blanks;                                                                     
                                                                                                    
          endif;                                                                                    
                                                                                                    
          *inLR = *on;                                                                              
          return;                                                                                   
                                                                                                    
      /end-free

実行例

V5R4 のシステムでの STRWCH コマンドの実行例です。

WRKWCH コマンドで状況の確認ができます。

QUSRWRK サブシステムのもとで稼動する 1ジョブになるわけですね。(これは V5R4での挙動で V6R1では変わっています)

V5R4 では 1ジョブになるので、そのジョブログを定期的にチェックするようなイメージで↑のプログラムを作成したのですが、V6R1 ではジョブログが事前開始ジョブに分散してしまうのであまりうまい方法ではなくなってしまいました。
メッセージについては、プログラム・メッセージ待ち行列ではなく、QSYSOPR とか特定のメッセージ待ち行列とかを使用するようにするのがよいのかもしれませんね。

[Top Pageに戻る]

Ads by TOK2