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

如果 Java™ Web 应用程序存在问题,那么可以使用 CICS 和 Liberty 提供的诊断来确定问题原因。 CICS 提供统计信息,消息和跟踪,以帮助您诊断与在 Liberty JVM 服务器中运行 Java 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 服务器无法启动。

启用 SSL 时,本地自由 JVM 服务器无法连接到 JCICSX 的远程自由 JVM 服务器(SRVE0777E)

在将 Liberty JVM 服务器配置为使用 SSL 进行远程 JCICSX API 开发后,您可能会收到此错误:
Application Error
SRVE0777E: Exception thrown by application class 'com.ibm.cics.jcicsx.http.CICSContextProviderImpl.initialise:112'
com.ibm.cics.jcicsx.http.JCICSXException: Failed to retrieve server info
at com.ibm.cics.jcicsx.http.CICSContextProviderImpl.initialise(CICSContextProviderImpl.java:112)
at com.ibm.cics.jcicsx.http.CICSContextProviderImpl.getCICSContext(CICSContextProviderImpl.java:85)
at com.ibm.cics.harness.TaskProducer.produceTask(TaskProducer.java:26)
at com.ibm.cics.harness.HarnessServletFilter.doFilter(HarnessServletFilter.java:36)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:201)
at [internal classes]
Caused by: javax.ws.rs.ProcessingException: java.io.IOException: IOException invoking https://remotejcicsxserver.com:portNum/jcicsxServer/info: HTTPS hostname wrong: should be <remotejcicsxserver.com>
at org.apache.cxf.jaxrs.client.AbstractClient.checkClientException(AbstractClient.java:643)
at [internal classes]
at com.sun.proxy.$Proxy34.getInfo
at com.ibm.cics.jcicsx.http.CICSContextProviderImpl.initialise(CICSContextProviderImpl.java:101)
... 5 more
Caused by: java.io.IOException: IOException invoking https://remotejcicsxserver.com:portNum/jcicsxServer/info: HTTPS hostname wrong: should be <remotejcicsxserver.com>
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(NativeConstructorAccessorImpl.java:-2)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1447)
... 8 more
Caused by: java.io.IOException: HTTPS hostname wrong: should be <remotejcicsxserver.com>
at sun.net.www.protocol.https.HttpsClient.checkURLSpoofing(HttpsClient.java:649)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:573)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1564)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:347)
at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream$2.run(URLConnectionHTTPConduit.java:427)
... 8 more
说明
如果未指定运行于 CICS® 的 Liberty JVM 服务器的主机名,则会返回此错误。如果未指定,远程 Liberty 服务器上的主机名默认为 localhost。 但是,服务器期望主机名是远程 CICS 区域的主机名,在本例中为 remotejcicsxserver.com。 这是本地 Liberty 服务器应该通过证书传递到远程 Liberty 服务器的正确主机名,但已改为传递 localhost
用户操作
要确定问题,请通过以下任一方式查找在远程 Liberty JVM 服务器的证书中注册的当前主机名:
  • 使用 OpenSSL 命令来显示远程 Liberty JVM 服务器的证书:
    $ openssl s_client -showcerts -connect remotejcicsxserver.com:portNo
    输出可能如下所示:
    CONNECTED(00000005)
    depth=0 C = us, O = ibm, OU = defaultServer, CN = localhost
    verify error:num=18:self signed certificate
    verify return:1
    depth=0 C = us, O = ibm, OU = defaultServer, CN = localhost
    verify return:1
    结果头中返回的 CN 值是服务器上的证书名称和主机名 (localhost)。
  • 要使用 Java 密钥工具实用程序:
    1. 浏览至远程 Liberty 服务器上的密钥库文件夹: {server.config.dir}/resources/security
    2. 如果本地 Liberty 服务器处于 19.0.0.3 或更高版本(这是使用远程 JCICSX 开发的客户端工具所需的最低版本),并且远程 Liberty 服务器启用了自动配置以使用 SSL,则远程 Liberty 服务器将使用默认值创建密钥库。 在这种情况下,使用此命令可显示自动创建的 Java 密钥存储中存储的证书:
      keytool -list -keystore key.p12 -storepass defaultPassword -storetype PKCS12 -v
      否则,请根据您的定制配置替换 storepassstoretype 中的值。
      您可能会获得类似如下的输出,这将显示 localhost 作为主机名:
      Keystore type: PKCS12
      Keystore provider: IBMJCE
      
      
      Your keystore contains 1 entry
      
      
      Alias name: default
      Creation date: Jun 1, 2020
      Entry type: keyEntry
      Certificate chain length: 1
      Certificate[1]:
      Owner: CN=localhost, OU=defaultServer, O=ibm, C=us
      Issuer: CN=localhost, OU=defaultServer, O=ibm, C=us
      Serial number: dd89aa9
      Valid from: 6/1/20 5:41 PM until: 6/1/21 5:41 PM
      Certificate fingerprints:
               MD5:  AB:05:27:5E:55:3B:44:73:CA:65:61:11:D3:08:21:AC
               SHA1: 16:8E:73:61:49:A3:0E:C4:46:7D:77:87:F0:81:DD:C9:EB:28:92:CF
               SHA256: E7:68:BB:CC:6C:00:33:67:CF:A6:DA:9A:56:25:D5:05:8F:69:33:0C:3D:CE:1C:E4:03:E6:13:30:FD:E0:9F:E9
               Signature algorithm name: SHA256withRSA
               Version: 3
      
      
      Extensions: 
      
      
      #1: ObjectId: 2.5.29.14 Criticality=false
      SubjectKeyIdentifier [
      KeyIdentifier [
      0000: e3 4f e5 04 ff 71 e7 64  1a da 06 2b cb e0 ec 35  .O...q.d.......5
      0010: 18 6f 2d 94                                        .o..
      ]
      ]
      
      
      #2: ObjectId: 2.5.29.17 Criticality=false
      SubjectAlternativeName [
      [DNSName: localhost]]
返回的证书中包含 localhost 的主机名表示未在远程 Liberty JVM 服务器上指定主机名。 遵循 设计示例: 使用 TLS 客户机认证保护 JCICSX 服务器 中的指示信息,为远程 Liberty JVM 服务器正确配置 SSL。

尝试访问 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 进程,那么它将故障转移到使用 UNIX 系统服务安全性,这要求 STEPLIB 和 DFHRPL 并置中的所有成员都受程序控制。

注意: 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 无法认证用户标识和密码。 可在此处找到有关如何配置此应用程序的详细信息 认证用户以运行 CICS Liberty Web 应用程序

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

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

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

可以使用 <config>server.xml 中的 <applicationMonitor> 元素,将 Liberty 配置为定期检查配置和已安装应用程序的更新。 如果配置轮询速率或应用程序监视时间间隔设置过于频繁,那么可能导致过度使用 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. 
      没有任何 UserRegistry 实现服务可用。
      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。 有关更多信息,请参阅 使用 EJBROLE 配置 SAF 授权 。 如果 server.xml 未配置 <safAuthorization> 并且不包含 cicsts:distributedIdentity-1.0 功能部件,请确保已将相应的分布式用户标识定义为具有对 <application-bnd> 元素中相应角色的访问权。 有关更多信息,请参阅 授权用户运行 CICS Liberty Web 应用程序
  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 凭证 
对于 <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 服务器将在启动时以正确的文件编码重新创建文件。

错误消息 WTRN0078EAn attempt by the transaction manager to call start on a transactional resource has resulted in an error.

错误代码为XAER_PROTO。如果迂到此错误,那么最可能的情况是在 Liberty 服务器上运行缺省 JTA 集成,并且应用程序使用声明为 REQUIRES_NEW的 bean 方法。 例如, CICS不支持在 XA 事务中使用 REQUIRES_NEW: @Transactional(value = TxType.REQUIRES_NEW) void yourMethod{} 您必须先变更应用程序,然后才能运行该应用程序。

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

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

您可以使用 z/OS UNIX System Services 规划》中的《管理文件系统 》中详细介绍的技术来规划和监视文件系统的大小。

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

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

  1. 在UNIX系统服务外壳中,按照JVM配置文件中的说明将目录更改为WORK_DIR。 例如,默认工作目录位置为:
    cd WORK_DIR/APPLID/JVMSERVER
    APPLID是 CICS 区域的价值,而JVMSERVER是JVMSERVER资源的名称。
  2. 使用 wlpenv 脚本运行 productInfo ,并提供验证选项。
    ./wlpenv productInfo validate
    此时不应报告错误。

有关 Liberty productInfo 脚本的更多信息,请参阅 productInfo 命令验证 Liberty 配置文件安装的完整性。 有关 wlpenv 脚本的更多信息,请参阅使用 wlpenv 脚本和 WebSphere Application Server Liberty 命令行实用程序管理 CICS Liberty

使用 server dump 命令生成Liberty服务器转储

您可以使用 server dump 命令来获取Liberty服务器的状态信息。

  1. 在UNIX系统服务外壳中,按照JVM配置文件中的说明将目录更改为WORK_DIR。 例如,默认工作目录位置为:
    cd WORK_DIR/APPLID/JVMSERVER
    APPLID是 CICS 区域的价值,而JVMSERVER是JVMSERVER资源的名称。
  2. 使用 wlpenv 脚本运行 server dump ,例如:
    ./wlpenv server dump --archive=package_file_name.dump.pax --include=heap
    您无需提供服务器名称,因为该名称已由 wlpenv 脚本设置为上次启用JVM服务器时的值。

