CICS事务网关(CICS Transaction Gateway ,CTG)提供的Java客户端简化了与CICS之间的通信,大多数情况下,它象是一个通过外部调用接口与CICS通信的黑盒子,因此出现问题进行故障诊断时比较麻烦,本文就介绍一下如何处理程序没有找到(PGMIDERR)和AEI0 ABEND错误。 接收CTG中的原始PGMIDERR/AEI0 ABEND错误 CTG客户端指定一个统一资源定位符(URL)和一个目标程序名连接到CTG,客户端还包括一个事务和CICS应用程序ID,所有通过CTG驱动的事务必须定义CICS镜像程序(DFHMIRS)作为它的原始程序。 当消息抵达时……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
CICS事务网关(CICS Transaction Gateway ,CTG)提供的Java客户端简化了与CICS之间的通信,大多数情况下,它象是一个通过外部调用接口与CICS通信的黑盒子,因此出现问题进行故障诊断时比较麻烦,本文就介绍一下如何处理程序没有找到(PGMIDERR)和AEI0 ABEND错误。
接收CTG中的原始PGMIDERR/AEI0 ABEND错误
CTG客户端指定一个统一资源定位符(URL)和一个目标程序名连接到CTG,客户端还包括一个事务和CICS应用程序ID,所有通过CTG驱动的事务必须定义CICS镜像程序(DFHMIRS)作为它的原始程序。
当消息抵达时,CICS附加目标事务,调用DFHMIRS,DFHMIRS从消息头提取应用程序名称,并尝试连接,如果程序是可执行的,一切就会按计划执行,如果出现问题,DFHMIRS返回诸如“程序未找到”或PGMIDERR,或AEI0 ABEND等错误给客户端,最后,当它看到变量eci_abend_code置为AEI0时,就知道客户端接收到了错误消息。
诊断PGMIDERR/AEI0 ABEND的步骤
听起来感觉很容易诊断,但试图找出错误时却会遇到很多问题,当DFHMIRS连接目标程序失败时,它会静静地向CTG发送一个错误,但不会向CICS日志写入任何消息,CTG可以识别这些问题,但在默认的跟踪级别,除了在它内部的跟踪表中,不会在其它地方记录日志。最后,在拥有多个CTG和路由区的CICSPlex环境中,不会说出错误的发生位置。
解决这个问题首先要找出出错的客户端消息,有以下几种办法:
1、网络跟踪法:最不喜欢的是使用网络跟踪,不仅要查看海量数据,一旦发现错误消息,必须与原始请求进行匹配,这种办法的好处是不用浸入到复杂的大型机环境。
2、CICS跟踪法:稍微配置以下,CICS或GTF跟踪可以快速地精确定位问题,但对于在大型CICSPlex环境中的一个间歇性错误,需要跟踪很多区域,时间可能不允许,如果跟踪管理捕捉到错误,仍然有海量的输出数据需要查看,最后是大家都知道的,跟踪对性能有影响。
3、CTG跟踪法:在最新的CTG版本中跟踪可以用一个修改的命令操作,此外,CTG将会把跟踪信息写入到SSYSOUT,使它更容易阅读,但要捕捉到错误,你可能要在多个CTG实例上开启四级跟踪。这个方法和CICS跟踪有一样的缺点,特别是在复杂的环境下。
4、转储CTG法:转储CTG是最简单,最直接的方法,如果你运行了多个CTG实例,那么每一个都要转储,转储命令必须包括MVS地址空间和附加的OMVS进程。
无论哪种方法,使用程序名称是最快的,但程序名称很可能是无效的,例如,消息中的持续名称可能包括非法字符,或是未以非空字符结束。如果程序名称无效,要找到错误需要两个步骤:
- 登录到CICS,寻找程序的定义;
- 当你找到程序正确的定义时,你一定会想用头磕桌子。
原来是因为引起AEI0 ABEND的原因有很多,包括但不限于:
- 当CICS知道它应该将请求转发到另一个区域,但没有任何可用的线路时产生了DLP错误;
- 目标程序在目标AOR上被禁用了;
- 在极少数情况下,当事务让它通过路由区,但在目标AOR上遇到了安全错误。
要找到上述错误的根本原因,除非还有其它诊断信息可用,否则唯一的办法只有使用CICS跟踪。
虽然CICS和CTG不约而同地隐藏了错误,但用户仍然可以记录一些事件,例如,一个自定义动态路由程序在发生路由错误和DTR错误字段置为c’7’时可以记录消息,有些全局用户在退出时的事件也可以观察到和记录。最后的办法是确保错误不再发生。