是否可以让 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