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

问题描述 投票:0回答:1

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

谢谢

ibm-midrange jobs
1个回答
1
投票

是。有可能的。否。没有系统表。

您不需要预定的作业或表格即可执行自定义代码。创建一个消息队列,将QINACTMSGQ设置为指向该消息队列。然后,一个永无止境的批处理作业需要监视CPI1126消息。如果成功,则可以执行自定义代码。

IBM文档包含example。或者搜索“ QINACTMSGQ”。还有其他几个示例。

这是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
© www.soinside.com 2019 - 2024. All rights reserved.