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



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

谢谢

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

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

IBM 文档包含一个示例。或者搜索"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

最新更新