如何防止某些常駐程式被其他人不小心中斷後,能自動啟動而不用人工介入?(利用 API QMHSNDSM)
您的應用系統,有可能會有某些功能,例如每30分鐘做一次資料傳輸動作,或檢查某些作業的
狀態等。但當此程式被某些有 Job Control 權限的人不小心中斷時,也沒人通知您發生什麼事時,您的應用系統可能因此而停止服務,如資料無
法定時傳送或某些作業持續等待前一作業完成等。所以有必要開發一個能自動啟動的機制,讓
您能很安心的由系統幫您控制您的工作流程。
此自動啟動機制是利用 API QMHSNDSM Send Scopr Message,註冊一個 Exit Program,
可用於 Job,Program,Call Stack Entry 三個層次。範例如下:
File : QRPGLESRC
Member: SNDSCPMSGR 註冊 Exit Program
Type : RPGLE
Usage : 視您的需求可以更改 Source 中 "Library" Exit Program 的 Library *LIBL 至您自己的 Library
CRTBNDRPG SNDSCPMSGR
* ===================================================================
* = Program....... SamplePgm =
* = Description... Sample program demonstrating how to send a scope =
* = message to register an exit program =
* = =
* ===================================================================
D SndScopeMsgAPI...
D Pr ExtPgm( 'QMHSNDSM' )
D 10
D 20
D 10
D 10I 0
D 4
D 272
*Type *EXT for job level
* *PGM for current program
* *CSE for call stack entry
D Type S 10 Inz( '*EXT' )
D Program S 10 Inz( 'SNDSCPEXTC' )
D Library S 10 Inz( '*LIBL ' )
D QualPgm S 20
D Data S 10 Inz( 'Gary' )
D DataLen S 10I 0 Inz( %Len( Data ) )
D KeyVar S 4
D APIErrorDS DS
D BytesProvided 10I 0 Inz( %Size( APIErrorDS ) )
D BytesAvail 10I 0 Inz( *Zero )
D MsgID 7 Inz( *Blanks )
D 1 Inz( X'00' )
D MsgDta 256 Inz( *Blanks )
* ===================================================================
* = Send scope message to register exit program =
* ===================================================================
C Reset APIErrorDS
C Eval QualPgm = Program + Library
C CallP SndScopeMsgAPI(
C Type :
C QualPgm :
C Data :
C DataLen :
C KeyVar :
C APIErrorDS
C )
* ===================================================================
* = Your program logic goes here =
* ===================================================================
C Eval *InLR = *On
File : QCLSRC
Member: SNDSCPEXTC -- Scope Message Exit Progam
Type : CLP
Usage : CRTCLPGM SNDSCPEXTC
CRTDTAARA DTAARA(SCPMSGLOOP) TYPE(*CHAR) LEN(1) VALUE('Y') -- 為了測試需要,用於判斷此工作是否要再次啟動,
若不要,可輸入指令CHGDTAARA DTAARA(SCPMSGLOOP (1 1)) VALUE('N')
/* Scope Message Exit Program registered by SNDSCPMSGR */
PGM &INDATA
DCL &INDATA *CHAR 10
DCL &LOOP *CHAR 1
RTVDTAARA DTAARA(SCPMSGLOOP (1 1)) RTNVAR(&LOOP)
IF (&LOOP = 'Y') +
SBMJOB CMD(CALL SNDSCPMSGC) JOB(TESTSCPMSG)
RETURN
ENDPGM
File : QCLSRC
Member: SNDSCPMSGC -- 測試 Send Scope Message API
Type : CLP
Usage : CRTCLPGM SNDSCPMSGC
SBMJOB CMD(CALL SNDSCPMSGC) JOB(TESTSCPMSG)
WRKACTJOB 選擇 JOB TESTSCPMSG 輸入選項 4 結束該 Job,可以看見系統會呼叫
SNDSCPEXTC,當 Dataarea SCPMSGLOOP 值為 'Y' 時,系統會將原有功能再次啟動。
/* For test Send Scope Message to register Exit program */
/* SNDSCPMSGR to register *EXT for Job End Action */
/* SNDSCPEXTC to active for End Job event */
PGM
CALL SNDSCPMSGR
LOOP:
DLYJOB DLY(10)
GOTO LOOP
ENDPGM
A blog about IBM i (AS/400), MQ and other things developers or Admins need to know.
星期四, 11月 02, 2023
2002-06-25 如何防止某些常駐程式被其他人不小心中斷後,能自動啟動而不用人工介入?(利用 API QMHSNDSM)
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言