有关 Liberty server dump 命令的更多信息,请参阅从命令行生成 Liberty 服务器转储。 有关 wlpenv 脚本的更多信息,请参阅使用 wlpenv 脚本和 WebSphere Application Server Liberty 命令行实用程序管理 CICS Liberty

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

EXEC CICS LINK 命令失败,返回 RESP = PGMIDERR 和 RESP2 = 1
  1. 检查应用程序以确定是否生成了正确的工件。
    1. 检查在源项目上是否启用了注释处理。
      图 1。 检查是否启用了注释处理
      检查是否在项目属性的 "Java 编译器> 注释处理" 部分中选择了 "启用注释处理" 选项
    2. 检查是否已将 @CICSProgram 添加到 Java 方法,以及它是否正确编译。
    3. 如果项目包含 web.xml,请检查其指定的 servlet 规范的版本。 它必须至少为 V 2.5。
    4. 导出应用程序并检查 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 功能部件。 如果已配置,那么您将看到消息J2CA7001I: Resource adapter com.ibm.cics.wlp.program.link.connectorinstalledmessages.log中。
    3. 如果要使用 CICS 束来部署应用程序,请确保已安装并启用该束。
    4. 确保在 Liberty 中安装该应用程序,如果已安装,那么在 messages.log 中,您将收到包含用户应用程序名称的消息。 例如:CWWKZ0001I: Application com.ibm.cics.test.javalink started.
  3. 确保应用程序描述符中的版本受支持。
    WAR 文件
    web.xml 描述符需要至少 3.0的 web-app 版本。
    EJB JAR 文件
    ejb-jar.xml 描述符需要至少 3.0的 ejb-jar 版本。
    有些构建工具生成的这些描述符文件版本较早,需要额外配置才能生成更高级别的描述符文件。 早期版本不支持 CICS 用来促进 EXEC CICS LINK 的代理对象。
EXEC CICS LINK 命令失败,返回 RESP = PGMIDERR 和 RESP = 27
这指示 CICS 尝试在 Liberty 中调用 Enterprise Java 应用程序,但在应用程序成功之前发生超时。 此问题的最常见原因是 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 对象。
使用调用 Enterprise Java 应用程序时事务异常终止 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
只有在禁用 CICS JTA 集成的情况下,才支持将 JTA 与指向 Liberty 的链接配合使用。 通过在 server.xml中使用 <cicsts_jta integration="false"/> 来对此进行配置。

Java 堆栈溢出

Java 错误消息java.lang.StackOverflowError: operating system stack overflow通常在线程超过操作系统线程的初始堆栈大小时看到。 大小由 JVM 概要文件中的 JVM 选项 -Xmso 设置。 如果启用了 Java 平台调试器体系结构 (JPDA) ,那么可能需要增大此值。

日志中存在意外的 ICH408I 消息

这些是标准审计消息。 如需了解更多信息,请参阅 z/OS Security Server RACF Auditor's Guide 中控制 z/OS UNIX System Services 审核的类

您可以通过执行下列其中一个 RACF 命令来阻止发出这些命令
  • SETROPTS LOGOPTIONS(NEVER(IPCOBJ))
  • SETROPTS LOGOPTION(DEFAULT(IPCOBJ))

IPCOBJ 仅用于审计 z/OS UNIX 安全事件,不用于授权检查。

Liberty Bundlepart 命中超时

在 JVM 日志或 STDERR 文件中,您会看到以下消息:
由 bundlepart <symbolic-name> 安装的应用程序未启动 
30000 毫秒之后。 应用程序存在问题,或者系统正忙。 
此超时可由系统属性 "com.ibm.cics.jvmserver.wlp.bundlepart.timeout= n" 控制 
其中 n 是要等待的毫秒的值。
检查 Liberty messages.log 以获取 CWWKZ 消息。 CWWKZ 消息可能会提供有关应用程序未启动的原因的信息。 如果应用程序没有 CWWKZ 消息,请确保 <config> 元素被配置为使用轮询,并且监控间隔小于超时时间等:
<config updateTrigger="polled" monitorInterval="10s" />
如果监视器时间间隔小于 bundlepart 超时,那么需要增大超时值。 超时值由 JVM 系统属性 com.ibm.cics.jvmserver.wlp.bundlepart.timeout控制。

CICS Explorer 无法导出束或查找存在错误的项目Unable to find a built {project_type} with symbolic name {symbolic_name}.

将项目添加到 CICS 束时,您可能会看到以下验证错误:

The bundle cannot be exported because CICS Explorer cannot find a built {project_type} with symbolic name {symbolic_name}. 
To resolve this, either install the IBM CICS SDK for Java EE, Jakarta EE and Liberty to build the project or import the built {file_extension} project directly.
Unable to find a built OSGi Application Project with symbolic name {symbolic_name}.
To resolve this, either install LDT to find and validate projects in your workspace or add the built EBA project into the root of the CICS bundle project.
Unable to find a {project_type} with symbolic name {symbolic_name}.
To resolve this, either import the {project_type} into your workspace or add the built {file_extension} project into the root of the CICS bundle project.
或者,导出 CICS 束时发生以下错误:
{symbolic_name} cannot be exported. Install the Liberty Developer Tools (LDT) from Eclipse Marketplace.
The WAR, EAR or EBA cannot be exported. Install the IBM CICS SDK for Java EE, Jakarta EE and Liberty.
为什么会发生?
对于 CICS 捆绑包中的项目, CICS Explorer® 要么在工作区中找到相应的项目,要么验证是否存在具有匹配符号名称的相应已构建二进制文件,以便将项目与捆绑包一起导出。 如果 CICS Explorer 找不到此类构建项目,那么将返回先前的其中一个错误。
其中:
{project_type}
缺少的已构建项目的项目类型。 它可以是 OSGi 应用程序项目企业应用程序项目
{symbolic_name}
缺少的已构建项目的名称,在 cics.xml 文件中指定。
{file_extension}
缺少的已构建项目的文件格式。 它可以是 EBA 或 EAR。
如何解决错误?

对于 OSGi 应用程序项目 (EBA),请按照错误信息中的说明安装 IBM® CICS SDK for Enterprise Java (Liberty)、Liberty Developer Tools (LDT),或同时安装这两种软件来验证和构建项目,或将相应的已构建项目添加到 CICS bundle 的根目录中。

对于 企业应用程序项目 (EAR) 或 动态 Web 项目 (WAR) ,请遵循错误消息中的指示信息来安装 IBM CICS SDK for Enterprise Java (Liberty),将相应的 企业应用程序项目动态 Web 项目 导入到工作空间中,或者将构建的 EAR 或 WAR 项目添加到 CICS 束项目的根目录中。

EBA 应用程序无法使用 CWWKZ0005E 或 CWWKZ0021E 消息进行安装

如果 Liberty 未能安装 EBA ,那么它将生成CWWKZ0005ECWWKZ0021E消息。 这可能是在未安装 wab-1.0 功能部件时导致的。 确保正确安装了 wab-1.0 功能部件。

由于 Liberty 的 OSGi 支持稳定化, WAB 与 Java EE 8 或 Jakarta EE 8 及更高版本的功能部件不兼容。 如果 Java EE 8 或 Jakarta EE 8 及更高版本的功能也安装在同一台 Liberty 服务器中,则 wab-1.0 功能会自动卸载,导致任何 EBA 从服务器中移除。 JVM 概要文件属性 com.ibm.cics.jvmserver.wlp.wab 可用于控制是否将 wab-1.0 功能部件添加到 server.xml

错误消息 CWWKC2262E

The server is unable to process the 4.0 version and the http://xmlns.jcp.org/xml/ns/javaee namespace

这通常意味着未从构建脚本中排除应用程序服务器 (例如 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>

错误信息: java.lang.UnsatisfiedLinkError: /usr/lpp/db2v13/jdbc/lib/libdb2jcct2zos4_64.so (Library is already loaded in another ClassLoader ): ERRORCODE=-4472, SQLSTATE=null

如果 JVM 概要文件设置了 com.ibm.cics.jvmserver.wlp.jdbc.driver.location 属性,并且在 server.xml中存在针对 Db2® 的额外 "库" 定义,那么可能会发生此错误。 该错误是由于两个库尝试装入 Db2 DLL 本机。 确保仅存在 Db2 本机库的一个库,并且所有 dataSource 定义都指向该库定义。

DFHSJ1206 ,当 LINKing 到 Jakarta EE 9 或更高环境中的 @CICSProgram 时插入 PROXY_CLASS_NOT_FOUND

要链接到 @CICSProgram ,在 Spring Boot 和CDI应用程序中使用Jakarta EE 9或更高版本,这些应用程序必须使用 CICS 注释处理器版本 CICS 6.2 或APAR PH59389 构建。 否则, LINK 将失败, INVREQ 响应和 RESP2 为 48。 JVMSERVER stderr 将显示 com.ibm.cics.wlp.link.LinkableInvocationException ,并且将发出消息 DFHSJ1206 和 insertPROXY_CLASS_NOT_FOUND.