「あるファイルを使用しているユーザーを調べるにはどのようにすればよいですか?」という質問が
多いのは、バッチ更新の前などに使用の中断をユーザーに促したいケースが多いからでは
ないだろうか?
BACKUP や月次更新などを行う前に更新ファイルなどを使用しているユーザーがあれば、
などと警告メッセージを自動的に送出したい。
WRKOBJLCK で使用中のユーザーを調べて手動で SNDMSG してもよいが無人でこれらを
行うことができるコマンドを紹介する。
SNDLCKMSG は使用中のユーザーがあるかどうかを調べて使用中のユーザーがあれば
指定したメッセージを、そのユーザーに送信することができる。
使用中のユーザーがあったかどうかも判断することができる。
運用面で定期的な処理の中に SNDLCKMSG を組み込んでおくと処理はスムースで安全な
ものになるに違いない。
次の画面はライブラリーQTRFIL のファイルSHOHIN を更新としてオープンしているユーザーに
警告メッセージを送信するための画面の使用例を示している。
| オブジェクト | : | ユーザーが使用しているかどうか調べたいオブジェクト(ファイル) |
| ライブラリー | : | オブジェクトのライブラリー |
| メンバー | : | ファイルのときに指定したいメンバーがあれば記入 |
| オブジェクト・タイプ | : | *FILE, *LIB, .... などのオブジェクトのタイプ |
| ロック状態 | : | オブジェクトのロック状態 |
| メッセージ・テキスト | : | ユーザーに送出するメッセージ |
| 受け取りメッセージ 待ち行列 | : | 通常は *USER を指定 |
| メッセージ・タイプ | : | 送出するメッセージのタイプ |
実際に 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)
でコンパイル