星期四, 11月 02, 2023

2002-06-25 如何防止某些常駐程式被其他人不小心中斷後,能自動啟動而不用人工介入?(利用 API QMHSNDSM)


如何防止某些常駐程式被其他人不小心中斷後,能自動啟動而不用人工介入?(利用 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



沒有留言: