免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xuguopeng
打印 上一主题 下一主题

关于MONMSG的问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2004-10-19 10:00 |只看该作者

关于MONMSG的问题

原帖由 "yoyoage" 发表:
没有declare语句当然就应该作为程序的第一个语句了。
表达的更准确些,就是把它作为第一个可执行的语句。:)


  1. *************** Beginning of data *************************************
  2. 0001.00   /************************************************************/        
  3. 0002.00   /**  DAILY JOB                                             **/        
  4. 0003.00   /**  PGM ID         DOMINO_ONLINE                          **/        
  5. 0004.00   /**  PGM NAME       DAILY DOMINO ONLINE                    **/        
  6. 0005.00   /**--------------------------------------------------------**/        
  7. 0006.00   /**  PGM DESCRRIPTION                                      **/        
  8. 0007.00   /**                                                        **/        
  9. 0008.00   /**  CREATION DATE     04/10/14                            **/        
  10. 0009.00   /**  PROGRAMMER NAME   QINGZHOU                            **/        
  11. 0010.00   /**  UPDATE   DATE                                         **/              
  12. 0011.00   /************************************************************/        
  13. 0012.00              PGM                                                        
  14. 0013.00                                                                    
  15. 0014.00              DCL        VAR(&DAY) TYPE(*CHAR) LEN(4)                    
  16. 0015.00                                                                    
  17. 0016.00              MONMSG     MSGID(CPF0000)                                 
  18. 0017.00                                                                  
  19. 0018.00              CHGJOB     OUTQ(QPRINT)                                    
  20. 0019.00                                                                          
  21. 0020.00 /*   DOMINO ONLINE START   */                  
  22. 0021.00                        
  23. 0022.00              STRDOMSVR  SVR(Domino_Server_Name)
  24. 0023.00              MONMSG     MSGID(CPF0000)   
  25. 0024.00                    
  26. 0025.00/*    OTHER SBSD START      */
  27. 0026.00
  28. 0027.00              QSYS/STRSBS SBSD(QINTER)
  29. 0028.00              MONMSG      MSGID(CPF0000)  
  30. 0029.00                    
  31. 0030.00  ENDPGM:     ENDPGM                                                      
  32.         ****************** End of data ****************************************
复制代码

另外,guopeng,  "MONMSG  MSGID(CPF0000)" = "忽略所有的CFP****"???     

论坛徽章:
0
22 [报告]
发表于 2004-10-19 10:57 |只看该作者

关于MONMSG的问题

  1. 0014.00              DCL        VAR(&DAY) TYPE(*CHAR) LEN(4)                    
  2. 0015.00                                                                    
  3. 0016.00              MONMSG     MSGID(CPF0000)   
复制代码


这有必要么??

MONMSG CPF0000难道不是监控所有CPF开头的MSG么???

    

论坛徽章:
0
23 [报告]
发表于 2004-10-19 11:27 |只看该作者

关于MONMSG的问题

Beginning of the program
-- Program level MONMSG , monitor message sent by all of commands in the program (maximum of 100).

Following the command
-- Command level MONMSG, override a  program-level MONMSG command

If zeros are specified in either two or all four of the rightmost
positions, such as ppmm00, a generic message identifier is      
specified.  For example, if CPF0000 is specified, all the CPF   
messages are monitored.                                          


Refer to the MONMSG online help...

论坛徽章:
0
24 [报告]
发表于 2004-10-19 12:45 |只看该作者

关于MONMSG的问题

我就是这么理解的呀 所以我才问为什么我用了MONMSG CPF0000后他还报CPF3777??

感觉好象大家都没听懂我问的是什么呀?

论坛徽章:
0
25 [报告]
发表于 2004-10-19 12:55 |只看该作者

关于MONMSG的问题

原帖由 "xuguopeng" 发表:
这有必要么??
  1. 0014.00              DCL        VAR(&DAY) TYPE(*CHAR) LEN(4)                    
  2. 0015.00                                                                    
  3. 0016.00              MONMSG     MSGID(CPF0000)   
复制代码

MONMSG CPF0000难道不是监控所有CPF开头的MSG么???     


有“MONMSG MSGID(CPF0000)”紧跟DCL定义变量的语句之后,是表示对整个CLP程序的全局所有CPF****错误信息进行监控。

一般我们在开发PGM时,一个好的习惯是尽量规范程序的编写(含注释习惯),同时也尽量做到程序每一步骤出错时能够监管。     

“MONMSG CPF0000难道不是监控所有CPF开头的MSG么???”这句话很正确。     
但是“我就是不明白, 明明这样可以忽略CPF*的MSG 可还是报CPF3777了。。。。 ”这句话让我陷入了迷茫~~~     
stephenxie2003 该用户已被删除
26 [报告]
发表于 2004-10-20 10:37 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
27 [报告]
发表于 2004-10-22 10:34 |只看该作者

关于MONMSG的问题

xu兄,我们继续讨论这个问题,我觉得关于MONMSG很常用但又很实用、很重要。     

以下是关于MONMSG用法的详细解答,看看他们是怎么说的~~~

=========================================================
8.3  在CL过程或程序中监控信息

可在过程或程序中用命令,或在另外的过程或程序中的命令来监控送到过程或程序中的逃逸、通知和状态信息。MONMSG命令监控在命令中规定条件的送往调用信息队列中的信息,如果条件存在,则运行MONMSG中规定的命令。MONMSG的功能如下:

逃逸信息:它告诉过程或程序有错误条件发生,强行结束发送者。要监控这类信息,你要采取适当的动作或清理及结束过程或程序。

状态或通知信息:它告诉过程或程序是一个正常结束的条件,它不至于结束发送者。

要监控这类信息,过程或程序可以检查这些条件,也能使功能不继续进行。

可用二级MONMSG命令监控信息:
       
过程级:在CL过程或程序的DCL命令后立即用MONMSG命令来监控逃逸、通知或状态信息,这叫做过程级的MONMSG命令,在一个过程或OPM程序中可以使用至多100个这样的MONMSG命令,这就让你对所有命令用同一种方法来处理相同的逃逸信息,EXEC参数是可选的,且在EXEC中只能规定GOTO命令。

(附图)

解释:
1.MONMSG、检查消息、诊断和完成信息。
2.CPF0000的程序级MONMSG由逃逸、状态、通知信息激活。
3.CPF9999(功能检查)的程序级MONMSG由不是其它命令或程序级监控的逃逸信息激活。在CPF9999送往过程前,原逃逸信息过滤给同一CL程序中的活动过程。如原逃逸信息没被活动的过程处理,则发送CPF9999。
4.如果状态信息送往*EXT,就不能监控它。

命令级:在CL过程或程序中的命令后立即用MONMSG命令来监控逃逸、通知或状态信息,这叫命令级的MONMSG命令,可对一个命令使用多至100个命令
级MONMSG,这让你可用不同的方法处理不同的逃逸信息。
           
要监控这些信息,要在MONMSG命令中用如下格式之一规定信息的一般标识:
       
pppmmnn:监控某个信息,例如MCH1211是零做除数的逃逸信息。
pppmm00:监控用某个特许程序码(ppp)开头的由mm规定的数字信息标识。

例如:

CPF5100指出所有以CPF51开头的通知、状态和逃逸信息。

ppp0000:监控信息标识以ppp开头的信息。例如CPF0000指出要监控以CPF开头的所有通知、状态和逃逸信息。
注:在做系统功能时不要用MONMSG CPF0000,安装、备份、恢复系统时也不
要用它,因为可能会去掉一些重要信息。

CPF9999:监控所有信息标识的功能检测信息,如果对一个错误信息没有监控,
则它成为CPF9999(功能检测)。
       
注:一般来说,在送出通知和诊断信息时,控制也转给监控程序。
       
除了用信息标识监控逃逸信息外,也能用MONMSG中规定的字符串与信息中的数据进行比较。下面的命令监控MYFILE的逃逸信息CPF5101,文件名做为信息数据发送。
  1. MONMSG MSGID(CPF5101) CMPDTA(MYFILE) EXEC(GOTO EOJ)
