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)

でコンパイル