代码之家  ›  专栏  ›  技术社区  ›  Mustapha George

As400用户不活动-捕获用户上次活动后的分钟数(QINACTITV)

  •  0
  • Mustapha George  · 技术社区  · 6 年前

    有没有可能让AS400(IBM i)使用QINACTITV系统值捕获自上次用户活动以来的分钟数,并从计划的作业中读回这些值以编写我们自己的自定义代码?此信息是否保存在特定的系统表中?

    谢谢您

    0 回复  |  直到 6 年前
        1
  •  1
  •   bdongus    6 年前

    对。这是可能的。没有。没有系统表。

    QINACTMSGQ 指向该消息队列。然后,无休止的批处理作业需要监视CPI1126消息。如果它有一个你可以执行你的自定义代码。

    IBM文档包含 example

    以下是来自IBM页面的CL示例:

    以下是执行以下操作的示例CL程序:

    • 将控制台和作业留给用户TAA。
    • 为用户CKOUR和CHANTHA向工作站发送中断消息。
    • 结束工作站P002039的所有作业。
    • 作为默认操作断开所有其他作业。

    PGM                                                                  
      DCL &THEQUEUE   *CHAR 20         /* QINACTMSGQ SYSTEM VALUE     */
      DCL &INACTLIB   *CHAR 10         /* QUEUE'S LIBRARY             */
      DCL &INACTQUEUE *CHAR 10         /* QUEUE NAME                  */
      DCL &INACTDATA  *CHAR 100        /* RAW MESSAGE DATA            */
      DCL &JOBNAME    *CHAR 10         /* INACTIVE JOB NAME           */
      DCL &USER       *CHAR 10         /* INACTIVE JOB USER           */
      DCL &NUMBER     *CHAR 6          /* INACTIVE JOB NUMBER         */
      DCL &MSGDTALEN  *DEC (5 0)                                        
      DCL &MSGID      *CHAR 7          /* MESSAGE TAKEN FROM THE QUEUE*/
    
     /*                                                            */    
     /* GET THE NAME OF THE QUEUE TO MONITOR FROM THE SYSTEM VALUE */    
     /*                                                            */    
      RTVSYSVAL  SYSVAL(QINACTMSGQ) RTNVAR(&THEQUEUE)                    
       CHGVAR &INACTQUEUE %SUBSTRING(&THEQUEUE 1  10)                    
      CHGVAR &INACTLIB   %SUBSTRING(&THEQUEUE 11 10)                    
    
     /*                                                            */    
     /* MAIN LOOP.                                                 */    
     /*                                                            */    
    LOOP:                                                                
     /*                                                            */    
     /* WAIT FOR MESSAGE ON THE MESSAGE QUEUE                      */    
     /*                                                            */    
      RCVMSG     MSGQ(&INACTLIB/&INACTQUEUE) WAIT(*MAX) +                
                 MSGDTA(&INACTDATA) MSGDTALEN(&MSGDTALEN) +              
                 MSGID(&MSGID)                                          
     /*                                                            */    
     /* CHECK TO SEE IF IT IS THE RIGHT MESSAGE, IF NOT, SKIP IT.  */    
      /*                                                            */    
      IF         (&MSGID *NE 'CPI1126') THEN(GOTO SKIP)                  
      CHGVAR &JOBNAME %SUBSTRING(&INACTDATA 1 10)   /* GET JOB NAME */  
      CHGVAR &USER    %SUBSTRING(&INACTDATA 11 10)  /* GET USER NAME*/  
      CHGVAR &NUMBER  %SUBSTRING(&INACTDATA 21 6)   /* GET JOB NUM  */  
      /*                                                             */  
     /* SPECIAL USERS                                               */  
     /*                                                             */  
      IF         (&USER *EQ 'TAA')      THEN(GOTO SKIP) /* leave alone*/
      IF         (&JOBNAME *EQ 'DSP01')  THEN(GOTO SKIP) /* console */  
      IF         (&USER *EQ 'CKOUR')    THEN(GOTO ACTION1)              
      IF         (&USER *EQ 'CHANTHA')  THEN(GOTO ACTION1)              
      IF         (&JOBNAME *EQ 'P002039')  THEN(GOTO ACTION2)          
     /*                                                             */  
     /* DEFAULT ACTION                                              */  
     /*                                                             */  
       DSCJOB     JOB(&NUMBER/&USER/&JOBNAME)  
        MONMSG CPF0000   /* VIRTUAL TERMINALS CANNOT BE DISCONNECTED */  
                         /* SO IGNORE ANY MESSAGES THAT MAY CAUSE    */  
       GOTO SKIP                                                        
     /*                                                             */  
    ACTION1:                                                            
        SNDBRKMSG  MSG('Chantha, you left your terminal on AGAIN!') +    
                  TOMSGQ(&JOBNAME)                                      
       GOTO SKIP                                                        
     /*                                                             */  
    ACTION2:                                                            
       ENDJOB     JOB(&NUMBER/&USER/&JOBNAME)                          
       GOTO SKIP                                                        
     /*                                                             */  
     /* OTHER ACTIONS GO HERE                                       */  
     /*                                                             */  
    
      SKIP:                                                            
    GOTO LOOP     /* GO GET MORE MESSAGES ABOUT OTHER TERMINALS */      
    
    ENDPGM