使用 JCICSX 进行 Java 开发

JCICSX API 类允许您通过 Java API 访问 CICS 服务。 它们支持 CICS 功能的子集,可以远程运行,并且比 JCICS 的 Java 类更易于模拟和存根。 JCICSX API 类可与 JCICS API 一起使用,但只有使用 JCICSX 的命令才能受益于这些增强功能。

为什么使用 JCICSX?

JCICSX API 类扩展了 JCICS API 的部分功能,具有远程开发和模拟功能。 它们具有以下优点:
  • 这些课程允许轻松的嘲笑和固执。 JCICSX API类可以更容易地应用控制反转和注入测试双倍,因此在单元测试期间,您可以使用Mockito、EasyMock,和PowerMock等框架在工作站上模拟JCICSX方法调用。
  • 可以在开发环境中远程运行这些类。 您可以通过在本地工作站上执行 CICS Java 应用程序来链接到程序或通过远程 CICS 区域中的通道和容器传递数据,而不必将应用程序重复部署到 CICS。 此外,无论应用程序代码是在 CICS 中运行还是在本地工作站上运行,都不需要对其进行修改。
  • 对于更熟悉最新 Java 构造函数的 Java 开发者而言,语法是简化且自然的。
  • 您可以利用现代 Java IDE 的功能,例如内容辅助,调试,智能导航和热交换。 这是通过在本地 IDE (包括 IntelliJ 和 Eclipse) 中支持模拟和远程开发来实现的。
  • 使用 JCICSX API 类编写的代码,无论是在远程开发模式下,还是部署到 CICS 中运行时,都可以在不做更改的情况下执行。
  • 它与 JCICS API 兼容。 JCICSX API类可在同一程序中与JCICS API同时使用,但只有纯JCICSX程序才能受益于远程开发等增强功能。 例如,如果在同一个程序中混合使用 JCICS 和 JCICSX,就无法在开发环境中远程运行。

JCICSX 的限制

JCICSX API 类仅支持CICS功能的一个子集,该子集解决了在CICS中使用 Java 的一些最常见情况,重点是使用通道和容器链接到CICS程序。 更多信息,请参阅 参考:JCICSX API 类。 如果您需要使用超出该范围的函数,请考虑 使用 JCICS API

最初提供的客户端工具可使 Liberty 用户使用 JCICSX 从 servlet 访问 CICS 。

JCICSX API 类无法在作为异步 servlet 一部分调度的工作线程中正常工作。

JCICSX 的安全模式

对于远程开发,JCICSX 需要在 CICS 中设置一个 Liberty JVM 服务器来接收远程 JCICSX 请求。 JCICSX 客户端工具会创建一个新的 CICS 任务,并调用服务器。 来自该客户端的后续 JCICSX 请求将在同一任务下运行,且必须由同一用户发出。 使用客户机端工具时,这是透明的。 Liberty JVM 服务器可配置为对 JCICSX 调用使用身份验证和授权,客户端与远程服务器之间的通信可配置为使用 SSL。 有关详细信息,请参阅 如何工作:确保 JCICSX 应用程序的安全为 JCICSX 应用程序设计安全

在其他情况下,例如当应用程序部署到 CICS 中运行时,JCICSX 采用与 JCICS 相同的安全模型。

为 JCICSX 配置环境

为 JCICSX 配置环境如下:
  • 如果您想使用 JCICSX 进行远程开发,则需要进行额外配置,以建立支持基础设施 在 CICS 中在本地工作站上。 请注意,CICS中的支持基础设施仅在开发区域需要。 JCICSX API 默认在所有 CICS JVM 服务器中可用。
  • 必需: 通过 导入 JCICSX 依赖关系来设置编译环境。
远程开发所需 系统程序员必须在 CICS TS 中配置 Liberty JVM 服务器,并启用 JCICSX 服务器功能 (cicsts:jcicsxServer-1.0)
请注意,JCICSX 支持 Liberty servlets 的远程开发。
  1. 在应用程序将远程执行的开发 CICS 区域中设置 Liberty JVM 服务器。 建议您仅为远程开发目的设置 JVM 服务器,以便远程 JVM 服务器和实际应用程序 JVM 服务器可以具有不同的配置。 否则,配置可能会发生冲突。 有关更多信息,请参阅 设置 Liberty JVM 服务器
  2. cicsts:jcicsxServer-1.0 Liberty 功能部件添加到 Liberty JVM 服务器的 server.xml 文件:
    <featureManager>
        <feature>cicsts:jcicsxServer-1.0</feature>
    </featureManager>
  3. 让开发者知道此 Liberty JVM 服务器的主机名和 httpEndpoint 端口。
  4. 如果需要,请配置远程 Liberty JVM 服务器的安全性。 请参阅 为 JCICSX 应用程序设计安全性