复制代码

比较数据可以是28个字符长,比较从信息数据的第一个字段的第一个字符开始,如果它们匹配,则执行EXEC参数中规定的动作。
在EXEC参数中规定如何处理逃逸信息,除PGM、ENDPGM、IF、ELSE,DCL,DCLF,ENDDO和MONMSG外,其余命令都能在EXEC中规定。在EXEC中可以规定DO命令,此时运行在DO组内的命令。在运行时,控制返回给发送逃逸之后的命令,但如果规定GOTO或RETURN命令,则控制不返回,如果没规定EXEC,则忽略逃逸,过程继续执行。下面是CHGVAR命令的例子,它监控要做除数的逃逸信息,信息标识为MCH1211:

  
  1. CHGVAR VAR(&A) VALUE(&A / &B)

  2.      MONMSG MSGID(MCH1211) EXEC(CHGVAR VAR(&A) VALUE(1))
复制代码

变量&A的值修改为&A除以&B的值。如果&B=0,不能做除法,且送给过程一个逃逸信息,这时,&A的值变为1,(在EXEC参数中规定)。你也可以测试&B的值,仅在它不是零时才做除法。在下例中,程序监控逃逸信息CPF9801(目标没找到),它由CHKOBJ命令产生:
         
  1. PGM
  2.                CHKOBJ LIB1/PGMA *PGM
  3.                MONMSG MSGID(CPF9801) EXEC(GOTO NOTFOUND)
  4.                CALL LIB1/PGMA
  5.                RETURN
  6.      NOTFOUND: CALL FIX001 /* PGMA Not Found Routine */
  7.                ENDPGM
复制代码

下列CL过程包括二个CALL命令和一个过程级的对CPF0001的监控命令。(如果不能成功地完成CALL命令,则产生逃逸信息)。如果有一个CALL失败,过程送出完成信息且结束。

        
  1. PGM
  2.              MONMSG MSGID(CPF0001) EXEC(GOTO ERROR)
  3.              CALL PROGA
  4.              CALL PROGB
  5.              RETURN
  6.      ERROR:  SNDPGMMSG MSG('A CALL command failed') MSGTYPE(*COMP)
  7.              ENDPGM
复制代码

如果在MONMSG命令中没有规定EXEC,则忽略任何逃逸信息,如果在除IF以外的命令上发生逃逸信息,过程或程序继续处理下一个不产生逃逸信息的命令,如果在IF命令中发生逃逸信息,过程或程序继续处理IF命令中为假的条件。下例解释不同类型发生逃逸信息时所做的处理:

  
  1. PGM
  2.      DCL &A TYPE(*DEC) LEN(5 0)
  3.      DCL &B TYPE(*DEC) LEN(5 0)
  4.      MONMSG MSGID(CPF0001 MCH1211)
  5.      CALL PGMA PARM(&A &B)
  6.      IF (&A/&B *EQ 5) THEN(CALL PGMB)
  7.      ELSE CALL PGMC
  8.      CALL PGMD
  9.      ENDPGM
复制代码

根据发生逃逸信息的地方不同,能发生下列情况:

如果在调用PGMA时产生CPF0001,过程重新处理IF命令;
如果在IF命令中发生MCH1211,IF条件失败,过程处理调用PGMC;
如果在调用PGMB和PGMC时发生CPF0001,过程调用PGMD;
如果在调用PGMD时,发生CPF0001,过程执行ENDPGM,它返回到调用过程
也可由过程或程序中的命令或另外的命令来监控发送的相同逃逸信息,这就需要三个MONMSG命令,一个命令写在需要处理逃逸信息的命令下面,它用在发生逃逸信息的时候,另一个MONMSG跟在最后一个DCL命令后,它能够监控所有其它的命令。
仅在过程或程序需要监控信息时才用MONMSG命令,一个过程中的MONMSG不能被同一程序中的另外过程使用。程序设计参考一书列出CL命令发出的逃逸、通知、状态信息,你也可以列出自己定义的所有信息的表。

