对于 Liberty JVM 服务器和 Java Web 应用程序进行故障诊断

如果 Java™ Web 应用程序存在问题,那么可以使用 CICS® 和 Liberty 提供的诊断来确定问题原因。

CICS 提供统计信息,消息和跟踪,以帮助您诊断与在 Liberty JVM 服务器中运行 Java Web 应用程序相关的问题。 用于运行 Web 应用程序的 Liberty 技术还会生成 zFS 中可用的诊断功能。 有关常规设置错误和应用程序问题,请参阅 故障诊断和支持

避免问题

CICS 使用区域 APPLID 和 JVMSERVER 资源名称的值来创建唯一的 zFS 文件和目录名称。 某些可接受的字符在 UNIX 系统服务 shell 中具有特殊含义。 例如,美元符号 ($) 意味着环境变量名称的开始。 其中一些字符可能导致 Equinox OSGi 框架中的 Exception ,并阻止 JVM 服务器启动。 避免在区域 APPLID 和 JVM 服务器名称中使用非字母数字字符。 如果使用这些字符,那么可能需要在 UNIX 系统服务 shell 中使用反斜杠 (\) 作为转义字符。 例如,如果将 JVM 服务器命名为 MY$JVMS 并且想要读取 JVM 系统输出文件:

cat CICSPRD.MY\$JVMS.D20140319.T124122.dfhjvmout

无法启动 Liberty JVM 服务器

  1. 如果无法启动 Liberty JVM 服务器,请检查您的设置是否正确; 请参阅 配置 Liberty JVM 服务器 以获取更多信息。 使用 CICS 系统日志和位于 WLP_OUTPUT_DIR 下的 Liberty messages.log 文件中的消息来确定可能导致问题的原因。
  2. 检查 JVM 概要文件中的 -Dfile.encoding JVM 属性是指定 ISO-8859-1 还是 UTF-8。 这是 Liberty 支持的两个代码页。 如果设置任何其他值,那么 JVM 服务器无法启动。

尝试访问 CICS Liberty JVM 服务器中的受保护 Web 应用程序时无法认证用户

CICS JESMSGLG 日志包含以下消息:
ICH420I PROGRAM DFHSIP FROM LIBRARY hlq.SDFHAUTH 导致 
环境变得不受控制
BPXP014I ENVIRONMENT MUST BE CONTROLLED FOR DAEMON (BPX.DAEMON) PROCESSING.
Liberty messages.log 包含以下消息:
CWWKS1100A: Authentication did not succeed for user ID user. 
An invalid user ID or password was specified.
CICS Liberty JVM 服务器安全性实现使用 Liberty Angel 进程来执行授权安全性检查。 如果 Liberty 无法连接到 Angel 进程,那么它将故障转移为要求 STEPLIB 和 DFHRPL 并置中的所有成员由程序进行控制的 USS 安全性。
注意: 请注意, Liberty 服务器仅在服务器启动时连接到 Angel 进程。 需要重新启动 JVM 服务器以完成认证。

无法使用用户标识和密码认证用户,尝试访问 CICS Liberty JVM 服务器中的受保护 Web 应用程序时无法访问 APPL-ID

Liberty messages.log 包含以下消息:
com.ibm.ws.security.saf.SAFServiceResult E CWWKS2909E: 
已拒绝 SAF 认证或授权尝试,因为服务器 
无权访问以下 SAF 资源: 
APPL-ID APPL-ID。 内部错误代码 0x03008108。
CICS Liberty JVM 服务器安全性需要访问类 APPL 和 SERVER 中的 SAF 安全概要文件。 如果未授予访问权,那么 Liberty 将无法认证用户标识和密码。 可在此处找到有关如何配置此功能的详细信息 认证 Liberty JVM 服务器中的用户

在部署到 dropins 目录后 Web 应用程序不可用

如果在 dfhjvmerr中接收到 CWWK0221E 错误消息,请检查是否为 JVM 概要文件和 server.xml中的主机名和端口号设置了正确的值。 其他进程可能正在使用该端口且禁用端口共享。 客户机可能无法解析该主机名。

启用 Liberty JVM 服务器后增加了 CICS CPU 使用率

Liberty 可配置为使用 server.xml中的 <config><applicationMonitor> 元素定期检查对配置和已安装的应用程序的更新。 如果配置轮询速率或应用程序监视时间间隔设置过于频繁,那么可能导致过度使用 CPU 和 I/O。

对于 <config> ,可以使用 monitorInterval 属性来降低频率。 请勿将 updateTrigger 属性设置为已禁用,因为 CICS 要求 Liberty 在几秒钟内获取配置更改。

对于 <applicationMonitor> ,可以使用 pollingRate 属性来降低频率,或者将 updateTrigger 属性更改为 "mbean" ,或者将其禁用。

有关更多信息,请参阅 控制动态更新

应用程序不可用

您将 WAR 文件复制到 dropins 目录,但是应用程序不可用。 请检查 Liberty messages.log 文件以获取错误消息。 如果收到 CWWKZ0013E 错误消息,那么已有相同名称的 Web 应用程序在 Liberty JVM 服务器中运行。 要修复此问题,请更改 Web 应用程序的名称并部署到 dropins 目录。

Web 应用程序返回:Context Root Not Found

您已启用 Liberty JVM 服务器并部署了 Web 应用程序, JVM 服务器报告已启用,但当您访问应用程序时,会收到Context Root Not Found. 稍后访问 Web 应用程序会导致成功。 这是已知计时窗口,当应用程序仍在后台启动时,服务器报告它已启用。 在使用 Sysplex Distributor 或端口共享的多区域环境中,更有可能遇到此情况。 如果您使用自动化来访问从以下应用程序触发的应用程序,那么您也可能会迂到此情况:enabled状态。 如果使用 Sysplex Distributor 或端口共享,那么 TCP/IP 自动化可用于将某个端口设置为静默端口,然后在 Web 应用程序可用时恢复该端口。 变通方法可能包括在自动化脚本中添加暂停,或者应用程序在可用时将某个标志写入已知位置。

Web 应用程序未请求认证

您已配置安全性,但是 Web 应用程序未请求认证。

  1. 虽然您可以为 Web 应用程序配置 CICS 安全性,但仅当 Web 应用程序在 WAR 文件中包含安全性约束时,才会使用安全性。 检查应用程序开发者是否在 动态 Web 项目中的 web.xml 文件中定义了安全约束。
  2. 检查 server.xml 文件是否包含正确的安全性信息。 在 dfhjvmerr 中报告任何配置错误,并且这些错误可能提供一些有用信息。 如果要使用 CICS 安全性,请检查是否在 server.xml中指定了功能部件 cicsts:security-1.0 。 如果关闭了 CICS 安全性,请检查是否指定了基本用户注册表来认证应用程序用户。
  3. 检查是否针对 <safAuthorization>(以利用 EJBRoles)或者 <application-bnd> 元素中的本地角色映射配置了 server.xml。 在 server.xmlinstalledApps.xml<application> 元素中找到 <application-bnd> 元素。 CICS 为本地角色映射添加的缺省安全角色为 cicsAllAuthenticated

Web 应用程序返回 HTTP 403 错误代码

Web 应用程序在 Web 浏览器中返回 HTTP 403 错误代码,因为您的用户标识已撤销或者您无权运行应用程序事务。

  1. 检查 CICS 消息日志以获取错误消息 ICH408I ,以查看发生的授权失败类型。 要修复此问题,请确保用户标识具有有效的密码,且获得授权以运行该事务。
  2. 如果未找到 ICH408I 消息,请检查 messages.log 文件。
    • 对于以下消息:
      CWWKS3005E: A configuration exception has occurred. 
      No UserRegistry implementation service is available.  
      Ensure that you have a user registry configured.
      您必须确保已在 server.xml 中配置了 SAF 注册表。 有关更多信息,请参阅 手动定制 server.xml
    • 对于以下消息,在使用分布式身份时:
      CWWKS9104A: 针对用户 alidist 的授权失败:defaultRealm 
      在 /basic 上调用 LdapTests 时。 
      The user is not granted access to any of the required roles: [testing].
      如果 server.xml 配置了 <safAuthorization> 或者包含 cicsts:distributedIdentity-1.0 功能部件,请确保已为 RACMAPped 用户标识定义了相应的 EJBRoles。 有关更多信息,请参阅 使用 SAF 角色映射进行授权。 如果 server.xml 未配置 <safAuthorization> 并且不包含 cicsts:distributedIdentity-1.0 功能部件,请确保已将相应的分布式用户标识定义为具有对 <application-bnd> 元素中相应角色的访问权。 有关更多信息,请参阅 授权用户在 Liberty JVM 服务器中运行应用程序
  3. 如果应用程序对于类 com.ibm.ws.webcontainer.util.Base64Decode 返回异常,请检查 dfhjvmerr 以查找错误消息。 如果看到配置错误消息,例如,CWWKS4106ECWWKS4000E,那么服务器正在尝试访问以不同编码创建的配置文件。 在更改 file.encoding 值且重新启动 JVM 服务器时,可能会发生此类型的配置错误。 要修复此问题,您可以还原为先前编码并重新启动 JVM 服务器,或者删除配置文件。 JVM 服务器将在启动时以正确的文件编码重新创建文件。

Web 应用程序返回 HTTP 500 错误代码

Web 应用程序在 Web 浏览器中返回 HTTP 500 错误。 如果收到 HTTP 500 错误,那么发生了配置错误。

  1. 检查 CICS 消息日志以获取 DFHSJ 消息,这可能为您提供有关错误的特定原因的更多信息。
  2. 如果使用 URIMAP 以在特定事务上运行应用程序请求,那么确保 URIMAP 指定了正确的事务标识。
  3. 确保正确设置 SCHEME 和 USAGE 属性。 SCHEME 必须匹配应用程序请求(HTTP 或 HTTPS)。 USAGE 属性必须设置为 JVMSERVER。

Web 应用程序返回 HTTP 503 错误代码

Web 应用程序在 Web 浏览器中返回 HTTP 503 错误。 如果收到 HTTP 503 错误,那么应用程序不可用。

  1. 请查看 CICS 消息日志以获取 DFHSJ 消息以获取更多信息。
  2. 确保为应用程序启用 TRANSACTION 和 URIMAP 资源。 如果这些资源打包为 CICS 束中应用程序的一部分,请检查 BUNDLE 资源的状态。
  3. 请求可能在完成前已被清除。 日志中的错误消息描述了清除请求的原因。

无法使用分布式身份映射访问 Web 应用程序

如果使用分布式身份映射并在 messages.log 文件中看到以下消息:
FFDC1015I: An FFDC Incident has been created: "com.ibm.ws.security.saf.SAFException: 
CWWKS2905E: SAF 服务 IRRSIA00_CREATE 未成功,因为 
在 SAF 注册表中找不到用户 null。 
SAF return code 0x00000008. RACF return code 0x00000008. RACF reason code 0x00000010.
FFDC1015I: An FFDC Incident has been created: 
"javax.security.auth.login.CredentialException: 无法创建 SAF 凭证 
for <distid> DistId
检查 CICS 消息日志以获取错误消息 ICH408I ,以查看发生的授权失败类型。 如果是ICH408I USER(<userid>) GROUP(TSOUSER ) NAME(<name>) DISTRIBUTED IDENTITY IS NOT DEFINED: 776 cn= <distid> DistId,ou=users,dc=domain,dc=com LdapRegistry您需要为用于访问应用程序的分布式身份创建相应的 RACMAPRACMAP QUERY 命令可用于调试。 例如:
RACMAP QUERY USERDIDFILTER(NAME('ou=users,dc=domain,dc=com')) REGISTRY(NAME('LdapRegistry'))

Web 应用程序返回异常

Web 应用程序在 Web 浏览器中返回异常;例如,应用程序针对类 com.ibm.ws.webcontainer.util.Base64Decode 返回异常。

  1. 检查 dfhjvmerr 以查找错误消息。
  2. 如果看到配置错误消息,例如,CWWKS4106ECWWKS4000E,那么服务器正在尝试访问以不同编码创建的配置文件。 在更改 file.encoding 值且重新启动 JVM 服务器时,可能会发生此类型的配置错误。 要修复此问题,您可以还原为先前编码并重新启动 JVM 服务器,或者删除配置文件。 JVM 服务器将在启动时以正确的文件编码重新创建文件。

messages.log 中的错误消息 CWWKB0109E

如果 Liberty 无法顺利关闭,那么下一个 WLP_ZOS_PLATFORM=TRUE 的 Liberty JVM 服务器会将错误消息 CWWKB0109E 写入到 messages.log 文件。 您无需修复此错误,可将其忽略。

否则,不允许 CICS 区域用户标识从 IFAUSAGE注册和注销,请参阅 Liberty 服务器 Angel 进程

错误消息 WTRN0078E

事务管理器尝试对事务资源调用启动操作导致了一个错误。 错误代码为 XAER_PROTO。 如果遇到此错误,那么最有可能的场景是您具有在 Liberty 服务器中运行的缺省 JTA 集成,并且应用程序使用声明为 REQUIRES_NEW 的 Bean 方法。 例如: @Transactional(value = TxType。REQUIRES_NEW) void yourMethod{} CICS不支持在 XA 事务中使用 REQUIRES_NEW。 您必须更改应用程序,然后才能运行。

MSGUSER 中的错误消息 DFHSJ1004 ,但没有相应的 STDERR 异常

耗尽 zFS 文件系统空间的症状可能是 DFHSJ1004 没有相应的 STDERR 异常。 由于缺少空间而发送消息,但 STDERR 中没有异常,因为没有空间将消息写入文件。

您可以使用 管理文件系统中详细描述的方法来规划和监视文件系统的大小。

使用 productInfo 脚本以验证 Liberty 的完整性

在安装 CICS 或应用服务之后,可以使用 productInfo 脚本来验证 Liberty 安装的完整性。

  1. 将目录切换到 CICS USSHOME 目录。
  2. 由于 productInfo 使用 Java ,因此必须确保 Java 包含在 PATH 中。 或者,将 JAVA_HOME 环境变量设置为 JVM 概要文件中 JAVA_HOME 的值,例如:
    export JAVA_HOME=/usr/lpp/java/J7.0_64 
  3. 运行 productInfo 脚本,提供验证选项 wlp/bin/productInfo validate。 此时不应报告错误。 有关 Liberty productInfo 脚本的更多信息,请参阅 验证 Liberty 概要文件安装的完整性

使用 wlpenv 脚本来运行 Liberty 命令

IBM® 服务可能会要求您运行一个或多个 Liberty 提供的命令,例如 productInfoserver dump。 要运行这些命令,您可以使用 wlpenv 脚本作为包装程序来设置必需的环境。 在成功解析 JVM 概要文件后,每次启用 Liberty JVM 服务器时都将创建和更新该脚本。 由于该脚本对于每个 CICS 区域中的每个 JVM 服务器都是唯一的,因此它是在缺省情况下在 JVM 概要文件中指定的 WORK_DIR/APPLID/JVMSERVER 中创建的,称为 wlpenvAPPLID 是 CICS 区域 APPLID 的值, JVMSERVER 是 JVMSERVER 资源的名称。

要在 UNIX 系统服务 shell 中运行 wlpenv 脚本,请将目录切换到 JVM 概要文件中指定的 WORK_DIR ,并以 Liberty 命令作为自变量运行该脚本,例如:
./wlpenv productInfo version
./wlpenv server dump --archive=package_file_name.dump.pax --include=heap
对于 server dump 命令,不提供服务器名称,因为 wlpenv 脚本会将其设置为上次启用 JVM 服务器时设定的值。

有关 Liberty 命令的更多信息,请参阅 Liberty: productInfo 命令从命令行生成 Liberty 服务器转储

对调用 Java EE 应用程序进行故障诊断

