Tools

7. SNDLCKMSG ファイルを使用中のユーザーにメッセージを送る

「あるファイルを使用しているユーザーを調べるにはどのようにすればよいですか?」という質問が
多いのは、バッチ更新の前などに使用の中断をユーザーに促したいケースが多いからでは
ないだろうか?
BACKUP や月次更新などを行う前に更新ファイルなどを使用しているユーザーがあれば、

「月次更新を開始しますので5分以内に処理を中断してください。」

などと警告メッセージを自動的に送出したい。
WRKOBJLCK で使用中のユーザーを調べて手動で SNDMSG してもよいが無人でこれらを
行うことができるコマンドを紹介する。

SNDLCKMSG は使用中のユーザーがあるかどうかを調べて使用中のユーザーがあれば
指定したメッセージを、そのユーザーに送信することができる。
使用中のユーザーがあったかどうかも判断することができる。
運用面で定期的な処理の中に SNDLCKMSG を組み込んでおくと処理はスムースで安全な
ものになるに違いない。

次の画面はライブラリーQTRFIL のファイルSHOHIN を更新としてオープンしているユーザーに
警告メッセージを送信するための画面の使用例を示している。

オブジェクトユーザーが使用しているかどうか調べたいオブジェクト(ファイル)
ライブラリーオブジェクトのライブラリー
メンバーファイルのときに指定したいメンバーがあれば記入
オブジェクト・タイプ*FILE, *LIB, .... などのオブジェクトのタイプ
ロック状態オブジェクトのロック状態
メッセージ・テキストユーザーに送出するメッセージ
受け取りメッセージ
待ち行列
通常は *USER を指定
メッセージ・タイプ送出するメッセージのタイプ
【 SNDLCKMSG の使用例 】

実際に SNDLCKMSG を CLP の中で使用している例を紹介する。
この例では他のユーザーが使用できないように排他ロックを最初に試みて失敗すれば
SNDLCKMSG コマンドを使ってユーザーに使用中止を促す。
その後、30秒間待って再び ALCOBJ を試みる。
さらにまだユーザーが使用しているようであればSNDLCKMSG を繰り返す。
このようにして完全に ALCOBJ が成功するまで SNDLCKMSG が繰り返される。

ソースコード
             PGM                                                       
/*---------------------------------------------------------*/          
/*   TESTLCKMSG :  SNDLCKMSG  のテスト                     */          
/*---------------------------------------------------------*/          
             DCL        VAR(&MSG) TYPE(*CHAR) LEN(80)                  
                                                                       
 ALCOBJ:     ALCOBJ     OBJ((QTRFIL/SHOHIN *FILE *EXCL)) WAIT(0)       
             MONMSG     MSGID(CPF1000) EXEC(DO)                        
             SNDLCKMSG  OBJ(QTRFIL/SHOHIN) SRCMBR(SHOHIN) +            
                          MSG(' 商品マスターの使用を中止してください + 
                           。 ') MSGQ(*USER)                           
             DLYJOB     DLY(30)                                        
             GOTO       ALCOBJ                                         
             ENDDO                                                     
    /*( ここから何かの更新処理 )*/                                     
                                                                       
    /*( 更新処理の終了 )*/                                             
             DLCOBJ     OBJ((QTRFIL/SHOHIN *FILE *EXCL))               
             RETURN                                                    
             ENDPGM                                                    
【 導入の方法 】

コマンド SNDLCKMSG を導入して、

CRTCMD MYOBJLIB/SNDLCKMSG PGM(MYOBJLIB/SNDLCKMSGC)  SRCFILE(MYSRCLIB/QCMDSRC)
 AUT(*ALL)

でコンパイル

CLP SNDLCKMSGC を導入して、

CRTCLPGM MYOBJLIB/SNDLCKMSGC SRCFILE(MYSRCLIB/QCLSRC)  AUT(*ALL)

でコンパイル