一、 引言 在企业级生产环境中,往往存在着各种异构的应用系统和数据库。如果我们要利用这些系统的数据或功能,而它们又没有提供对外的接口,或者利用原有接口开发的难度很大,如何解决这一难题?IBM提供了各种WebSphere Business Integration Adapter,我们可以通过配置这些Adapter直接连接后台系统。 主要有两种Adapter:Application Adapters和Technology Adapters,前者包括SAP、Sibel和IBM MQ等针对应用系统的适配器,后者则是对标准技术接口的,包括连接数据库的JDBC、与邮件系统交互的Mail、处理文本文件的JText和通过XML/HTTP接口交互的XML适配器。本文中,我们将以JDBC Adapter为例,动态提取原有数据库系统的信息,实现数据同步。其他 Adapter 的使用方法与之类似。 二、拓扑结构 假设生产环境中有人力资源系统向数据库中录入新员工数据,而我们的J2EE应用程序需要同步地获取这些信息,应用Adapter作为中介器的拓扑结构如下所示:

如上图所示,右边的人力资源系统向数据库中不断传输数据,而JDBC Adapter监听数据库的变化,将新增数据传递给WebSphere MQ 的消息队列。WebSphere中的J2EE应用程序通过侦听队列的Message-Driven Bean获取消息数据,并调用Session Bean中的业务逻辑来实现信息同步。 除了应用系统和数据库,实现这种解决方案的产品包括: IBM WBI Adapter Framework v2.4:是各种Adapter的容器和运行时环境。
IBM JDBC Adapter: 与数据库连接的Adapter,在WBI Adapter Framework的基础上安装和运行。
IBM WBI Server Foundation v5.1:J2EE应用系统的运行环境。
IBM MQ v5.3:在WebSphere和数据库之间进行可靠数据传输的中间件。
IBM WSAD IE v5.2:配置连接操作的工具环境。 三、配置Adapter和数据库协同工作 首先安装DB2和WSADIE。注意WSADIE的安装路径中不要出现空格。安装WBI Adapter Framework v2.4,它是Adapter的运行环境。然后在同一台机器上安装JDBC Adapter。按照安装向导的提示操作即可,这里不再赘述。 需要注意的是,在安装Adapter Framework时,开发环境要选择现有的WSADIE,而不是Framework自带的系统管理器。 IBM JDBC Adapter支持DB2、Oracle和MS SQL Server等主要数据库产品。这里我们采用DB2数据库作为示范。首先在数据库中新建一个名为AISWBI的database,以db2admin用户的身份建立一张名为TEACHER的表,它的DDL描述如下所示:
CREATE TABLE DB2ADMIN.TEACHER ( ID INTEGER NOT NULL ,
NAME VARCHAR(10) NOT NULL , AGE INTEGER NOT NULL );
ALTER TABLE DB2ADMIN.TEACHER ADD CONSTRAINT CC1078998262226 PRIMARY KEY(ID);
|
在相同的database中添加JDBC Adapter监听的两张专用表xworlds_events和xworlds_archive_events,它们的DDL描述如下所示(schema也是db2admin):
CREATE TABLE DB2ADMIN.xworlds_events (
event_id INTEGER NOT NULL PRIMARY KEY GENERATED BY
DEFAULT AS IDENTITY (START WITH 0 , INCREMENT BY 1 , NO CACHE ),
connector_id VARCHAR(40),
object_key VARCHAR(80) NOT NULL,
object_name VARCHAR(40) NOT NULL,
object_verb VARCHAR(40) NOT NULL,
event_priority INTEGER NOT NULL,
event_time TIMESTAMP,
event_status INTEGER NOT NULL,
event_comment VARCHAR(100))@
CREATE TABLE DB2ADMIN.xworlds_archive_events (
event_id INTEGER NOT NULL PRIMARY KEY,
connector_id VARCHAR(40),
object_key VARCHAR(80) NOT NULL,
object_name VARCHAR(40) NOT NULL,
object_verb VARCHAR(40) NOT NULL,
event_priority INTEGER NOT NULL,
event_time TIMESTAMP,
archive_time TIMESTAMP,
event_status INTEGER NOT NULL,
event_comment VARCHAR(100))@
|
假设人力资源系统会在表TEACHER中存入新员工的数据。我们希望在数据录入的同时将它同步到新的应用系统中,就需要利用数据库的触发器功能,把新增条目的信息传递给JDBC Adapter监听的专用表xworlds_events。在同一个database中建立这个触发器,其DDL如下所示:
create trigger NotifyMyDemoAdd after insert on db2admin.TEACHER referencing new as n
for each row mode db2sql insert into db2admin.xworlds_events
(object_key,object_name,object_verb,event_priority,
event_time,event_status,event_comment) values
(CAST( CAST(n.ID AS CHAR(2)) AS VARCHAR(80)) , 'TEACHER',
'Create', 1, current timestamp, 0, 'Insert a new record')@
|
Adapter将新增条目传递出去之后,会把条目信息转移到表xworlds_archive_events中,作为归档信息。 Adapter是通过Agent连接和监听数据库的,因此需要配置启动Agent的批处理文件,提供数据库JDBC驱动所在的位置。定位到JDBC Adapter安装路径下的connectors\JDBC目录,编辑start_JDBC.bat文件,添加如下声明:
SET JDBCDRIVERPATH=%Product_DIR%\java\db2java.zip
|
其中%Product_DIR%为DB2的安装路径。
定位到含有"-Djava.library.path="的段落,在最后添加";%Product_DIR%\lib",如下所示,假设DB2安装路径为D:\SQLLIB。
-Djava.library.path="%CROSSWORLDS%"\bin;%CONNDIR%;"%MQ_LIB%";
%JRE_EXT_DIRS%;D:\SQLLIB\BIN
|
JDBC Adapter在映射数据库对象时也要连接数据库,这是通过Object Design Agent代理进行连接的,因此需要配置启动Agent的批处理文件。 定位到JDBC Adapter安装路径下的ODA\JDBC目录,编辑start_JDBCODA.bat文件,在"set DRIVERPATH="这一行的末尾添加";%Product_DIR%\java\db2java.zip"。 再添加如下声明:
set DRIVERLIB=%Product_DIR%\bin
|
四、配置Adapter和MQ协同工作 首先安装MQ v5.3。要使Adapter和MQ协同工作,需要在MQ中定义Adapter用到的队列和队列管理器。首先定位到JDBC Adapter安装路径下的templates目录,创建一个文本文件WBIA_queues.txt,列出所有的队列定义,其中"JDBCCONNECTOR"变量是我们定义的连接器名称。文件内容如下:
DEFINE QLOCAL(JDBCCONNECTOR/AdminInQueue)
DEFINE QLOCAL(JDBCCONNECTOR/AdminOutQueue)
DEFINE QLOCAL(JDBCCONNECTOR/DeliveryQueue)
DEFINE QLOCAL(JDBCCONNECTOR/RequestQueue)
DEFINE QLOCAL(JDBCCONNECTOR/ResponseQueue)
DEFINE QLOCAL(JDBCCONNECTOR/FaultQueue)
DEFINE QLOCAL(JDBCCONNECTOR/SynchronousRequestQueue)
DEFINE QLOCAL(JDBCCONNECTOR/SynchronousResponseQueue)
|
在DOS下定位到该目录,输入命令:
configure_mq QM_WBIA WBIA_queues.txt
|
其中QM_WBIA为队列管理器的名称。 打开MQ的资源管理器,右击队列管理器QM_WBIA,选择"启动",启动该管理器下的所有队列。展开"队列"节点,可以看到启动的队列,如下所示:

五、配置WBI Server Foundation 测试环境 接下来,在WSADIE中配置测试环境,步骤如下: 1)定位到JDBC Adapter安装路径下的bin目录,编辑startcsm.bat文件,更改两个变量定义:
set WSWB_EXECUTABLE=%WSADIE%\wsappdevie.exe
set WSWB_PATH=%WSADIE%
|
其中%WSADIE%变量为WSAD安装目录。再更改下面一行:
"%WSWB_EXECUTABLE%" -data "%workspace%" -vm %JRE_BIN%\javaw.exe
-vmargs %ORB_PROPERTY% -DCWTools.home="%CROSSWORLDS%\bin"
|
其中%workspace%为WSAD工作区的路径,注意其中不要出现空格。 2)更改完毕,双击该批处理文件启动WSADIE。 3)切换到服务器视图,右击服务器透视图,选择"创建服务器和服务器配置",选择服务器类型为"集成测试环境",输入服务器名称为"WASEServer",单击"完成"创建测试服务器。 4)双击服务器WASEServer,打开服务器管理工具。切换到变量页面,在"节点设置"目录下选择"MQ_INSTALL_ROOT"变量,单击"编辑"按钮,输入MQ的安装路径。 5)切换到EJB页面,单击"添加"按钮,输入以下内容:

按确定返回。 6)切换到配置页面,选中"启动管理控制台",保存并启动测试服务器。在网络浏览器中打开WebSphere管理控制台,网址是http://localhost:9090/admin。 7)展开"资源"节点,点击"WebSphere MQ JMS 提供程序",在右边的"WebSphere MQ JMS Provider"页面中点击"WebSphere MQ 队列连接工厂",在新页面中点击"新建"按钮。 8)依次输入队列工厂的各项参数,并保存修改:

9)在"WebSphere MQ JMS 提供程序"页面中选择"WebSphere MQ 队列目的地",单击"新建"按钮,依次建立如下的队列:

以下属性所有队列均相同,其他属性均取缺省值。

六、配置和运行WebSphere应用 1、创建服务项目 将WSADIE切换到业务集成透视图,新建一个服务项目,命名为MyDemoAdapter,在其下创建一个名为mydemo的package。 2、创建企业应用程序和EJB项目 1)从菜单中选择"文件"/"新建"/"项目",在弹出对话框中从"J2EE"选项中选择"企业应用程序",单击"下一步"按钮。 2)选择J2EE 1.3版本并单击下一步。 3)在企业应用程序页面中进行如下选择:

4)单击"完成"按钮。 3、创建业务对象和连接器 1)将WSADIE切换到系统管理器透视图,右击"集成组件库",选择"新建集成组件库",在弹出对话框中输入"MyDemoAdapterDef",创建组件库项目。 2)右击组件库项目下的"业务对象",选择"新建业务对象",启动业务对象设计器。 3)在Windows的开始项中选择"程序"/"IBM WebSphere Business Integration Adapters"/"适配器"/"Object Discovery Agent"/"JDBC Object Discovery Agent",启动ODA。 4)在"新建业务对象"对话框中选择"取消"按钮,在菜单中选择"文件"/"使用ODA新建",在弹出对话框中选择"查找代理程序",选中找到的代理,单击下一步,如下图所示:

5)在对话框中输入以下值:

如下图所示,单击下一步。

6)展开schema,选中表TEACHER,单击下一步,如下图所示。

7)在确认窗口中选择下一步,在"BO属性"窗口中更改"添加存储过程属性"值为"No",单击下一步。 8)单击"完成"按钮,在项目中生成名为"TEACHER"的业务对象,如下图所示:

9)保存并退出。 10)在集成组件库项目中选中"连接器",右击选择"创建新的连接器",在弹出的"连接配置器"窗口中单击"取消"按钮。 11)从菜单中选择"文件"/"打开"/"从文件",在"打开文件浏览器"窗口中打开Adapter安装路径下的repository\JDBC目录,再把文件类型改为"所有文件",双击打开CN_JDBC.txt。 12)从菜单中选择"文件"/"另存为"/"至项目",单击"保存"按钮,将连接器保存到MyDemoAdapterDef项目。关闭连接配置器,再双击连接器项目下的JDBCConnector节点打开配置器。 13)在标准属性页面输入:

其中%Workspace%为工作区的路径。 14)单击"保存"按钮,关闭连接配置器,再双击连接器项目下的JDBCConnector节点打开配置器。 15)切换到"特定于连接器的属性"页面,输入:

其中ApplicationPassword和ApplicationUserName分别是连接数据库的密码和用户名。 16)关闭连接配置器,再双击连接器项目下的JDBCConnector节点打开配置器。切换到"受支持的业务对象"选项卡,选择TEACHER对象。 17)保存修改。在菜单中选择"文件"/"保存"/"至文件",保存到C:\JDBCConnector文件。关闭配置器。 4、将JDBC Adapter配置导至服务项目 1)在WSADIE的系统管理器视图中,选中"用户项目",右击选择"新建用户项目",输入"MyDemoAdapterUserProject",从可用的集成组件库中选择"WBIAdapterDef",单击"完成"按钮,如下所示:

2)右击MyDemoAdapterUserProject项目,选择"部署WAS项目",在弹出窗口中选中JDBCConnector及其子节点,单击下一步,选中"导出至服务项目",如下所示。

3)单击"浏览"按钮,在弹出窗口中选中MyDemoAdapter项目中的mydemo目录,单击"确定"按钮。在"部署向导"页面单击"完成"按钮。 4)切换到业务集成透视图,选择"服务项目"/"MyDemoAdapter"/"mydemo",右击选择"刷新"按钮,显示如下文件:

其中TEACHER.xsd是数据库TEACHER表对应的业务对象模型,而三个wsdl文件是连接器的Service描述。 5、部署JDBC Adapter的侦听服务 1)选中MyDemoAdapter项目\mydemo目录下的JDBCConnector.wsdl文件,右击选中"新建"/"构建自服务",从"创建服务框架"中选择"EJB服务框架",单击下一步。 2)在"新建"页面直接单击下一步,在创建服务框架页面选择端口类型为"TEACHERAgentDelivery",单击下一步。 3)在"EJB框架"页面选择EJB项目为"MyDemoAdapterEJB",单击"完成"按钮。 4)从mydemo目录下选择新建的TEACHERAgentDeliveryEJBService.wsdl文件,右击选择"企业服务"/"生成部署代码",在弹出窗口中输入:

如下所示,单击下一步:

5)在"入站服务文件"中浏览选择MyDemoAdapter项目中mydemo目录下的JDBCConnectorJMSService.wsdl文件,并在端口名中选择TEACHERAgentDeliveryBindingPort,单击"完成"按钮。如下图所示:

6)在弹出的"修复服务器配置"窗口中点击"确定"按钮。 7)切换到"J2EE层次结构",展开"EJB模块"/"MyDemoAdapterEJB"项目,打开"EJB部署描述符"窗口,选择"Bean"选项卡,选择"TEACHERServiceMDB",将ListenerPort改为AIS_CUSTOMERAgentDeliveryBindingPort。 8)切换到引用选项卡,展开TEACHERServiceMDB,选择"ResourceEnvRef",把JNDI名称设为wbia/ibm/com/JDBCJDBCCONNECTOR/DELIVERYQUEUE。选择"ResourceRef",把JNDI名称设为wbia/ibm/com/JDBCQCF。保存修改。 9)选中MyDemoAdapterEJB项目,右击选择"生成"/"部署和RMIC代码",部署EJB。 10)展开MyDemoAdapterEJB项目中的TEACHERAgentDelivery,定位到TEACHERAgentDeliveryBean类中的TEACHERCreate方法,在user code注释中添加如下代码:
System.err.println("\n*** We have a new customer! ***\n");
System.err.println("Customer Number: " + argBodyPart.getID());
System.err.println(
"Name: " + argBodyPart.getNAME() );
System.err.println("Age: " + argBodyPart.getAGE());
|
这段代码是用于在应用系统接收到同步的数据时显示数据内容。保存修改。 6、运行数据同步应用 1)在DOS下输入%Adapter%\connectors\JDBC\start_JDBC.bat JDBC WAS -cC:\JDBCConnector.cfg,其中%Adapter%为Adapter Framework的安装路径,启动JDBC连接器。如下所示:

2)启动WBI Server Foundation 测试服务器。 3)向数据库中的表TEACHER插入一条数据,如执行下面的SQL语句:
connect to AISWBI@
insert into DB2ADMIN.TEACHER values(18,'li zhi',23)@
connect reset@
|
4)连接器窗口显示如下内容,表明侦听到并传输数据内容。

5)切换到WebSphere服务器控制台,显示如下信息,表明应用已经接收并打印到同步过来的数据信息。之后,我们就可以随意定制这些信息了。 七、总结 IBM WBI Adapter for JDBC提供了可靠地同步数据库信息的解决方案。通过与WebSphere Application Server 连接,用户可以把这种能力扩展到J2EE应用平台之上。同时,IBM还提供了与邮件系统交互、处理文本文件和通过XML/HTTP接口同步,以及连接SAP、Sibel等应用系统的Adapter,它们都可以通过本文的方法与WBI Server Foundation连接,实现以J2EE平台为核心的EAI。这也是IBM WBI的发展方向。 |