EXEC CICS LINK 命令失败,返回 RESP = PGMIDERR 和 RESP2 = 1
  1. 检查应用程序以确定是否生成了正确的工件。
    1. 检查在源项目上是否启用了注释处理。
      图 1。 检查是否启用了注释处理
      检查是否在项目属性的 "Java 编译器> 注释处理" 部分中选择了 "启用注释处理" 选项
    2. 检查是否已将 @CICSProgram 添加到 Java 方法,以及它是否正确编译。
    3. 导出应用程序并检查 com.ibm.cics.server.invocation.proxy 包中生成的代码。 例如,在工作站上,使用归档管理器打开 WAR 或 EAR 文件,或者在 z/OS® 上使用 jar -tf 命令来检查 WAR 或 EAR 文件的内容。 如果尚未生成代码,请检查您是否具有最新版本的 CICS Explorer®, CICS 构建工具箱或注释处理器。
  2. 查看 CICS 消息日志以获取类似如下的消息:
    • DFHSJ1204: A linkable service has been registered for class examples.TSQ.ClassOne method anotherMethod with program name LINKJCIN in JVMSERVER LINKJVM
    • DFHPG0101: Resource definition for LINKJCIN has been added.
    如果未显示这些消息,那么:
    1. 确保 Liberty JVM 服务器处于已启用状态。
    2. 确保在 server.xml 中配置了 cicsts:link-1.0 功能部件。 如果已配置,那么您将在 messages.log 中看到消息“J2CA7001I: Resource adapter com.ibm.cics.wlp.program.link.connector installed”。
    3. 如果要使用 CICS 束来部署应用程序,请确保已安装并启用该束。
    4. 确保在 Liberty 中安装该应用程序,如果已安装,那么在 messages.log 中,您将收到包含用户应用程序名称的消息。 例如:CWWKZ0001I: Application com.ibm.cics.test.javalink started.
EXEC CICS LINK 命令失败,返回 RESP = PGMIDERR 和 RESP = 27
这指示 CICS 尝试在 Liberty 中调用 Java EE 应用程序,但在应用程序成功之前发生超时。 此问题的最常见原因是 JVM 服务器中无可用线程。 要解决此问题,请提高 JVM 服务器线程限制,或者提高 WLP_LINK_TIMEOUT 的值以允许任务等待更长时间来获取线程。 有关更多信息,请参阅 JVM 服务器选项管理 JVM 服务器的线程限制中的 WLP_LINK_TIMEOUT。
JCICS API 调用抛出 CICSRuntimeException
com.ibm.cics.server.CicsRuntimeException: 
DTCTSQ_READNEXT: No JCICS context is associated with the current thread. 

此异常最有可能的原因是,您在一个线程上创建了 JCICS 对象,并尝试从一个不同的线程调用其实例方法。 更改应用程序以在调用其方法的相同线程上构造 JCICS 对象。

导致无意中使用不同线程上对象的模式包括:
  • java.lang.Runnablejava.util.concurrent.Callable 的构造方法中构造 JCICS 对象。 改为在 run() 方法中构造对象。
  • 将 JCICS 对象分配给静态变量。 改为使用实例变量。
  • 将 JCICS 对象作为参数传递到另一个线程执行的方法。 该线程应自行构造 JCICS 对象。
使用调用 Java EE 应用程序时,事务异常终止 AJ05
将以下异常记录到 dfhvjmerr 文件中:
com.ibm.cics.server.InvalidRequestException: CICS INVREQ Condition(RESP=INVREQ, RESP2=200)
java.lang.RuntimeException: 
javax.transaction.RollbackException: 
XAResource start association error:XAER_PROTO
仅支持将 JTA 与指向 Liberty 的链接配合使用,并且已禁用 CICS JTA 集成。 通过在 server.xml中使用 <cicsts_jta integration="false"/> 来对此进行配置。

错误消息 CWWKC2262EThe server is unable to process the 4.0 version and the http://xmlns.jcp.org/xml/ns/javaee namespace

如果服务器无法处理 4.0 版本和 http://xmlns.jcp.org/xml/ns/javaee 名称空间,那么这通常意味着未从构建脚本中排除应用程序服务器 (例如 Tomcat)。 在 Gradle中,确保指定了 providedRuntime("org.springframework.boot:spring-boot-starter-tomcat"),而在 Maven 中,您使用了 "提供的" 作用域,例如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>