在 CICS Java 环境之间传递数据对象: 第 1 部分:CICS Java 环境

Java 是一种 CICS 应用程序的流行编程语言。CICS 提供多种 Java 环境,每种环境都有自己的优势,因此在不同的 CICS Java 环境之间传递数据对象是一个重要的话题。本系列文章将为您提供详细信息。第 1 部分介绍 CICS Java 环境、每种环境的优势,以及在各种环境之间传递数据的不同方式。第 2 部分使用一个示例 Java 类来展示如何在应用程序之间传递 Java 数据对象,这些应用程序在 CICS 池 JVM、基于 Axis2 的 JVM、CICS Dynamic Scripting 环境和基于 CICS OSGi 的 JVM 中运行。第 3 部分介绍如何从 CICS Transaction Gateway Java 客户端程序将 Java 数据对象传递到基于 CICS 的 JVM 或基于 CICS OSGi 的 JVM 中。

Weiand Dennis, CICS, Web, and Java, IBM Technical Sales 团队的客户技术专家, IBM

Dennis Weiand 的照片Dennis Weiand 是美国德克萨斯州达拉斯 CICS, Web, and Java on the IBM Technical Sales 团队的客户技术专家。



2012 年 4 月 23 日

简介

IBM® CICS® 的优势之一是它支持多种编程语言,并允许您将它们混合到一个应用程序中。但是,如果基于 CICS 的应用程序仅使用 Java,而您想要利用各种 CICS Java™ 环境的优势。当在 CICS 程序之间传递数据时,通常会将数据放在面向字段的系列字节结构中,以便用任何语言编写的应用程序都能够访问这些数据。但是,如果您只使用 Java 语言,则最好将数据放在面向对象的 Java 环境中,并在基于 CISS 的 Java 程序之间传递 Java 数据对象。本系列文章将讨论 CICS TS V4.2 或其更高的版本中可用的 CICS Java 环境,同时旨在让开发 CICS 程序的 Java 程序员使用该环境。本系列文章对 CICS 系统程序员和开始使用 Java 的 CICS 应用程序程序员也很有帮助。

从 1999 年的初始 Java 支持开始,已启用 CICS 来控制 JVM 池,在该池中,每次只会将一个基于 Java 的 CICS 事务分派给 JVM(因此需要一个 JVM 池)。在 CICS TS V4.1(2009 年 6 月)中,CICS 引入了 JVMServer 资源。该资源是一个 JVM,在该 JVM 中可同时分派多个基于 Java 的 CICS 事务。最初,只有系统功能才可以使用 JVMServer。但是,自 CICS TS V4.2(2011 年 6 月)起,JVMServer 可运行使用 Apache Software Foundation 开源 Web 服务引擎 Axis2 的 Java 程序,也可用于使用开放服务网关协议 (Open Services Gateway initiative, OSGi) 的客户编写的应用程序。

2010 年 6 月 CICS TS V4.1 提供了 CICS Dynamic Scripting Feature Pack,这是 Project Zero 技术 的实现,提供了情景 Web 应用程序的敏捷应用程序开发。Feature Pack 为 Web 工件提供服务,支持使用 PHP 和 Groovy 脚本语言,并且具有一个模型,可快速实现供情景应用程序访问的数据库,这使定义和呈现具有 REST 接口的数据库表变得非常简单。Feature Pack 在 CICS JVMServer 中实现,并且有一个到 Java 的桥接,提供了对 CICS 程序和资源的访问。

除 Java 可用作 CICS 服务器端编程语言外,各种非 CICS 环境中运行的 Java 客户端也可以调用在 CICS 中运行的程序。CICS Transaction Gateway 提供了一种使用 Java Enterprise Edition (JEE) Java Connector Architecture (JCA) 将信息从 Java 客户端传递到 CICS 的方式。此外,WebSphere Optimized Local Adapter (WOLA) 提供了从 WebSphere® Application Server 到 CICS 的跨内存通信,两者可在同一 z/OS® Logical Partition (LPAR) 上运行。

当在 CICS 所提供的不同 Java 环境之间传递数据,或者是将数据从 Java 客户端程序传递到基于 CICS 的程序时,可使用高达 32K 的通讯区域 (COMMAREA),或者是使用通道和容器来传递数量较大的数据(2005 年添加了通道和容器)。COMMAREA 和通道与容器可供 COBOL 和 CICS 支持的其他面向字段的语言使用,并且这些通信机制支持 Java 程序与在 CICS 环境中运行的过程面向字段语言进行交互。对于在多个 CICS 所提供的 JVM 环境中实现的应用程序来说,传递对象并不是 Java 友好的,因此需要更多步骤来使用 CICS 程序到程序通信机制。

例如,您可能想要在 CICS 所提供的 OSGi 环境中实现基于 Java 的业务逻辑,以便利用 OSGi 的功能。您可能想要使用 CICS 所提供的 Axis2 环境(在不同的 JVM 服务器中运行)将这些基于 Java 的业务功能显示为 Web 服务。您也可能想要使用 CICS Dynamic Scripting(另一个 JVM 服务器)快速向基于 OSGi 的业务逻辑提供一个 Web 接口,或者是使用 CICS Transaction Gateway(在 CICS 外的 JVM 中运行)提供到非 CICS Java 客户端的基于 OSGi 的业务逻辑访问。

本文介绍了在 CICS 环境的不同 JVM 中运行的 Java 程序之间传递对象的一种 Java 友好方式,或者在不同 CICS 区域中的 CICS 所提供的 Java 环境之间传递对象的一种 Java 友好方式。本文提供关于传递 Java 对象的背景信息,并阐述使用 CICS 所提供的各种 Java 环境的原因。

目标

在 CICS 环境中的应用程序之间传递数据的传统方式是:将数据放到面向字段的系列字节结构中,并将此结构放到 COMMAREA 中或 CICS 通道的 CICS 容器中。当使用 EXEC CICS LINK PROGRAM() 命令调用目标程序时,会传递 COMMAREA 或通道。对于 COBOL、IBM Assembler 和其他支持 CICS 的语言,不需要编集数据。但是,对于基于 CICS 的 Java 程序,必须将 Java 数据对象编集到面向字段的系列字节结构中,或从该结构取消编集这些数据对象。有实用工具可生成进行编集的代码,并且 COBOL 数据布局用于输入到实用工具。如果您的 CICS 应用程序使用的是多种编程语言,值得对 Java 进行一些特别操作,以支持基于 CICS 的 Java 程序与使用其他语言编写的 CICS 程序进行互操作。

对于在 CICS 所提供的 Java 环境中运行的 Java 程序来说,可以像往常一样使用 Java,初始化类并调用一些方法。如果您想要使用多个 CICS 所提供的 Java 环境来利用每种环境的优势,那么您可能想获得 CICS 的帮助来传递 Java 数据。对于跨多个CICS 所提供的 Java 环境的基于 CICS 的 Java 应用程序来说,您需要使用一种 Java 友好的方式在这些环境之间传递 Java 数据对象。对于访问由 Java 程序(在不同的 CICS 所提供的 Java 环境中)所提供功能的 Java 程序来说,如果传递数据像下列代码段一样简单,那么该操作对于 Java 程序员来说非常简单:

String abc = "Some information to Pass";
Employee emp = new Employee("John Doe");
DDW_CicsObjectTransporter transporter = 
    new DDW_CicsObjectTransporter();
transporter.addObject("abc",abc)
.addObject("emp",emp)
    .execute("TARGET");

// and after the program return

String errorString = (String)transporter.getObject("error");
If (errorString != null) {
    processError();
} else {
    Manager newManager = (Manager)transporter.getObject("mgr");
    // process/display Manager object that was returned
}

对于返回数据的响应 Java 程序来说,如果提供响应像下列内容一样简单,那么提供响应对于 Java 程序员来说也非常简单:

DDW_CicsObjectTransporter transporter = 
    new DDW_CicsObjectTransporter();
Employee emp = (Employee)transporter.getObject("emp");
// work with employee object
transporter.removeObject("abc");    // can remove transport object
Manger mgr = new Manger("Joe Bloggs");
transporter.addObject("mgr",mgr);  // add new or changed objects
return;

本系列的第 2 部分将介绍如何支持上述用例,并提供名为 DDW_CicsObjectTransporter 的示例 Java 类来支持上述交互。此外,与在使用 CICS TG 的 Java 客户端和 CICS TS 之间传输对象一起使用时,会提供 DDW_CicsTg_ObjectTransporter 对象。

CICS 提供的 Java 环境

每种 CICS 提供的 Java 环境都有自己的优势,因此您可能想对一个应用程序使用多种环境。如上所述,本系列文章的目的是提供一种框架来简化在不同的环境之间传输 Java 对象的方式。

池化的 JVM

从 1999 年开始,CICS 提供了池化的 JVM 环境。您指定可以在池中存在的最大 JVM 数量,然后 CICS 使用 JVM 来运行 CICS Java 程序。在池化的 JVM 环境中,CICS 每次向 JVM 分派一个 Java 程序。尽管本练习提供了良好的程序隔离,但这通常不是 Java 程序的考虑事项,并且每次在 CICS 区域中可运行的最大 Java 程序数量都相当于 JVM 池中的 JVM 数量。

当 CICS 收到请求时,它会启动一个程序来提供响应。因此,您需要通过 PROGRAM 定义来定义 CICS 的 Java 程序,在该定义中,要指定调用的初始 Java 类、想要运行的存储密钥(CICS 或 USER 密钥)以及指定此程序所需的 JVM 特征的 JVMProfile 文件,包括 CLASSPATH、LIBPATH、JVM 堆大小和 DB2 驱动程序等。

当分派 Java 程序时,CICS 从 JVM 池中选择一个 JVM,该池与程序的 PROGRAM 定义(JVMProfile 文件和执行密钥)指定的需求相匹配。然后在该 JVM 中启动 Java 程序。Java 程序从方法中指定的类开始,该方法具有 public static void main(CommAreaHolder ca)public static void main(String[] args) 签名。

Java 程序使用等同于 EXEC CICS 命令的 Java 等价物(称为 JCICS 类)与 CICS 进行交互。除了与 CICS 资源进行交互和调用以其他语言编写的 CICS 程序,Java 程序可与 DB2 或 WebSphere MQ 进行交互并进行其他具体 Java 工作。Java 程序应该总是使用 CICS 设备,如果它们存在(比如 CICS DB2 连接),以便 CICS 可以控制工作单元,这是 CICS 擅长的许多领域之一。

JVM 的内存来自 CICS 区域地址空间。CICS TS V4.1 或早期版本使用 31 位 JVM,因此 CICS 区域地址空间有 31 位存储,这意味着只有少量 JVM 可在单个 CICS 区域控制下运行。多个 CICS 区域为一个常见的业务功能提供服务的情况很常见,因此,在所需的并发性比单个 CICS 区域提供的并发性更多的情况下,可以启动多个 Java Owning Regions (JOR) 并在其中分派工作。CICS TS V4.2 使用 64 位 JVM,该 JVM 略高于 64 位存储,因此几个 JVM 可位于由单个 CICS 区域维护的 JVM 池中,从而减轻或消除多个 CICS 区域为较大 Java 工作负荷提供服务的需求。

在 CICS TS V4.2 中,现在可以在 JVM 服务器环境中运行客户编写的程序(将在下一部分介绍)。在 CICS TS V4.2 通知信中,IBM 声明将在未来的 CICS 版本中删除池 JVM 环境。

CICS JVM 服务器环境

CICS TS V4.1(2009 年 6 月)引入了 JVMSERVER 资源,该资源提供了 JVM 服务器环境。此 JVM 服务器环境支持每次向同一 JVM 分派多个 CICS Java 任务。当定义 JVMSERVER 资源时,您指定可向单个 JVM 分派的最大数量(1 至 256)的并发 Java 任务。您可以在单个 CICS 区域控制下运行多个 JVM 服务器,但是由单个 CICS 区域控制的分派到所有 JVM 服务器的总任务数不能超过 1024。在 CICS TS V4.1 中,只有 CICS Dynamic Scripting(如下所述)和 SupportPac CN11(为 WebSphere XD Compute Grid 提供 batch container)使用 JVM 服务器环境。CICS TS V4.2(2011 年 6 月)更改为 Java 6.0.1 64 位环境,添加了基于 OSGi 的 JVM 服务器和基于 Axis2 的 JVM 服务器(在该服务器中可部署用户编写的 Java 程序)。

基于 OSGi 的 JVM 服务器环境

CICS TS V4.2 中基于 OSGi 的 JVM 服务器环境要求使用 OSGi 捆绑包打包 Java 程序。OSGi 是 Java 的动态模块系统,并且所有主要 Java 应用程序服务器一直都在采用它。OSGi 中的模块化提供了一种将系统划分为独立模块(称为捆绑包)的机制,单独打包并部署这些捆绑包,并且每个包都有自己独立的生命周期。此模块化支持您将复杂的应用程序划分为独立的部分,以方便进行部署、测试和维护。

没有 OSGi,可通过指定 CLASSPATH 环境变量使 Java 类和 JAR 文件可供 JVM 使用。此 CLASSPATH 是静态的,并且不会更改 JVM 的使用寿命。凭借 OSGi,可从 JVM 动态地添加和删除 Java 类。

OSGi 还提供了内存服务注册表,可从中找到其他模块,并将它们绑定到注册服务。由模块组成的组件可在 OSGi 服务注册表中发布,并且在该注册表中,可找到其他模块并将它们绑定到那些服务。组件可显示捆绑包中的所有类或者显示具体接口。同样,组件可在其他包或模块上声明其依赖性。模块可包含在安装、卸载或升级模块时调用的生命周期方法。您还可以提供扩展点以允许其他人扩展模块的功能性。

可将一个或多个 Java 包(包含类)分组到一个 OSGi 捆绑包中。CICS 环境允许您将一个或多个 OSGi 捆绑包编组为一个 CICS BUNDLE。当安装、启用、禁用和弃用 CICS BUNDLE 时,CICS BUNDLE 中的 OSGi 捆绑包经历相应的 OSGi 生命周期更改,因此允许您在正在运行的 CICS JVM 服务器中动态地添加和删除 Java 类和包。可使用 CICS Explorer 显示 OSGi 捆绑包和 CICS BUNDLE 的生命周期状态。基于 OSGi 的 JVM 服务器应该考虑 CICS 中基于 Java 业务逻辑的战略方向。

当 CICS 收到请求时,它会启动程序以提供响应。因此,您需要通过 PROGRAM 资源定义来定义 CICS 的 Java 程序。对于将在 JVM 服务器中运行的基于 CICS 的 Java 程序,您必须定义指定 CONCURRENCY(REQUIRED) 的 PROGRAM 定义、CICS 的存储密钥、该程序运行的 JVMSERVER 资源的名称,以及引用 Java 程序的 OSGi 注册表项的名称。

当在 OSGi 捆绑包中打包 Java 程序时,对于开始执行 CICS 的那些类来说,应在指定类开始执行的位置的捆绑包清单中包含 CICS-MainClass= 关键字。CICS-MainClass= 关键字使得 CICS OSGi 环境能够在 OSGi 注册表中注册指定的类。与池 JVM 一样,在具有 public static void main(CommAreaHolder ca)public static void main(String[] args) 签名的方法的指定类中,开始执行 Java 程序。

与 CICS 的池化的 JVM 环境一样,Java 程序使用等同于 EXEC CICS 命令的 Java 等价物(名为 JCICS 类)与 CICS 进行交互。除了与 CICS 资源进行交互并调用以其他语言编写的 CICS 程序外,Java 程序还可以与 DB2 和 WebSphere MQ 继续交互,并进行其他具体 Java 工作。Java 程序应该总是使用 CICS 设备,如果这些(比如 CICS DB2 连接)存在的话,以便 CICS 可以控制工作单元(这是 CICS 擅长的许多领域之一)。

JVM 服务器的内存来自 CICS 区域地址空间。CICS TS V4.2 使用 64 位 JVM,它高于 64 位存储,因此在单个 CICS 区域中可存在多个 JVM 服务器。在一个 JVMServer 中,CICS 可分派 1 到 256 个并发任务,默认值为 15。指定区域中所有 JVM 服务器的所有并发任务总数不能超过 1024。

基于 Axis2 的 JVM 服务器环境

从 CICS TS V3.1(2005 年 3 月)开始,CICS 启用了将基于 CICS 的程序显示为 Web 服务的功能,在此之前,是使用 SupportPac(2003 年 3 月) 或通过 SOAP Feature for CICS(2003 年 9 月)实现此功能。Web 服务支持最初由 CICS TS V3.1 提供,支持显示使用 CICS COMMAREA 或通道和容器(将在下面介绍它们)调用的 CICS 程序。

作为将基于 Java 的 CICS 程序作为 Web 服务显示的另一个选项,CICS TS V4.2(2011 年 6 月)包含 Axis2,Axis2 是一个 Apache 开源 Web 服务引擎,由 CICS 提供,用于在 Java 环境中处理 SOAP 消息。在 CICS 中针对基于 Java 的 Web 服务使用的 Axis2 技术提供了更高的 zAAP 专业处理器利用率。在某些情况下,可将 Java 和 XML 解析卸载到专业处理器,比如 System z Application Assist Processor (zAAP),而不是在 IBM 大型机的一般处理器上进行工作。

CICS 中的 Axis2支持允许您显示基于 CICS 的 Java 程序,并使用 Java 语言开发 Axis2 风格的头处理程序。Axis2 支持 Web 服务和处理程序的热部署、异步 Web 服务、Message Exchange Pattern (MEP)(WSDL 2.0 的一部分)、WSDL 1.1 和 2.0,并使用作为 JAX-WS 一部分的注释,将 Plain Old Java Objects (POJOs) 显示为 Web 服务。构建 Axis2 工件的工件是 Java 6 Java Standard Edition (JSE) 的一部分。

CICS 动态脚本

2010 年6 月,CICS 提供了 CICS Transaction Server Feature Pack for Dynamic Scripting。此 Feature Pack 在 JVM 服务器中运行并且是 Project Zero 技术的实现。Project Zero 的目标是提供敏捷的编程环境,以支持程序员快速实现情景应用程序,比如针对临时市场营销工作的应用程序,或者是改进部分或团队效率的工具。

CICS Transaction Server Feature Pack for Dynamic Scripting 支持您快速提供 Web 页面,并使用 PHP、Groovy 和 Java 编写应用程序。因为是在 Java 环境中实现 Feature Pack,所以还提供了到 Java 的桥接。从您的 PHP 或 Groovy 程序,您可要实例化 Java 类并调用这些类的方法。除了支持您了解 Java 的能力,Java 桥接还支持 PHP 和 Groovy 脚本使用 JCICS 类并控制 CICS 资源(JCICS 类是 EXEC CICS 命令的 Java 等价命令)。Project Zero 还提供了 Zero Resource Model (ZRM),ZRM 提供了一种快速方式来定义表格并访问这些表格中的数据,方法是使用 REST 接口或者是位于集合和这些集合的成员之上的简单 API。您还可以使用 SQL 访问数据库信息,支持 DB2 和 Derby 数据库。

通过 HTTP 请求可以访问 CICS 动态脚本应用程序,这些请求通常是请求 Web 页面(HTML、JavaScript 或级联样式表)、PHP 或 Groovy 脚本调用或者是 REST 服务。

尽管您可以使用 PHP 或 Groovy 编写整个应用程序,但是只可以通过指向 CICS 动态脚本应用程序的 HTTP 请求访问这些应用程序的业务逻辑。因此,最佳方法是在基于 OSGi 的 JVM 服务器中运行基于 Java 的业务逻辑,以便可使用任意 CICS 互操作性选项从任意 CICS 设备或客户端访问业务逻辑。可以使用 CICS 动态脚本快速提供基于 OSGi 业务层的表示层。

CICS Transaction Server Feature Pack for Dynamic Scripting V1.0 在 CICS TS V4.1 中运行,而 CICS Transaction Server Feature Pack for Dynamic Scripting V1.1 在 CICS TS V4.2 中运行。

CICS Transaction Gateway

CICS Transaction Gateway (CICS TG) 利用多种客户端编程语言(比如 C/C++、Java、Microsoft® .NET、Microsoft Visual Basic、PowerBuilder 和基于工作站的 COBOL)向 CICS 提供安全事务通信。

对于在非 CICS 环境中运行的 Java 客户端,CICS TG 实现 Java Connector Architecture (JCA),这定义从 Java 程序到 Enterprise Information Systems (EIS)(比如 CICS、IMS、JDEdwards、PeopleSoft 和 SAP)的标准通信方式。JCA 定义使用名为 Common Client Interface (CCI) 的标准 API 来实现托管或非托管连接的方式。使用托管连接,Java Enterprise Edition (JEE) 应用程序服务器可提供连接管理,控制事务,并增强安全上下文。此标准 CCI API 允许 Java 程序员使用常见 API 访问不同 EIS 的数据。

可以多种配置设置 CICS TG,有关更多信息,请参见 CICS TG 信息中心

对于使用 Java 编写的 CICS 客户端程序和在 Java 中实现的 CICS 服务器端业务逻辑场景,您可以使用本文中介绍的技术,将 Java 数据对象从 CICS TG 客户端程序传递到实现业务逻辑的基于 CICS 的 Java 程序。

在 CICS 程序之间传递数据

在 CICS 程序之间传递数据的 CICS 所提供的技术包括传递 COMMAREA 或传递通道和容器。

COMMAREA

在 CICS 的 40 年历史的大部分时间中,在构成应用程序的程序之间传递数据的标准方式是名为通讯区域 (COMMAREA) 的存储块,它最多为 32 KB。过去,CICS 主要支持过程语言,比如 COBOL 和 PL/I,使用这种语言可以简单地定义 COMMAREA 面向字段的数据布局。在运行时,使用过程语言编写的程序将数据放置到数据布局中,并将其链接到另一个 CICS 程序,这将传递 COMMAREA(LINK 是程序调用的 CICS 等价物)。LINK 方法旨在支持在基于 CICS 的程序之间传递数据,这些程序以相同或不同的程序语言实现并在相同或不同的 CICS 区域中的运行。

图 1 显示了传递 COMMAREA 的程序示例。尽管这对于处理固定大小字段(传递的总数据大小小于 32KB)的过程语言来说非常方便,但是 COMMAREA 不是在 Java 程序之间传递数据的简单方式。最接近此面向字段的系列字节的 Java 构造是字节数组。但是,Java 字节数据不包括访问从 75 到 100 的字节,例如,通过名为 customerAddress 的名称。由 IBM z/OS Java 提供的 JZOS 实用程序等工具和 Rational Application Developer 的向导允许您从 COBOL 数据布局生成 Java 数据对象。如果您需要在 Java 和另一种 CICS 编程语言之间移动,那么这些工具和向导是一个不错的解决方案。它们为构造中的每个字段提供 Java getters 和 setters,并且在 Java 程序需要将数据传递到 CICS 或从 CICS 获得数据时提供 getBytes()/setBytes()getByteBuffer()/setByteBuffer() 方法。

当在 Java 程序之间传递数据时,如果您处于 CICS Java 环境中,那么可以使用常规 Java 方法,即实例化对象(比如 CheckingAccount),并调用对象(比如 computeInterest())的方法。如果 Java 应用程序横跨不同的 CICS Java 环境,或者是基于 Java 的应用程序横跨多个 CICS 区域,那么应用程序可在这些不同的 CICS 所提供的 Java 环境中使用 CICS LINK 命令调用各种 Java 程序。使用 COMMAREA 是一种在这些 Java 程序之间传递数据的方式,但是它需要从 Java 对象到面向字段的系列字节结构(字节数组)的转换。此外,当链接到在另一种 CICS Java 环境中运行的目标 Java 程序时,需要在链接到的目标 Java 程序中从字节数组转换为一个或多个 Java 对象。

Java 程序员可序列化他们想要传递的对象(这会将对象转变为一个字节数组),通过 COMMAREA 传递系列化的对象,并在目标 Java 程序中取消对象的序列化。但是,您可能想要传递多个对象,并且您可能需要突破 32KB 的限制。此外,向两个方向发送 COMMAREA 时,它通常具有相同的长度。

使用 COMMAREA 进行程序间通信

通道和容器

自 CICS TS V3.1(2005 年 3 月)开始,对于程序到程序通信,现在可将大量数据放置到与具体通道相关的命名容器集合中。可在指定的通道中防止任意数量的容器,然后将通道(及其中的所有容器)传递到目标程序,如图 2 所示。CICS 不限制容器的大小或通道中容器的数量。但是,根据事务达到率和程序的混合,实际上存在限制,因为容器的空间来自 CICS 区域存储。就一般而言,您应该使用应用程序需要的容器,但是不要忽略并浪费空间,否则应用程序可能会造成 CICS 存储不足的情况。

使用通道和容器进行程序间通信

从图 2 可以看出,容器具有名称且可以为任意大小。从图 2 无法完全了解它,但是如果将容器从程序 A 发送到程序 B,并且程序 B 不进行任何修改,则 CICS 知道不需要将容器返回到程序 A,因为程序 A 已经有了容器内容的副本。如果程序 B 从程序 A 收到容器,则程序 B 可更改数据和容器大小。对于过程编程语言,每个容器的数据布局可包含 0 或更多字段。当在 Java 和过程语言之间传递数据时,可使用 JZOS 实用工具或 Rational Application Developer 向导从 COBOL 中定义的容器布局生成一个 Java 对象。这些生成的 Java 对象支持您使用 getters 和 setters 从 Java 访问数据,或者是使用常规的过程面向字段数据布局从过程语言访问数据。JZOS 实用程序和 Rational Application Developer 向导已经在 COMMAREA 部分进行了介绍。

有两种类型的容器:CHAR 和 BIT。CHAR 容器适用于字符数据,如果需要的话,CICS 可在 CHAR 容器上执行代码页面转换。BIT 容器适用于二进制数据,与 Java 字节数组类似。

从图 2 还可以看出,可以将通道和容器看作关联数组,这类似于 Java hashtable,其中通道类似于容器数组。可通过根据名称请求容器来访问容器的内容。

如果正在非 CICS 环境中使用 Java 客户端与基于 CICS 的程序进行交互,那么应该使用 CICS TG V7.1 或其更高版本,并使用 IPIC 作为通信类型,与 CICS TS V3.2 或其更高版本进行通信,Java 客户端还可以使用通道和容器。

在 CICS Java 程序之间传递 Java 对象

基于上述信息,您可能已经得出这样一个结论:如果您的目标是将数据从在 CICS 提供的 Java 环境中运行的 Java 程序传递到在另一种 CICS 提供的 Java 环境中运行的 Java 程序,则可使用 CICS 通道和容器传递序列化 Java 对象。这一过程避免了:

  • 为在 Java 程序之间传递的数据创建一个 COBOL copybook 布局
  • 运行实用工具来根据 COBOL copybook 创建 Java 数据对象
  • Java 程序员了解 COBOL 的需要
  • 在源代码库中维护所需 COBOL copybook 的需要
  • 执行 COBOL copybook 生产周转的需要
  • 如果传递数据的内容发生变化而更新 COBOL copybook 的需要(以及浏览后续存储库更新和生产周转的需要)

一般 Java 程序员都了解对象序列化,在 Internet 上有一些关于 Java 对象序列化代码的示例。序列化 Java 对象并在通道和容器中传递它们提供了一种在基于 CICS 的 Java 程序之间传递 Java 对象的简单方式。这些程序可在不同的基于 CICS 的 Java 环境中运行,或者是在由不同 CICS 区域控制的 Java 环境之间运行。链接的基于 CICS 的 Java 程序(或 CICS TG 客户端 Java 程序)可序列化传递到系列容器中的 Java 对象。然后,所链接的 Java 程序可取消对象的序列化,根据需要修改它们,序列化返回到容器的修改对象,然后将它传递回链接程序。

如果您正在使用基于 CICS 的 Java 程序中的 Java 类,可像往常一样使用它们,实例化对象并调用对象的方法。仅当您想在不同的 CICS Java 环境之间移动数据以利用其各自优势、将数据移动到另一个 CICS 区域中的 CICS Java 环境或者将应用程序扩展到多个 CICS Java 环境以进行工作负荷管理或获得应用程序可用性时,可能才需要在 CICS Java 环境之间传递 Java 对象。

本系列文章的第 2 部分将介绍如何使用通道和容器来传递 Java 数据对象,描述在 CICS 应用程序之间传递数据的通用框架。第 2 部分还将提供执行 Java 对象序列化、取消序列化的 Java 类和 LINK 功能,允许您集中精力于应用程序的 Java 方面而不是在不同 CICS Java 环境之间传递 Java 对象的细节。

结束语

本文章介绍了 CICS 提供的不同 Java 环境:

  • 传统的池化的 JVM,其中每次只有一个基于 CICS 的 Java 事务在 JVM 中运行。
  • CICS JVM 服务器环境,其中每次可向同一 JVM 分派多个 Java 程序请求。下面是使用 JVM 服务器(但是无法混合到一个 JVM 服务器中)的 CICS 所提供的 Java 环境:
    • 基于 OSGi 的环境,其中提供了 OSGi 动态模块系统,具有下列功能,比如动态向 JVM 中添加 Java 类,或从中删除 Java 类,提供了 OSGi 注册表,显示了到 Java 模块而不是模块中所有类的接口,并指定了模块依赖性来消除常见的 ClassNotFound 问题。
    • Axis2 开源 Web 服务引擎,支持您使用 JAX-WS 注释快速且轻松地显示 POJO,并以 Axis2 风格编写处理程序。
    • CICS Dynamic Scripting,提供了使用 PHP 和 Groovy 脚本语言快速开发 Web 应用程序的方式。PHP 和 Groovy 解释器在 Java 中实现,因此有 Java 桥接支持您实例化 Java 对象并调用 CICS 程序。
  • CICS Transaction Gateway,促进从在非 CICS 环境中运行的 Java 程序到 CICS TS 程序的通信。

本文还介绍了在基于 CICS 的程序之间传递数据的两种方式:

  • COMMAREA:高达 32 KB 的数据块
  • 通道和容器:多个已命名的任意长度(容器)的数据块编组到一个已命名的通道中

最后,本文介绍了如何在各种 CICS 提供的 Java 环境之间传递 Java 数据对象,方法是使用常规的 CICS 通道和容器机制,将序列化的 Java 数据对象放置到容器中,然后根据需要对它们进行取消序列化。

致谢

作者想要感谢下列 IBM 同事,感谢他们审阅本文并提供关于内容和改进的一些建议:

  • Steve Fowlkes,认证的 IT 专家,CICS Technical Support,IBM USA
  • Leigh Compton,认证的 IT 专家,CICS Advanced Technical Skills Team, IBM USA
  • Mark Cocker,CICS Technical Strategy and Planning,IBM UK
  • Phil Wakelin,CICS Technical Strategy and Planning,Java and Access to CICS,IBM UK

参考资料

学习

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, Java technology
ArticleID=811122
ArticleTitle=在 CICS Java 环境之间传递数据对象: 第 1 部分:CICS Java 环境
publish-date=04232012