简介
Informix 4GL (I4GL) 是一种快速开发工具,提供用于创建 Informix 数据库应用程序的简便语言支持。从 I4GL v7.50 开始,可以作为 Web 服务发布现有的 I4GL 代码,这样就可以从客户机应用程序访问自己的 I4GL 应用程序。
本文是两篇解释如何使用 I4GL v7.50 Web 发布和预订特性的 developerWorks 文章的第二篇。第一篇 “以 Web 服务的形式部署 4GL 函数”(developerWorks,2009 年 2 月)解释了如何把 I4GL 函数部署为 Web 服务,讨论了面向服务体系结构 (SOA) 以及在 SOA 环境中使用 I4GL 的方法。本文在此基础上解释如何使用 I4GL 预订器预订 Web 服务。
I4GL 作为 SOA 环境中的服务消费者
面向服务体系结构 (SOA) 是一种体系结构风格,它让不同的应用程序可以相互交换数据。它的目标是实现服务与底层应用程序使用的操作系统、编程语言和其他技术的松散耦合。
在 I4GL 上实现 SOA 有助于尽可能利用组织内外大量现有应用程序中的业务逻辑。I4GL v7.50.xC2(于 2008 年 12 月发布)允许用户以 Web 服务的形式发布用 I4GL 编写的现有业务逻辑;这样,任何编程语言或应用程序都可以消费这些 Web 服务。v7.50.xC3(于 2009 年 5 月发布)进一步改进了这个 SOA 特性,支持使用 I4GL 消费 Web 服务。
在 v7.50 之前,I4GL 开发人员在集成用 I4GL 和其他现代编程语言编写的业务逻辑和应用程序时面对许多困难。另外,一些组织试图在用多种语言编写的代码之间实现互操作,从而提高灵活性,但是他们只能用更新的技术重写 I4GL 代码。
I4GL-SOA 预订器体系结构依赖于一个用户界面(即 W4GL)。用户从 Web 服务定义文件获得 Web 服务的信息,然后在 W4GL 界面中提供详细信息。W4GL 界面生成一个配置文件并把所有这些信息存储在其中。W4GL 界面把配置文件作为输入提供给后端脚本(即 W4GLC)。W4GLC 工具生成预订 Web 服务的中间客户机代码。
前提条件
要想使用 Informix I4GL 消费 Web 服务,必须使用以下平台之一:
HP-IA 11.23 / 11.31(32/64 位)
Red Hat Enterprise Linux® 4 或 5
Solaris 5.9 / 5.10(32/64 位)
SUSE Linux Enterprise Server 10
系统上还必须有以下软件:
Apache Axis2/C, Version 1.5(及 Informix 4GL C Compiler 实现)
Apache Axis2/Java™, Version 1.3.1(及 Informix 4GL C Compiler 实现)
IBM Informix Dynamic Server, Versions 10.00、11.10 或 11.50
Informix 4GL 7.50.xC3
Java Runtime Environment (JRE) 1.5 或更高版本
Perl 5.8.8 或更高版本
设置环境
表 1 说明必须设置的环境变量:
表 1. 设置环境变量
环境变量 | 设置为 |
AXIS2C_HOME | Axis2C 安装目录。 |
INFORMIXDIR | 安装 I4GL 产品的位置。 |
PROGRAM_DESIGN_DBS | 存储通过 w4gl 工具输入的 Web 服务定义的数据库(可选)。 如果用户没有指定 PROGRAM_DESIGN_DBS,就使用 syspgm4gl 作为默认的数据库名。如果指定了 PROGRAM_DESIGN_DBS,就在启动 w4gl 工具时创建相关的表和模式。 |
INFORMIXSERVER | PROGRAM_DESIGN_DBS 数据库所在的 Informix 服务器。 |
INFORMIXSQLHOSTS | sqlhosts 文件的位置。 |
LD_LIBRARY_PATH | 共享库的路径。 |
PATH | 包含可执行文件位置的路径。这个路径必须包含 $JAVA_HOME/bin。 |
JAVA_HOME | JRE 1.5 或更高版本的安装位置。 |
DBPATH | w4gl 工具使用的已编译表单文件的路径。它必须设置为 $INFORMIXDIR/etc。 |
AXIS_JAR_DIR | AXIS 服务器使用的 .jar 文件的位置。要想启用 I4GL SOA 功能,必须有这些 jar 文件。 |
CLASSPATH | I4GL SOA 功能所需的 jar 文件的绝对路径和名称。 |
DB_LOCALE | 包含 Web 服务信息的数据库的位置。 |
CLIENT_LOCALE | I4GL 客户机的位置(可选)。 |
TERMCAP | $INFORMIXDIR/etc/termcap 路径(可选)。 |
配置文件
配置文件包含由 W4GL 工具生成的 Web 服务定义信息。清单 1 中的配置文件示例基于图 3 到图 5 所示的选项:
清单 1. w4gl 配置文件示例
[SERVICE]
TYPE = subscriber
I4GLVERSION = 7.50.xC3
TARGET_DIR = /tmp/zipcodedemo
I4GL_FUNCTION = cons_ws_zipcode
TARGET_FILE = cons_ws_zipcode.c
[WSDL_INFO]
WSDL_PATH = /tmp/zipcodedemo
WSDL_FILE = zipcode_details.wsdl
WSDL_NAME_SPACE= http://www.ibm.com/zipcode_details
[FUNCTION]
SERVICENAME = ws_zipcode
NAME = zipcode_details
[INPUT]
[VARIABLE]NAME = pin TYPE = CHAR(10)[END-VARIABLE]
[END-INPUT]
[OUTPUT]
[VARIABLE]NAME = city TYPE = CHAR(100)[END-VARIABLE]
[VARIABLE]NAME = state TYPE = CHAR(100)[END-VARIABLE]
[END-OUTPUT]
[END-FUNCTION]
[END-WSDL_INFO]
[END-SERVICE]
表 2. w4gl 配置文件关键字说明
关键字名称 | 说明 |
[SERVICE] ….. [END-SERVICE] |
这个块包含消费 Web 服务所需的参数集。 |
TYPE | 服务操作,publisher 或 subscriber。 |
TARGET_DIR | 生成的源代码和对象文件的目标目录。 |
I4GL_FUNCTION | 用户定义的惟一的函数名,函数包含为消费 Web 服务自动生成的代码。I4GL 开发人员在 I4GL 程序中通过引用这个函数来消费指定的 Web 服务。 |
TARGET_FILE | 用户定义的文件名,文件中存储通过工具生成的预订器客户机代码。 |
[WSDL_INFO] …. [END-WSDL_INFO] |
这个块包含从要消费的 Web 服务的 WSDL 文件获得的参数。 |
WSDL_PATH | 下载的 WSDL 文件的目录位置。 |
WSDL_FILE | 包含 Web 服务信息的 WSDL 文件。 |
WSDL_NAME_SPACE | 一个统一资源标识符 (URI),它提供的惟一名称用于关联 XML 模式中的元素、属性和类型定义,或者关联 XQuery 表达式中的元素、属性、类型、函数和错误的名称。 |
[FUNCTION] …. [END-FUNCTION] |
这个块包含要消费的函数的信息。 |
SERVICENAME | 要消费的服务的名称。 |
NAME | 要消费的函数(WSDL 中的操作)的名称。 |
[INPUT] …. …. [END-INPUT] |
Web 服务函数的输入参数列表。 |
[OUPUT] …. [END_OUTPUT] |
Web 服务函数的输出参数列表。 |
[VARIABLE] …. [END_VARIABLE] |
这个块包含 Web 服务函数的输入和输出参数的变量名和对应的数据类型。 |
NAME | 在服务定义中指定的标识输入和输出变量名的关键字。 |
TYPE | 在服务定义中指定的标识输入和输出数据类型的关键字。 |
工具
可以使用 w4glc 或 w4gl 工具自动生成通过 I4GL 程序消费 Web 服务所需的代码。
w4glc 工具
这个命令行工具用于生成连接 Web 服务所需的代码。w4glc 工具需要一个配置文件作为输入。有经验的 I4GL 开发人员熟悉配置文件的语法,他们可以使用 w4glc 工具更快地生成代码。
清单 2. w4glc 语法
w4glc { [-silent] [-generate] [-compile] } <configuration_file>
silent 抑制编译器生成的所有消息。
generate 生成客户机源代码。
compile 编译生成的源代码并创建对象文件。
W4GL 工具
正如 “以 Web 服务的形式部署 4GL 函数” 中指出的,W4GL 工具在程序设计数据库中管理数据。它还提供 Web 服务打包功能,这样就可以把服务转移到配置和平台相同的其他机器上。在数据库中存储数据之后,可以针对不同的平台使用 W4GL 生成相同的服务。
W4GL 工具还提供可以生成配置文件和生成预订 Web 服务所需的中间 C 语言代码的界面。
W4GL 工具的预订器选项菜单见图 2:
使用 W4GL 工具有以下优点:
它负责 Web 服务消费的全过程,这包括自动生成配置文件和对应的 C 语言消费者代码。
通过这个工具指定的 WSDL 定义保存在数据库表中,以后可以重用和修改,这会减少开发工作量。
这个工具使用大家熟悉的基于 I4GL 特点的界面分四步完成消费任务:
添加 Web 服务。
生成配置文件和中间消费者 C 代码。
通过调用自动生成的代码中的函数预订 Web 服务。
通过编译源代码创建并运行一个可执行文件。
添加 Web 服务
要想预订 Web 服务,首先必须通过选择 Subscribe > Add 添加 Web 服务定义。
图 3 是添加 ws_zipcode Web 服务时的 Add 屏幕:
Subscription ID 字段是由 w4gl 工具生成的惟一标识号,用来跟踪 Web 服务定义。
在 表 2 中可以找到对其他字段的说明。
图 4 是 ws_zipcode Web 服务的输入和输出参数的 Variable 屏幕:
生成配置文件和预订器客户机代码
分两步编译 Web 服务信息。在第一步中,w4gl 工具创建 w4glc 工具使用的配置文件。在第二步中,w4gl 工具在用户指定的目标目录中创建中间 C 语言代码并生成对象文件。
图 5 是用于生成配置文件的 Subscribe 屏幕:
图 6 是用于生成客户机代码的 Subscribe 屏幕:
使用 I4GL 程序调用 Web 服务
把 zipcode_details 函数部署为 Web 服务 “ws_zipcode”:
清单 3. 部署为 Web 服务的 I4GL 代码示例 (soademo.4gl)
FUNCTION zipcode_details(pin)
DEFINE recdtls RECORD
pin CHAR(10),
city CHAR(100),
state CHAR(100)
END RECORD,
pin CHAR(10),
sel_stmt CHAR(512);
LET sel_stmt= "SELECT * FROM statedetails WHERE pin = ?";
PREPARE st_id FROM sel_stmt;
DECLARE cur_id CURSOR FOR st_id;
OPEN cur_id USING pin;
FETCH cur_id INTO recdtls.*;
CLOSE cur_id;
FREE cur_id;
FREE st_id;
RETURN recdtls.city, recdtls.state
END FUNCTION
客户机可执行文件调用这个 Web 服务:
清单 4. 消费 4GL Web 服务的 I4GL 代码示例 (clssoademo.4gl)
MAIN
define retVal int;
let retVal = func_cons_ws_zipcode();
END MAIN
FUNCTION func_cons_ws_zipcode()
DEFINE recdtls RECORD
pin CHAR(10),
city CHAR(100),
state CHAR(100)
END RECORD;
call cons_ws_zipcode("97006") returning recdtls.city, recdtls.state
DISPLAY "SUPPLIED ZIP CODE: 97006 n"
DISPLAY "RESPONSE FROM WEB SERVICE n"
DISPLAY " ------------------------- n"
DISPLAY " CITY:",state_rec.city
DISPLAY "n STATE:",state_rec.state
return 1
END FUNCTION
通过编译源代码创建并运行一个可执行文件
AXIS2/C 接收请求并调用 Web 服务 ws_zipcode,然后这个服务调用 4GL 函数 zipcode_details 并与 IDS 服务器通信,获得与邮政编码对应的城市名和州名。
清单 5. 语法
c4gl clsoademo.4gl cons_ws_zipcode.o -o zipcode_client -
I${AXIS2C_HOME}/include/axis2-1.5.0 -L${AXIS2C_HOME}/lib -laxis2_engine -
laxutil -laxis2_axiom
运行可执行文件 (zipcode_client)。返回值传输回客户机可执行文件。
清单 6. 语法
./zipcode_client
SUPPLIED ZIP CODE: 97006
RESPONSE FROM WEB SERVICE
-------------------------
CITY:Beaverton
STATE:OR
结束语
通过让 I4GL 成为服务消费者,可以重用用 I4GL 或其他编程语言编写的现有的 Web 服务和业务逻辑。这样就可以使用 I4GL 以多种方式与任何编程语言通信,同时仍然享有 I4GL 编程的便捷性。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞0
添加新评论0 条评论