远程开发所必需 开发人员配置本地开发环境,以便在本地运行 Java 代码并为 JCICSX 进行远程调用>
  1. 如果本地工作站上没有 Liberty 运行时,请安装一个,例如 WebSphere® Liberty Web Profile。 必须是在自由 19.0.0.3 或更晚。 更多信息,请参阅 WebSphere Liberty for developers
  2. 如果您在本地开发环境中使用 Java EE 7 或 Java EE 8,请将 jcicsxClient-1.0 Liberty 功能安装到本地工作站的通用 Liberty 运行时中。 如果您在本地开发环境中使用 Jakarta EE 9 和 Jakarta EE 10,请将 jcicsxClient-2.0 Liberty 功能安装到本地工作站上的通用 Liberty 运行时中。 在命令行上,导航到本地 Liberty 服务器的 bin 目录,然后输入以下 installUtility 命令
    installUtility install jcicsxClient-1.0 jsonp-1.0
    installUtility install jcicsxClient-2.0 jsonp-1.0
    注意: 要使用 jcicsxClient-2.0 Liberty 功能,必须在本地开发环境中安装 Liberty fix pack 25.0.0.3 及以上版本。 要使 Liberty 修补包 25.0.0.3 或 25.0.0.6 支持 jcicsxClient-2.0 Liberty 功能,需要 Liberty APAR 修补包 OLGH31741。 对于 Liberty fix pack 25.0.0.9 及以上版本,不需要 Liberty APAR fix OLGH31741 ,因为 ifix 将集成到 Liberty 中。
  3. 创建本地 Liberty 服务器,该服务器使用工作站上的 Liberty 运行时来运行 Java 代码。
  4. 在本地 Liberty 服务器中启用 jcicsxClient-1.0jcicsxClient-2.0 功能,方法是将此添加到 server.xml
    <featureManager>
        <feature>usr:jcicsxClient-1.0</feature>
    </featureManager>
    <featureManager>
        <feature>usr:jcicsxClient-2.0</feature>
    </featureManager>
  5. 在本地 Liberty 服务器中使用系统程序员创建的远程 Liberty JVM 服务器的主机名和端口配置 server.xml 文件,其中包含 cicsts:jcicsxServer-1.0 功能部件:
    <usr_jcicsxClient serverUri="http://hostname:port"/>

    cicsts:jcicsxServer-1.0jcicsxClient-1.0jcicsxClient-2.0 两个版本的客户端兼容。

    如果远程 Liberty JVM 服务器配置为使用身份验证,则可以使用本地 Liberty 服务器 bin 目录中提供的 securityUtility 命令加密用户密码。 因此,您的片段可能如下所示:
    <usr_jcicsxClient serverUri="http://hostname:port">
        <basicAuthentication user="myUser" password="{aes}ADwac72WXpSCr2YDUv3hHgjfOa0moXZDj626MmM4DbtT"/>
    </usr_jcicsxClient>
  6. 如果远程 Liberty JVM 服务器使用 SSL 连接进行数据加密,那么本地 Liberty 服务器需要信任远程服务器的证书。 请参阅 设计示例: 使用 TLS 客户机认证保护 JCICSX 服务器中针对应用程序开发者的指示信息。
需要开发人员解决 JCICSX 依赖性问题
JCICSX API 类可在 CICS TS 中使用,与 JCICS API 一起在 CICS TS 5.6 或更高版本中使用。 您可以从以下任何地方导入 JCICSX API 类:
  1. IBM® CICS SDK for Java 中提供的构建路径库在 IBM CICS Explorer®.

    当使用 CICS Explorer将库添加到您的项目中时,JCICSX 会自动作为 API 出现在您的客户端中。 请参阅 " 创建动态 Web 项目 "中的步骤 1,将动态 Web 项目配置为 CICS TS 目标。 如果尚未安装 CICS Explorer ,请按照设置开发环境中的说明进行安装。

  2. com.ibm.cics.jcicsx 工件。 如果尚未安装 Gradle 或 Maven,请按照 " 设置开发环境 "中的说明安装。

    如果您的企业使用本地托管或允许列出的存储库,那么可以使用诸如 JFrog Artifactory 或 Sonatype Nexus 之类的工具来配置要从此类存储库获取的工件。

  3. CICS 随附的 com.ibm.cics.jcicsx.jar 文件位于 USSHOME 目录中,您可以将该目录复制到编译环境中。 有关详细信息,请参阅手动导入 Java 库

JCICSX 使用案例和示例

配置完成后,您就可以开始为 JCICSX API 类编码了。

在单元测试期间,您可以使用熟悉的测试框架在工作站上模拟 JCICSX 方法调用。

当启用了用于远程开发的 Liberty JVM 服务器时,您可以在本地 Liberty 服务器中运行应用程序代码,以检查代码在 CICS 中运行时的表现,或者通过向 CICS 区域进行远程调用,探索 API 命令会返回哪些信息。 在本地 Liberty 服务器中运行应用程序时,任何 JCICSX 调用都将自动重定向到 CICS 区域。 当您的应用程序部署到运行在真正的 CICS 区域中的 JVM 服务器时,将直接对 CICS 进行相同的 JCICSX 调用。

JCICSX 的典型用例在 JCICSX 示例中显示。 有关所有 JCICSX API 类的详细信息,请参阅 JCICS Javadoc 参考

最佳实践

如果使用 JCICSX 进行开发,建议在工作站上的本地 Liberty 服务器中运行代码。 这可以减少不同应用程序在 CICS 开发区域的共享 JVM 服务器中运行时相互冲突的问题。

如果计划将应用程序部署到运行在 CICS TS 中的 Liberty JVM 服务器上,请参阅共享 JVM 的注意事项了解最佳实践。

故障诊断

您可以使用 Java IDE 的调试器,控制台消息和错误处理信息来调试应用程序。 JCICSX 还允许多个客户端同时调试。

如果发生与 CICS 相关的错误 (例如,远程 JVM 服务器或 CICS 事务) ,那么将返回响应 (RESP) 代码。 系统程序员可以使用 JVM 服务器的跟踪和日志进行调试。 有关更多信息,请参阅 Java 应用程序故障诊断

参考资料JCICSX 应用程序接口类

JCICSX API 类支持以下CICS功能的子集。 有关每个类的详细信息,请参阅 JCICS Javadoc 参考
表 1. JCICSX API 类
描述
CICSContext API 正在其中执行的环境。 JCICSX API 的入口点。
通道 创建或删除通道,或者检索有关其中的容器的信息。
容器 创建容器,检索有关容器的信息,从容器中获取数据并将数据放入容器中,或者删除容器。
ProgramLinker 链接到程序。

参考:JCICSX 和 EXEC CICS API 命令之间的映射

该表显示了 JCICSX API 方法如何映射到 EXEC CICS API 命令。 仅列出具有映射关系的方法。
表 2。 JCICSX 和 EXEC CICS API 命令之间的映射
方法 EXEC CICS API 命令
BITContainer
CHARContainer
WritableBITContainer
WritableCHARContainer
WritableContainer
append EXEC CICS PUT64 CONTAINER APPEND
6.2 后来
BITContainer
WritableBITContainer
appendWith EXEC CICS PUT64 CONTAINER APPEND
6.2 后来
BITContainer
CHARContainer
WritableBITContainer
WritableCHARContainer
WritableContainer
prepend EXEC CICS PUT64 CONTAINER PREPEND
6.2 后来
BITContainer
WritableBITContainer
prependWith EXEC CICS PUT64 CONTAINER PREPEND
BITContainer
CHARContainer
WritableBITContainer
WritableCHARContainer
WritableContainer
put EXEC CICS PUT64 CONTAINER
Channel
exists
getContainerCount
EXEC CICS QUERY CHANNEL
Channel delete EXEC CICS DELETE CHANNEL
ChannelProgramLinker link EXEC CICS LINK PROGRAM
Container delete EXEC CICS DELETE CONTAINER CHANNEL
Container getLength EXEC CICS GET CONTAINER CHANNEL NODATA
ProgramLinker
link
EXEC CICS LINK PROGRAM
ReadableBITContainer
get
read
EXEC CICS GET64 CONTAINER
ReadableCHARContainer
ReadableContainer
get EXEC CICS GET64 CONTAINER