8.3.1  缺省处理
       
多数逃逸信息会送往调用命令、程序或过程的过程中,你可能不想监控所有的信息,只想监控和处理对过程功能有影响的那些信息,系统对你没有监控的任何信息提供了缺省监控及处理。
       
缺省处理假定在过程中检测到了错误。如果用调试过程,会有信息送到工作站,然后可以改它,如果没有用调试,系统会做一个信息过滤功能,此功能分为两步:
               
移动调用堆栈中逃逸信息开始的一步
               
检查看有没有MONMSG监控逃逸
       
如果有MONMSG,则停止信息过滤,采取命令中规定的动作,继续进行信息过滤直到遇到另一个MONMSG或遇到一个嵌套组的边界,即逃逸信息不能跨越活动组边界进行过滤。
       
如果在有MONMSG命令且有信息提供的过程前遇到活动级边界,则开始功能检测处理,原逃逸例外的动作被认为是完成了,然后发出CPF9999送给原逃逸的目的过程。如果过程有MONMSG做功能检测,则采取命令规定的动作,如果没有MONMSG,则把查询信息送往交互作业的工作站操作员,操作员能用下列之一回答:
R  重试失败的命令
I   忽略信息,继续处理下一条命令
C  取消过程,对堆栈中下一个过程做过滤功能检测
D  对失败过程转储者调用堆栈入口,取消过程,对堆栈的下一个过程过滤功能检测。如果给出回答或作业是批作业,这是缺省的动作。

功能检测不能跨越活动组边界。如果所做回答引起功能检测跨越一个活动组边界,那么会停止做进一步的功能检测,所有到达活动组边界的过程都被取消,逃逸信息CEE9901送往前一个堆栈入口。

你能监控功能检测的逃逸信息,因此可以做:
清理及结束过程
继续处理过程的其它问题
注:如果没监控的逃逸的信息描述规定了一个缺省动作,在发送功能检测信息之前调用缺省处理程序,当缺省处理程序返回时,开始功能检测处理。

monmsg1.gif (11.06 KB, 下载次数: 41)

monmsg1.gif

monmsg2.gif (7.43 KB, 下载次数: 37)

monmsg2.gif

论坛徽章:
0
28 [报告]
发表于 2004-10-22 11:27 |只看该作者

关于MONMSG的问题

过于详细了 ^_^

看了我都晕了

我没看懂CPF0000和CPF9999的区别,也从来没用到过CPF9999

另外也从没用过比较的

有英文版的么? 看中文似乎让人理解的余地太小了

论坛徽章:
0
29 [报告]
发表于 2004-10-22 17:02 |只看该作者

关于MONMSG的问题

另外,我觉得是否可以单独测试CPF3777这个错误信息,然后看看结果如何:

  1. PGM  PARM(&...)

  2. DCL ...
  3. ....
  4. DCLF...
  5. ...

  6. SAVLIB LIB(PM400) DEV(TAP01) SAVACT(*SYSDFN)  +
  7.                     SAVACTWAIT(300)
  8. MONMSG MSGID(CPF3777) EXEC(GOTO ERROR)
  9. ...
  10. ...

  11. ERROR:   SNDBRKMSG MSG('savlib filed by cfp3777')

  12. ENDPGM
复制代码

论坛徽章:
0
30 [报告]
发表于 2012-10-30 09:47 |只看该作者
不知道我的回答是不是太晚了。今天刚好查到这个帖子。
MONMSG CPF0000, 可以捕获所有CPF消息,但是并不从joblog中删除。它的作用在于Escape消息不会中断job。
如果想删除消息,需要这样:
         QSYS/MONMSG MSGID(CPF2105) EXEC(QSYS/DO)   
            QSYS/RCVMSG PGMQ(*SAME *) MSGTYPE(*LAST) RMV(*YES)
         QSYS/ENDDO

有时候我们确实需要只MONMSG,而不像删除,留待以后检查,比如安装PTF时,备份数据时也是一种情况。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP