© Copyright International Business Machines Corporation 2003. All rights reserved.
引言
本文是 使用 WebSphere Studio Enterprise Developer V5 的 EGL 和 Struts ? 第 1 部分:生成 Java一文的续篇。在前一篇文章中,我们描述了 WebSphere®Studio Enterprise Developer V5 用来部署用 WebSphere Application Server V5 的企业生成语言(Enterprise Generation Language,EGL)编写的应用程序的体系结构。我们使用了 Struts 框架作为模型,并描述了如何生成、测试并部署一个分为三层的应用程序,该应用程序由 Web 接口、WebSphere Application Server 和执行 DB2® 查询来访问数据库的服务器程序组成。
在第 1 部分中,我们研究了如何用 EGL 来生成 Java™ 服务器程序。在第 2 部分中,我们将研究如何用 EGL 来生成在 z/OS® 上运行的 COBOL/CICS® 服务器程序,以及如何在 WebSphere Application Server V5 中配置 J2EE Connection Architecture(JCA Connector)。
在开始阅读本文之前,我们希望您能按照第 1 部分的 下载说明把本文要用到的样本程序装入到 WebSphere Studio Enterprise Developer 中。
生成用于 z/OS 的 COBOL
在 z/OS 环境中,您可以使用 CICS 来部署服务器程序(Web 应用程序的第三层)。人们也常常希望这样做,因为在 CICS 中大多数被服务器程序所调用的数据集和旧的代码常常也是位于 z/OS 中。在这种情况下,COBOL 服务器程序的性能将比 Java 服务器程序更好。
对于我们的示例,您必须在 WebSphere Studio Enterprise Developer(以下简称 Enterprise Developer)中执行下列任务以创建并测试 COBOL/CICS 装入模块:
1. 创建并测试 EGL 程序文件
本(系列)文章的 第 1 部分描述了执行这个任务所涉及到的步骤(包括对 Struts 和 EGL 的介绍)。当您完成第 1 部分中的步骤 1.1 至步骤 3.3 后,再继续执行下面的任务。
2. 创建用于生成 COBOL 代码的构建描述符
如同我们在 第 1 部分中生成 Java 服务器程序时所做的那样,我们现在必须创建相似的 EGL 构建描述符来支持 COBOL 的生成。
2.1 创建用于 COBOL 的构建描述符
cics-cobol
作为名称。这样 cics-cobol
部件就会被添加到 Outline 视图中,并被打开以供编辑。 图 1. 用于 COBOL/CICS 的构建描述符
指定选项的简要描述:
选项 | 描述 |
Bind = coboldb2 |
DB2 必需的选项。绑定模板标识 z/OS 中用于 DB2 访问的绑定控制部件;您将需要在晚些时候创建这个部件。 |
cicsEntries = RDO |
MVSCICS 可选的选项。当您生成 COBOL 程序时,该选项可指定是否要产生 CICS 定义;它将帮助 CICS 专家找出必须将哪些条目添加到 CICS PPT 中。 |
commentLevel = 1 |
该选项指定包含在生成的 COBOL 源代码中的 EGL 注释的级别;如果您在故障诊断时需要将 COBOL 源代码与 EGL 源代码对应起来,这很有用。 |
destHost | 运行目标构建服务器的机器的名称;例如 carmvs1.raleigh.ibm.com 。 |
destPassword | 与 destUserID 对应的密码。 |
destPort | z/OS 构建服务器的端口号;它必须与用来启动 z/OS 构建服务器的作业中指定的端口号相匹配。 |
destUserID | 用于在 z/OS 上进行处理的用户标识。 |
genDirectory | Enterprise Developer 放置生成的输出文件和准备状态文件的文件系统的位置;例如 c:\WSED\workspace\EGLgenout 。 |
prep = NO |
如果将它的值设置为 YES (缺省值),那么在成功完成生成(返回代码 <= 4)时会自动启动生成的对象的准备;源代码将被发送至构建服务器以构建运行时对象。因为我们没有与大型机连接,所以在我们的示例中指定了 NO 。(如果保留缺省值,所有的步骤都会执行,只是当尝试连接大型机时会出现一条错误消息。) |
projectID | 将包含生成的代码的 z/OS 分区数据集(partitioned data set,PDS)的高级限定符。Enterprise Developer 将使用这个限定符来定位适当的 z/OS 数据集。 |
sqlID | 在 SQL 语句的生成时验证的过程中用来连接到 DB2 系统(在 z/OS 上)的用户标识。例如 db2admin 。 |
sqlPassword | 与 sqlID 对应的密码。 |
System = MVSCICS |
生成的源代码的目标系统。当前可用的选项只有 MVSCICS (用于 z/OS)。 |
targetNLS = ENU |
用于运行时输出的目标本地语言代码。至关重要的一点是,您必须安装指定语言的 Enterprise Developer Server,尤其是在那些所用语言不是英语的国家和地区更是如此,因为显示给最终用户的各种消息都将基于这种指定的语言。例如,如果是在巴西,这个参数就应该是 PTB 。如果将它设置为 ENU (缺省值),那么最终用户所看到的消息就将是用美国英语来表示的。 |
2.2 为 COBOL 的 Java 包装程序创建构建描述符
就像我们在 第 1 部分中为 Java 服务器程序所做的那样,COBOL 服务器程序也将需要一个 Java 包装程序。Java 包装程序是一个类的集合,它充当 servlet(或 Java 程序)和由 EGL 生成的 COBOL 程序之间的接口。因为 Java 包装程序将使用不同的链接规范,所以我们需要为它创建另一个构建描述符。
wrapper-cobol
。 图 2. 用于 COBOL/CICS 的 Java 包装程序
生成的 Java 代码将被创建在 EGLWeb
项目中的 eglweb.java.cics
包中。这样就能保护为 Java 服务器程序创建的 Java 包装程序,使我们可以不必重新生成代码,而只要改变 Struts Action 类的 import 语句就可以在 Java 或 COBOL 服务器上进行测试。
3. 创建 DB2 绑定控制部件
绑定控制部件提供了一种在绑定控制文件中存储信息的方法,该文件随后指定在准备期创建的 DB2 规划中要包含哪些数据库请求模块(database request module,DBRM)。只有当您要生成在访问 DB2 的 SQL 表的 z/OS 上运行的 COBOL 程序时绑定控制部件才有意义,而我们正是要这样做。这里的绑定控制文件和您从本地 COBOL 程序访问 DB2 时要创建的绑定控制文件一样。在 EGL 的上下文中,绑定控制文件是分布式构建函数的输入,用于为执行准备生成的源代码。
要创建绑定控制部件:
coboldb2
作为名称。这样 coboldb2
部件就会被添加到 Outline 视图中,并被打开以供编辑。 图 3. DB2 绑定控制部件
4. 创建用于 COBOL/CICS 的链接部件
链接部件定义了生成的 Java 包装程序应该如何调用被调用的 EGL 程序,对本文来说就是使用 CICS。对于生成的 COBOL 程序,在生成时指定的链接选项会在运行时起作用。要创建链接部件:
linkageTE01A-cics
。 我们在示例中使用的选项如图 4 所示。
图 4. 用于 COBOL 生成的链接部件
指定选项的简要描述:
选项 | 描述 |
pgmName = TE01A |
CallLink 元素指向的程序部件的名称。 |
type = remoteCall |
指出调用使用了 EGL 中间件,它在被传送数据的尾部添加了 12 个字节,使得调用者能从被调用程序那里接收到一个返回值。可能的选项还有 localCall 和 ejbCall 。 |
conversionTable = CSOE037 |
用于转换调用的数据的转换表的名称。 CSOE037 是用于英语或葡萄牙语的表,其他语言需要使用不同的表。 |
location = eis/CICSResourceAdapter |
指定如何在运行时确定被调用程序的位置。因为我们使用 CICSJ2C 作为 remoteComType,所以它指的是 ConnectionFactory 对象的 JNDI 名称,而该对象是您在设置 J2EE 服务器时为被调用的 CICS 事务建立的。根据约定,ConnectionFactory 对象的名称以 eis/ 开头。 |
luwControl = SERVER |
指出工作单元是由 caller () 来控制,还是由被调用程序来控制。 SERVER 意味着由被调用程序启动的工作单元独立于任何由调用程序控制的工作单元。 |
parmForm = COMMDATA |
指出调用者会把数据存放在 COMMAREA 中,而不是从外部指向数据。这样就可以不用关心边界对齐而将每个参数值都移至紧接着前一个值的缓冲区。 |
remoteBind = GENERATION |
指出调用所要用到的属性是在生成时设置的。 |
remoteComType = CICSJ2C |
指定所用的通信协议。WebSphere 使用 J2C 连接器,但为了 J2EE 实现,我们必须使用 CICSJ2C 。其他可能的选项有 CICSECI 、 DIRECT 和 TCPIP 。 |
remotePgmType = EGL |
指定被调用程序是用 Enterprise Developer EGL 语言生成的 COBOL 程序。另一个选项是 NATIVE。 |
5. 生成 COBOL/CICS 服务器程序
要生成 COBOL 服务器程序:
TE01A.eglpgm
并选择 Generate EGL With => Target System and Java Wrapper Build Descriptors调用生成向导。 wrapper-cobol (EGLWeb/Java Source/TE01ABuild.eglbld)
cics-cobol (EGLWeb/Java Source/TE01ABuild.eglbld)
EGLWeb/Java Source/eglweb/java/cics
文件夹中会生成用于 COBOL/CICS 的 Java 包装程序(比如 Te01aWrapper.java
和 Te01w01.java
)。这样就能保护用于 Java 服务器的包装程序,因为别的包装程序是存储在不同的文件夹( EGLWeb/Java Source/eglweb/java
)中的。而对于测试,您将只需要改变导入的类以使它们指向正确的文件夹就可以了。 Te01aWrapper.java
。要在执行 COBOL 调用的方法调用中使用的 callOptions 变量如图 5 和图 6 所示。 Te01aWrapper.java
扩展了由 Enterprise Developer 提供的 CSOServerProgram
。 Te01w01.java
,它将在调用包装程序时被作为一个参数来使用。 图 5. Te01aWrapper 类中的 callOptions 变量
图 6. Te01aWrapper 类中的方法调用
C:\WSED\workspace\EGLgenout
目录中。在晚些时候,所有这些组件都必须被提交给 z/OS 以用于 COBOL 服务器程序的准备和编译。
图 7. 用于 COBOL/CICS 的生成的组件
6. 更新 Struts Action 类以调用 COBOL
在 eglweb.java.cics
包中生成用于 COBOL 的 Java 包装程序是为了保护 Java 服务器程序的包装程序。要使 InquiryAction 类调用 COBOL 服务器(而不是 Java 服务器),您需要做如图 8 所示的改变。
图 8. 改变 Inquiry Action Java
我们的通过 JCA 连接器来使用 CICS 的样本应用程序的简化图表如图 9 所示。
图 9. 使用 CICS 作为服务器
clearcase/" target="_blank" >cc">
CICS 事务处理网关(CICS Transaction Gateway,CTG)是一个关键的 CICS 组件,您可以在应用程序的开发和运行时过程中用它来测试 CICS 调用。CTG 提供本地协议(直接到 CICS)和网络协议(比如 TCP 和 SSL)用于和 CTG 服务器(CTG Server)进行通信,而 CTG 服务器指导对 CICS 服务器的调用。本文假设您已经接触过 CICS 事务处理网关,V4.01 或更高版本。有关 CTG 的进一步的详细信息超出了本文的范畴,但如果您想要了解更多详细信息,可以参考题为 CICS Transaction Gateway V5 - The WebSphere Connector for CICS 的 IBM 红皮书(请参阅 相关信息)。 |
运行应用程序
至此,您已经创建了所有的 COBOL 服务器代码和 Java 包装程序。现在,您必须把大型机组件提交给大型机以创建可执行文件,而且必须正确配置 WebSphere Application Server 以通过 JCA 连接器(它调用 CICS COBOL 程序)来运行应用程序。
现在,您必须执行下列任务以准备并运行应用程序:
1. 提交为大型机的准备而生成的 COBOL 程序
当您生成 COBOL 程序、Java 程序或 Java 包装程序时,EGL 都会产生一个构建规划(除非您将构建描述符中的 buildPlan 选项设置为 NO
)。Enterprise Developer 把这个生成的构建规划(在我们的示例中就是 TE01ABuildPlan.xml
)用作为运行时准备生成的输出这一步的输入。
因为我们并不期望在生成时连接到大型机,所以我们在 COBOL 生成选项中指定 prep = NO
以阻止构建规划被启动。现在,要调用构建规划,请执行下列步骤(如果您将 prep 选项设置为 YES
,下列步骤就不是必需的):
2. 配置 CICS 的 Web 应用程序
JCA 连接工厂提供了到 CICS 的连接。您必须指定资源适配器在连接到特定的 CICS 实例时所需的全部信息,同时还需指定 JNDI 查找名称,使得组件能通过它使用新的连接工厂实例。有了这个查找名称,组件就能快速地连接到 CICS。然后在运行时,工厂对象就能生成一个连接、定位 CICS 服务器并调用服务器上的 CICS 程序。
当我们定义了链接部件,就要在 CallLink 元素中指定 eis/CICSResourceAdapter
的位置值。因为这个值是一个局部 JNDI 名称,所以我们不得不将它映射为一个全局 JNDI 名称。要绑定 JNDI 名称:
/WEB-INF
Web 内容中)的 web.xml
部署描述符。 eis/CICSResourceAdapter
eis/CICSERV
图 10. JCA 的资源引用
3. 在 WebSphere Application Server 中安装 CICS ECI 资源适配器
CICS ECI(External Call Interface,外部调用接口)资源适配器可以访问服务器上的 CICS 事务。Enterprise Developer 不会在产品安装过程中自动装入 ECI 资源适配器。因此您需要为每个用户工作空间都执行一次这个活动。
要查看您的 Enterprise Developer 工作空间中是否已经安装了 CICS ECI 资源适配器(如果有必要,您需要在随后导入它):
图 11. 检查是否导入了 CICS ECI 资源适配器
cicseci.rar
。您可以在 WSED\resource_adapters
中找到 WebSphere Studio 所带的 JCA 资源适配器,其中 WSED
是安装 WebSphere Studio 的目录。 4. 为 WebSphere 测试环境创建资源适配器并配置连接工厂
应用程序组件是用连接工厂(而不是直接用资源适配器)来访问连接实例。连接的示例包括数据库连接、JCA、Java 消息服务(Java Message Service)连接和 SAP R/3 连接。连接工厂实际上是一个配置属性列表持有者。除了资源适配器供应商定义的配置属性的任意集之外,还有几个标准配置属性可以应用到连接工厂上。JCA 连接池管理器会在应用程序服务器运行时使用这些标准属性。
在 第 3 节中,我们将资源适配器装入了工作空间中。现在,我们必须要创建资源适配器并配置连接工厂,我们会在运行时执行中用到它们。这一步和访问数据库所需的数据存储配置很相似。(在第 1 部分中, 第 7.1 节中有类似步骤的执行。)
在下面的步骤中,您将把连接工厂添加到您的包含了资源适配器在连接到特定 CICS 实例时所需信息的服务器配置中。您将指定 Java 命名和目录接口(Java Naming and Directory Interface,JNDI)查找名称,使得组件能通过它使用新的连接工厂实例,从而使组件能快速地连接到 CICS。在运行时,工厂对象将使用这一信息来生成连接、定位 CICS 服务器并调用服务器上的 CICS 程序。
要创建资源适配器,打开服务器配置,选择 J2C页面,然后选择 Add,如图 12 所示。
这里,我们假设您已经定义了 WebSphere 服务器和服务器配置。要创建资源适配器,打开服务器配置,选择 J2C页面,然后选择 Add,如图 12 所示。选择 Enter关闭窗口。如果 Add 按钮不是活动的,可能是因为在步骤 3 中没有正确地装入 RAR 文件。
图 12. 安装 CICS ECI 资源适配器
4.1 定义 JCA 用法的安全性
WebSphere Application Server V5 完全支持 Java 认证和授权服务(Java Authentication and Authorization Service,JAAS)体系结构并扩展了访问控制体系结构以支持 J2EE 资源的基于角色的授权。安全性是可选的。要使用 JAAS 认证来约束对事务的访问,您需要把 JAAS 认证条目添加到服务器配置中:
图 13. 定义 JCA 的认证
4.2 创建 JCA 连接工厂
现在,我们必须配置 JCA 的连接工厂:
CICSERV
(CICS 服务器名称) eis/CICSERV
(它和 Web 应用程序相匹配) 图 14. 连接工厂定义
4.3 定义连接工厂的属性
使用 Resource Properties 窗口,通过将配置对话框中每个属性的值改为如下所示的值来定义连接工厂的各属性(如图 15):
CICSERV
(CICS 服务器的名称) tcp://carmv1.raleigh.ibm.com
(z/OS 机器,在构建描述符的 destHost 中也有定义) 22002
(CICS 事务网关的端口) TE01
(运行 DB2 规划的 CICS 事务的名称) 图 15. 连接工厂属性
5. 测试 COBOL/CICS 事务
在测试之前,您必须完成下列与环境有关的任务,其中大部分是任何运行 CICS 事务的 z/OS 环境的典型任务:
在您设置完环境后,就可以进行测试了:
您可能遇到的异常错误将涉及到一些 CICS 配置元素。错误消息将提供给您一些信息,但为了能更好地理解,您可能需要查看存储在 z/OS 中的 CICS 日志消息。例如,如果机器无法访问指定的 z/OS IP 地址,您会接收到一条如下所示的消息:
不要感到沮丧,因为像这样的错误一般是由 CTG 或 CICS 配置问题所引起的,所以您不需要对生成的服务器程序组件做任何编码上的改变。
结束语
祝贺您!您没有编写一行 Java 或 COBOL 代码,就实现了一个使用了 STRUTS 的应用程序,并用 JCA Connector 完成了它与 CICS 的连接。您完全可以把这个非常简单的应用程序扩展为一个相当高级的、复杂的应用程序,但它们的编码、测试和调试的过程却是十分相似的。
当开发人员在 EGL 中进行编码时,他们并不需要应付所有的细节问题,因为 EGL 会生成所有的连接器以使用必需的 Java 类,而这些 Java 类会在生成时可用。EGL 为程序员提供了一种简单的方式,使得他们即使不具备实现 J2EE 通常所必需的所有技能,也能够进入复杂的 J2EE 世界。