级别: 初级 薛 江波, IBM 中国软件开发中心高级软件工程师 徐 苏, IBM中国开发中心软件工程师
2006 年 2 月 16 日 本文将详细介绍IBM WebSphere Integration Developer(WID)中的映射功能,首先将介绍映射的种类及其含义,适用范围。然后,将进一步结合具体实例来说明各种映射的使用方法,常见错误。本文适合对WID已有了解,想要更进一步,系统、详细地了解WID里的映射功能的用户。
1. 引言
本文将详细介绍IBM WebSphere Process Server (WPS)中的映射功能,以及如何使用WebSphere Integration Developer(WID)来开发各种映射,并结合具体实例来介绍映射的各种功能,开发调试技巧以及常见错误。
关于WPS和WID的介绍,请见《如何用WID和WPS开发EAI解决方案》。
2. 映射的概念和作用
在一个集成的环境下,由于各个被集成的系统是分散开发的,他们的数据定义和接口定义是由不同的人,在不同的时间完成。所以不可避免的,会出现数据异构的问题:(属性)同名不同义;(属性)同义不同名;含义相近,但结构不同;以及, 内容相同,意义不同;意义相同,内容却不同。比如:描述一个用户的数据对象在SAP系统里包含Id, firstName, lastName, address,city和 gender等属性,而在集成系统里用户业务对象属性则包含:customerID, name, country, state, street, zipCode, discount 和 gender等。对业务对象的操作,在SAP系统中有查找、更新和删除等操作;而在集成系统里则可以建立新用户,更新用户资料和删除用户。我们怎样把两个不同系统的数据和操作连接起来?这将在本文以下的内容中详细介绍。
异构情况从大类上分,可分为在属性值/数据对象(Attributes, data object)的异构和施加在数据对象上的操作(Operation) 的异构。在WID里,可以使用映射(Mapping)解决不同信息系统内容中的这两方面问题。WID中的映射主要分为数据映射(Data Mapping)、关系映射(Relationship Mapping)和接口映射 (Interface Mapping)。
数据映射
数据映射是描述两个业务对象的各个属性之间对应关系的WID组件。它是面向业务对象的。它把数据按照集成开发人员的定义从源对象映射到目标对象。 集成开发人员通过在开发工具WID里定义不同的转换规则(Data Transformation Rule)来定义源对象和目标对象属性间的关系。它负责定义比如SAP客户业务对象和集成系统里的业务对象的映射关系。
关系映射
当源业务对象与目标业务对象的属性有语意上的异构的时候,需要用关系映射来描述这种关系。比如在SAP系统里,用户所在的城市可能使用"BJ"来表示北京, 而在集成系统中可能使用"010"来表示北京。在语意上,"BJ"和"010"的关联必须用一个关系映射定义出来。关系映射将被数据映射调用。集成开发人员通过开发工具WID首先定义一个源对象与目标对象的关系映射,之后,还需要定义一个数据映射来调用这个关系映射。WID里提供关系映射的独立可视化编辑器。
接口映射
接口映射描述的是两个接口之间各个方法及其参数之间的对应关系的WID组件。它是面向接口的,并且是单向的。只能从一个接口映射到另一个接口。在一个接口映射里,只能定义两个接口间的关系。目标接口方法的所有输入参数必须与源接口方法的输入参数相映射,源接口方法的所有输出必须被映射到目标接口方法的输出。例如它定义了对用户数据进行的操作之间的映射。
3. 数据映射的使用
3.1. 数据映射定义
数据映射是描述两个业务对象的各个属性之间对应关系的WID组件。它是面向业务对象的。它把数据按照集成开发人员的定义从源对象映射到目标对象。 集成开发人员通过在开发工具WID里定义不同的转换规则(Data Transformation Rule)来定义源对象和目标对象属性间的关系。
WID的默认情况是,没有定义转换规则的目标业务对象将不会被赋任何值。所以,所有需要传递的变量,都必须定义数据转换规则。数据映射规则的定义在WID里是通过可视化的映射编辑器来完成的。创建数据映射转换规则的时候要指定源业务对象和目标业务对象, 但一个数据映射定义,可以包含多对源业务对象和目标业务对象。这样做得好处可能是可以减少一个项目里总共的数据映射数目。但要注意的是,多对多的业务对象映射中,源业务对象之间,目标业务对象之间不可有相同的业务对象类型。
在定义数据映射的时候,最重要的是定义数据映射转换规则。它具体描述了源业务对象的属性,如何被转化为目标业务对象的属性。下面我们就来具体了解一下数据转换规则。
3.2. 数据映射转换规则和使用
在WID里,一共有九种数据转换规则, 他们都是从源业务对象的属性到目标业务对象的属性的转换方法定义。为了更好的说明各种转换规则的概念和用法,我们将抽象的概念和一个具体的业务需求在WID中的实现联系起来进行阐述。
注:对于WID的基本用法,请参考《如何用WID和WPS开发EAI解决方案》
一个旅游代理商需要将自身的业务受理系统通过适配器和基于SAP的第三方子系统集成起来。在SAP系统中,用户业务对象的属性有:Id, firstName, lastName, address 和 gender. 在业务受理系统里,用户业务对象属性有:customerID, name, country, state, street, zipCode, discount 和 gender。
决定转换规则的前提是对两个系统中数据定义的了解,我们在这里作如下假定:
在SAP 系统中,每个用户有自己的Id, 这个Id是系统内部使用的。在业务受理系统中,用户将被赋予新的ID以加以区分。
业务受理系统的用户名被记录在name属性里,顺序格式为:Last name, First name。
在SAP 系统中, 地址被以'/'分隔,内容包括:Street/Building/City/PostCode/Country。
业务受理系统中,每个用户将被给予一个折扣值,它是一个固定的数值。
一个订单的属性在SAP系统里包括:Id, customer,在业务受理系统中包括:OrderID, customer, status。
3.2.1. 移动 (Move):
移动的含义就是数据的属性内容不需要做任何改变,将由源业务对象赋予目标业务对象。它的作用是让集成开发人员定义哪些属性需要从源业务对象复制到目标业务对象,但不需要修改。属性名可以相同或者不同。两边的属性类型,必须是相同的或可以兼容的。如果源业务对象的属性是列表,这个列表将被完全的复制到目标业务对象的相应属性。
在代理商的需求中,我们可以直接将性别内容直接移动(复制)到相应业务对象中如图1所示:
图1 移动规则
3.2.2. 组合(Join):
这种转换将源业务对象的几个属性组合成一个目标业务对象的属性。中间用分隔符联结。联结的顺序是由集成开发人员在可视化的映射编辑器里定义的。索引是从0开始计算的。分隔符也需要自己定义,它可以是空格,逗号,/ 或任何一个符号或字母。要注意的两点是:
- 源业务对象的属性可以是任意的, 但目标业务对象的属性必须是一个字符串 (String).
- 如果源业务对象或者目标业务对象的属性是列表的话(目标业务对象的属性只能是字符串的列表),必须指出要指定到这个列表的哪个索引。
在这个例子中,我们需要用last name 和 first name 组合成name, 中间用","分隔。将名字进行组合的方法如图2所示:
图2 组合规则
在详细信息视图中,具体定义了源业务对象的几个属性在组合后的目标业务对象的属性里的位置及分隔符如图3所示。同一个规则里可以使用不同的分隔符。
图3 组合规则中的分隔符定义
3.2.3. 拆分 (Extract):
这种转换是将源业务对象的一个属性根据分隔符和指定的位置拆分成几个目标业务对象的属性。分隔符需自己定义。 比如源业务对象的地址属性包括Street/Building/City/zipCode /Country,但是,在目标业务对象中,这些信息被记录在多个不同的属性中,所以我们要把一个属性拆分成多个。源业务对象的属性值中必须包含某一种分隔方法,比如逗号。之后在可视化的映射编辑器,集成开发人员需要指定每个目标业务对象属性在源业务对象属性中的位置。对于拆分转换规则, 以下两点需要注意:
- 源业务对象的属性必须是一个字符串 (String),目标业务对象的属性可以是任何的简单类型。
- 如果源业务对象或者目标业务对象的属性是列表的话,必须指出要指定到这个列表的哪个索引。
因为在SAP 系统中的用户业务对象中,地址被以'/'分隔,内容包括:Street/Building/City/zipCode/Country,而在业务受理系统中的用户业务对象有如下属性:country,state,street,zipCode。在这种情况下,我们需要把SAP用户信息里的地址拆分成业务受理系统里用户信息的多个属性。
3.2.4. 赋值 (Assign):
这个转换规则没有相应的源业务对象的属性,它只是给目标业务对象的某个属性赋于一个常量值。这种数据转换规则将被用于一些不存在于源业务对象但存在于目标业务对象的属性。要注意的是:目标业务对象的属性必须是简单类型而且不能是列表。
业务受理系统将对不同的用户设置一个折扣值,这个值与SAP中的设定并不相关。而且,它是一个固定的数值。我们可以用赋值 (Assign) 来实现它。折扣值为用户指定的80%,如图4 所示:
图4 赋值规则
3.2.5. 自定义 (Custom):
自定义转换规则所作的事情,与移动 (Move) 的目的是相同的,就是把一个源业务对象属性映射到一个目标业务对象属性, 所不同的是,它可以通过用户编程的方式, 来定义更加复杂的转化和处理,比如,将源业务对象中的价格属性乘以一个百分比后再赋给目标业务对象中的价格属性, 而不是单纯的复制。使用自定义 (Custom) 可以完全地代替转移 (Move)。自定义转换规则将用Visual Snippet 或 Java Snippet 来定义。Visual Snippet 使用可视化的方法定义转换,Java Snippet使用Java 代码来定义转换。
自定义转换规则可以有多个输入和多个输出,既一个目标业务对象属性的值,可能是由多个源业务对象属性的值计算而得到的。并且一个计算过程可以得到多个目标业务对象的属性值。
在业务受理系统中,可以根据来源不同的用户信息创建新的用户ID, 比如,在业务受理系统中,SAP 系统的编号为1, 而SAP用户的ID是5位的。我们可以把SAP用户的ID加上100000得到其在业务受理系统中的ID。这个过程不能用Move实现,它需要定义一个自定义 (Custom) 转换。自定义转换规则可以使用Virtual Snippet 或 Java Snippet 来实现(参见3.4节)。在这个例子里,自定义 (Custom) 转换只有一个输入和一个输出,多个也是允许的。
3.2.6. 自定义重用 (Custom Callout):
自定义重用转换规则是把一个源业务对象属性经过操作后保存为一个中间变量,这个中间变量可以被其它的操作使用。这个转换规则可以有一个或多个输入,0个输出。它最主要的特点是不会对目标业务对象的属性值产生直接的影响。
在SAP系统中 我们可能将用户分为几类。通过用户ID加以区分。我们可以在自定义重用(Custom Callout)映射中定义这些区分方法,并把得到的类型值作为临时变量存起来,用于之后对于这个用户其他变量的自定义映射中计算的中间变量。
3.2.7. 自定义赋值 (Custom Assign)
自定义赋值转换规则所作的事情,与赋值 (Assign) 的目的是相同的,就是为一个目标业务对象属性赋值, 所不同的是,它可以通过用户编程的方式来定义更加复杂的值。 比如,它可以给目标业务对象属性赋一个随机值或者一个时间戳。 使用自定义赋值 (Custom Assign) 可以完全地代替赋值 (Assign)。自定义赋值与自定义的区别正如赋值与移动的区别一样,没有源业务对象属性参与自定义赋值转换。这个转换规则可以有一个或多个输出,0个输入。
我们在生成业务受理系统的用户ID的时候,也可以用时间戳来生成用户ID, 而与源业务对象的用户ID 没有联系。这种情况下,可以使用Custom Assign。Custom Assign 同样可以用Virtual Snippet 或 Java Snippet 来实现。
3.2.8. 关系映射 (Relationship)
关系映射是一个比较含混的概念,它实际是面向业务对象的。也就是说,两个业务对象之间,只能定义一个关系映射,但是他的转换,又是基于属性的具体语意的。关系映射有两种:静态 (Static Relationship) 的和动态的 (Dynamic Relationship)。他们的区别在于静态的关系映射中的关系数据是运行前就在数据库中写好的,而动态的关系映射是临时创建的。语意上的映射可以是一对一的,也可以是一对多。多对多的。
首先介绍关系映射中的几个概念:
角色 (Role): 角色是由业务对象来充当的。一个静态关系映射有至少两个角色,一个动态关系映射,有至少三个角色。
关键字 (Key): 关键字是由充当角色的业务对象的属性中选出来的。它是语意相关的属性名。关键字的定义,必须是成对出现的。
是否是管理的 (isManaged): 在动态关系映射里,必须定义一个管理的角色。它是集成的系统内部的业务对象。比如SAP系统,通过集成系统访问数据库系统。SAP用户,集成用户,和数据库用户三种业务对象, 需要用一个关系映射定义其语意的关联。在这种情况下,集成用户业务对象是中间转换的桥梁,他将被定义为: 管理的。
在静态的关系映射中,可以没有管理的角色。
数据实例 (Data Instance): 数据实例就是一组语意关联,例如"BJ", "010"。就是一个数据实例。静态的关系映射可以预先在WID的关系映射编辑器里插入数据实例。两位,静态和动态的关系映射都可以在WPS的管理控制台 (Admin Console)里的关系管理器 (Relationship Manager)里边查看或者更改,添加。
在3.2.1节中,我们在性别的映射中使用了转移。但是当SAP系统用F, M 表示男女,而业务受理系统用男,女表示性别的时候,就不能单纯的使用转移了。因为这种转换中存在语意上,所以需要使用一个关系映射来表示它。因为只有两个系统,包括一个业务受理系统和一个SAP 系统。所以这里只需要两个角色。而且,映射时,值之间的关系是一对一的,在这种情况下可以选择一对一的静态关系映射。这个映射中,有两个角色:用户和SAP用户。关键字是性别 (gender)如图5所示:
图5 关系映射
静态关键字的数据实例可以在WID里或者控制管理台 (Admin Console)里的关系管理器 (Relationship Management)里边查看,添加或者更改。如图6所示:
图6 修改静态关系映射数据
在WID里建立关系数据映射时,需要注意的是,建立的这个映射是在业务对象之间的,而不是属性之间的。还要具体指定使用的关系映射和这个数据映射。两个业务对象如果有多个属性需要通过关系数据映射来完成,必须被定义在同一个关系数据映射里,因为我们在数据映射中使用关系映射时,在两个业务对象之间,只能选择一个关系映射,如图7所示:
图7 两个业务对象间只能有一个关系映射
3.2.9. 子数据映射 (Submap):
子数据映射是针对属性类型为一个业务对象的情况而设计的。当源业务对象属性类型与目标业务对象的属性类型不同时,他们需要通过另一个已经定义了的数据映射来转换。在这种转换中,将定义子数据映射的名字,及输入的业务对象和输出的业务对象 (因为在一个数据映射定义中,可能有多个源业务对象及目标业务对象)。
子数据映射是可以嵌套的。也就是说,被一个数据映射调用的子数据映射中还可能调用其它的数据映射。
在SAP 系统的订单业务对象中,用户这个属性的类别是SAP用户,而业务受理系统的订单的用户属性的类别是用户。这个转换就需要使用子数据映射来完成不同用户类型的转换,如图8所示:
图8 子数据映射
小结:
在数据映射中,使用哪种数据映射规则不是一定的,存在相互替代的可能性。比如,实际自定义 (Custom) 可以完成所有其它映射规则,但是为了更加方便的建立我们的集成系统,WID又定义了一系列更加细化的映射方式,主要是为了节约开发人员的工作。
3.3. 使用可视代码片断编辑器(Visual Snippet Editor)代替枯燥的编程
在使用自定义编程的时候,我们可以使用可视代码片断编辑器(Visual Snippet Editor)来描述转换规则。这种方法等同于用Java Snippet来描述。在可视代码片断编辑器里。可以使用WID自定义的函数,Java函数,可以使用分支(Choice),循环(Loop, For Each), 重复(Repeat)). 表达式(Expression). 输入变量将会在一开始就被显示在编辑器里,输出变量可以在右侧的变量列中选出。
例如在业务受理系统中的用户ID, 由原来子系统的用户ID组成。每个子系统内部ID唯一,如果我们给每个子系统一个统一的系统号,我们就可以得到一个唯一的业务受理系统号。在可视代码片断编辑器里,我们选择一个WID函数'append text', 然后把字符串100和输入属性SAPCustom_Id 作为输入参数连到该函数。再把输出属性从右侧的Variables里边拖出来。连到该函数上。如图9所示:
图9 可视代码编辑器
这个可视代码片断,等同于Java 代码:
java.lang.String __SAPCustom_Id = (java.lang.String)SAPCustom_Id;
java.lang.String __Customer_customerID = (java.lang.String)Customer_customerID;
java.lang.String __result__1 = "100";
java.lang.String __result__3;
{// append text
__result__3 = __result__1.concat(__SAPCustom_Id);
}
__Customer_customerID = __result__3;
Customer_customerID = __Customer_customerID;
|
可以通过切换编辑器,来查看代码片断编辑器生成的Java 代码。要注意的是,如果一开始就选择Java编辑器,不能把它转化成为代码片断编辑器下可查看的方式。
使用可视代码片断编辑器的优点是,可以减少编程的错误,简化编程过程。对Java编程不是很熟悉的开发人员来说,这个功能非常实用。开发人员不用编写任何代码就可以选择WPS中的类和函数,如BOFactory,Map Service, Relationship Service等,也可以选择JDK中的任何一个类进行实例化和调用。一个功能异常强大的向导可以在开发人员输入一个变量后自动显示它们的API以及相应操作符以供选择。
3.4. 数据映射的调试方法及技巧
数据映射的测试必须和接口映射结合起来。因为接口映射是WID的单元测试环境支持的测试单元。而接口映射,会调用到数据映射。在自定义映射规则里边加一些调试代码,是一个行之有效的方法。另外,在调用到关系映射的时候,可以查找关系映射存储的数据库。
利用WBI的Common Event Browser是一个系统化的好方法。它可以静态或者动态地设定:
3.4.1. 静态的,单个组件的
可以在WID里直接在数据映射构件上进行设置如图10所示。在设置之后,会看到数据映射上有一个小旗子的标志。这个Map在被调用时,将会把它的输入输出的信息存在通用基础事件浏览器(Common Base Event Browser)的数据库里,可以通过通用基础事件浏览器来察看。在这种设置下,只有这个数据映射构件的信息会被纪录。但是更改设置,需要重新部署这个应用。
图10 设置映射的事件监视配置
3.4.2. 动态的,所有这类组件的
需要在WPS的管理控制台 (Admin Console)的故障诊断选项里,选择日志和跟踪,手动添加 "com.ibm.wbiserver.map.*=all"。设置好之后,重新启动WPS服务器。当数据映射被调用的时候,可以在管理控制台的集成应用程序(Intergration Applications)的通用基础事件浏览器里用获取事件链接查看这个数据映射被调用的信息。
3.5. 数据映射中的常见错误及解决方法
比较常见的错误是发生在自定义的编程过程中使用子数据映射和关系映射时。
在使用子数据映射的时候,因为一个数据映射里可能包含多个源业务对象和目标业务对象,所以默认选择的映射不一定是我们需要的那个,一定要在使用子数据映射时,正确指定源和目标业务对象。
在使用关系映射时,要正确选择定义关系映射的种类是静态还是动态,以及值之间的关系是一对一的,一对多的,还是多对多的都要根据应用的具体定义而定。如果有两个需要被集成的系统,我们定义一个三个角色之间的关系映射。其中集成系统中的业务对象必须被指定为管理的。另外,如果要删除一个关系映射,只在关系映射目录下删除.ri文件是不够的,还需要在角色目录下删除相关的所有角色 (.rol 文件)。
自定义编程的时候,主要的错误是变量的命名。这个映射规则的输入输出变量在用户选择用Java Snippet来描述的时候,会被显示在程序的最上边,必须使用这些输入输出的变量名。如图11:
图11 自定义映射注意事项
java.lang.String __SAPCustom_Id = (java.lang.String)SAPCustom_Id;
java.lang.String __Customer_customerID = (java.lang.String)Customer_customerID;
在这里,SAPCustom_Id,Customer_customerID
|
是输入和输出的变量,但是他们需要被转换类型,所以我们用的变量应该是__SAPCustom_Id和__Customer_customerID。
4. 接口映射的使用
4.1. 接口映射的用途和开发
接口定义了一个组件对外的操作集合,并与组件的实现无关。在进行业务集成的实际项目中,往往有系统A需要访问某个服务(接口),而系统B可以提供这种服务(接口),但两个接口中操作的定义(操作名或者参数)可能有差异,改变任何一个系统的代价可能都非常大。这时对接口进行映射的功能就可以体现它的巨大作用,不需要对两个系统的接口进行修改,通过简单的接口映射就可以实现两个系统的无缝连接。
接口映射可以映射普通的Java接口,也可以映射Web服务(Web Services)接口。在WID中,我们可以先创建源接口定义和目的接口定义,然后再创建一个接口映射,选择源端口和目的端口后,就可以创建两个接口中相应的操作绑定和参数映射,来实现两个接口间的映射。
操作绑定可以将源接口中的一个操作绑定到目的接口中的一个操作。每个接口映射可以有一到多个操作绑定,而每个操作绑定中又可能有零到多个参数映射。需要注意的是在进行操作绑定中有如下的限制:
- 每个操作绑定只能绑定一个源操作和一个目的操作
- 目的操作的所有输入参数都要有相应的参数映射,源操作的所有输出参数都有相应的来自目的操作输出值的数据映射
- 如果目的操作中的错误(Fault)在源操作中没有相应的数据类型,那么必须把目的接口的操作的错误映射为源操作的错误类型。
对于参数映射可以利用前面提到的数据映射来完成。
在WID中,我们需要利用接口映射编辑器开发一个接口映射。其开发步骤如下:
1. 在菜单中选择新建一个接口映射。
2. 在向导中输入接口映射的模块名、名字空间、文件夹以及名字。
3. 输入源接口和目的接口,单击完成按钮。这时接口映射编辑器就会把两个接口显示出来。
4. 左键拖动源操作到目的操作,然后单击两者间的连线。在下面的参数映射视图中将参数进行相应的数据映射。
5. 将所有操作对进行一一映射后,保存到工程中。这样就开发完了一个接口映射如图12所示:
图12 WID中的接口映射开发
然后根据实际需要,在组装图中对接口和接口映射进行组装。一个最基本的接口映射组装图如图13:
图13 接口映射组装图
在这里CompanyInformationExport组件是接口映射暴露给外界的源端口,CompanyInforamtionInternalService是接口映射需要调用的目的端口。如果其它模块想调用此接口映射,只要把CompanyInformationExport导入就可以了。
4.2. 接口映射的调用方法
在本节中,我们将通过一个实际需求来阐述如何灵活运用接口映射来解决问题。
JustOrders.com公司需要将已有的基于WBI SF(WebSphere Business Integration Server Foundation) 5.1.1开发的订单处理系统A与用WID 6.0开发的新订单处理系统进行集成。在新系统中,所有接口都是普通的Java接口,而在遗留系统中,都是基于EJB的Web服务。由于新旧系统接口方法名字、参数的不同,以及在新系统中调用接口的方式不同,在WID中的接口映射的实现方式也就有所差异。
在用WID6.0开发的新系统中有很多模块,而各个模块的业务逻辑与接口映射的实现往往是分离的,这样我们就需要调用不同模块内的接口映射。另外新系统中将原来系统的很多服务(例如QueryOrder,ModifyOrder,CreateOrder等)合并到同一个服务中(RegionalOrderProcessing),那么在调用新系统的这个接口时,我们就需要使用选择器(Selector)来实现将对RegionalOrderProcessing接口中操作的调用映射到相应的接口操作。同时,在业务执行逻辑实现的时候,有时还需要通过Java代码和服务组件架构(SCA)来直接调用接口映射。对于这些需求,下面将阐述某些接口映射的调用方式供大家参考。这里,我们将把所有映射都存放在名为OPMap的模块中。
4.2.1. 调用不同模块的接口映射
在新系统的发货模块中需要调用原系统的CompanyInformationInternalService来获得某些公司信息。但发货模块与接口映射的实现不在一个模块,我们需要将接口映射导入(Import)到发货模块,然后进行调用。发货模块(OPPackingSlip)中有一个业务流程叫QueryPackingSlipBPEL,它需要访问CompanyInformation接口中的操作。那么在这个BPEL中将CompanyInformation接口添加成为一个引用伙伴(Reference Partner),并在BPEL中开发完对相应操作的调用后,就可以通过组装编辑器来完成BPEL对跨模块的CompanyInformationToCompanyInformationInternal接口映射的调用。
假设我们已经在OPMap模块创建了CompanyInformationExport。下面要做的是:
1. 打开OPPackingSlip的组织图,将QueryPackingSlipBPEL拖入到组装图中。
2. 在组装图中通过 添加一个Import。将名字改为CompanyInformationImport。
3. 右键单击这个Import,然后选择添加接口,选择CompanyInformaiton做为接口,也就是接口映射的源接口。
4. 再右键单击,选择生成绑定,选择SCA绑定。在属性视图里,切换到绑定页,点击浏览按钮,选择CompanyInformationExport。
5. 在组装图中将BPEL和CompanyInformationImport连接起来。
这样就完成了对接口映射跨模块的调用。在BPEL实际执行的时候,通过调用这个Import组件,也就是接口映射的Export组件,就可以调用OPMap模块的接口映射,最后实际调用目的接口CompanyInformationInternalService中的相应操作。
4.2.2. 通过选择器(Selector)调用接口映射
对于同一源接口中的操作要映射到不同目的接口中的操作时,我们可以利用选择器来实现。例如RegionalOrderProcessing接口中的QueryOrder操作要映射到QueryOrderService接口中的QueryOrder操作;而UpdateOrder操作要映射到ModifyOrderServiceBean接口中的UpdateOrder。那么我们可以先创建OrderProcessingSelector ,在选择器中将RegionalOrderProcessing接口中的操作设置相应的目的接口映射,例如将QueryOrder操作的接口映射目的操作设为RegionOrderProcessingToQueryOrder,将UpdateOrder操作的默认目的地设为RegionalOrderProcessingToModifyOrder,保存选择器。然后,我们只需要在组装图中将它们组装在一起就可以了。首先在OPMap中创建一个选择器的Export。然后在需要调用QueryOrder和UpdateOrder的模块中添加与这个Export绑定在一起的Import,再将发起调用的BPEL与Import连接起来,BPEL就能通过选择器和接口映射将对源接口的操作的调用变为对目的接口相应操作的调用。
4.2.3. 通过服务组件架构(SCA)调用接口映射
在实现中,我们有时也可能需要在非SCA组件中,通过编写Java代码来调用接口映射。这时可以通过为接口映射创建独立引用(Standalone Reference)的方式进行调用。
这里,库存管理模块的InventoryControlBPEL需要不断的查看各个仓库的库存量,如果库存不够就要及时向生产部门发出生产请求,来保证在最短时间内发送客户所需的货物。在这个业务逻辑中,我们需要通过java代码来访问OPMap模块中的CompanyInformation接口来获得各个仓库的信息。
首先我们需要在库存管理模块的组装图中添加一个独立引用(Standalone Reference) ,然后将其与CompanyInformationToCompanyInformationInternal接口映射联系起来,WID就会自动生成对接口映射组件的引用(reference文件),这样非SCA组件以及其他SCA组件就可以通过SCA的API来访问这个接口映射,如图14。
图14 通过SCA调用接口映射
我们可以通过如下的Java代码来调用接口映射中源接口中的操作getBuildings:
//// Sample code begins /////
ServiceManager serviceManager = new ServiceManager();
Service service =
(Service) serviceManager.locateService("CompanyInformationToCompanyInfoInternal");
String str = (String) service.invoke("getBuildings", "1190"));
//// Sample code ends /////
|
这里"1190"是传给此操作的参数值。
4.3. 接口映射的调试方法及技巧
在调试一个接口映射时,我们可以充分利用WID中的模拟器(Emulator)来进行单元测试和集成测试。
技巧:需要安装运行时测试环境来完成调试功能。
在实现接口映射模块的组织图上,右键单击需要测试的接口映射,然后选择测试组件。这时WID会显示组件测试视图。在该视图的事件页中,我们可以选择需要测试的操作,然后输入测试数据,点击继续,然后WID会提示你输入模拟的目的接口相应操作的返回值。填写完毕后,点击继续,WID会显示源接口中的操作的返回值。这样我们就可以通过检查对源接口中的操作调用的输入/输出来判断接口映射实现的对错。
默认情况下,WID会使用自身的模拟器来对接口映射进行测试。这适用于开发初期对接口映射进行单元测试。一旦目的接口的实现完成后,我们就可以对此接口映射进行实际完整的测试了。这时,我们需要打开测试视图的配置页,删除所有的模拟器(Emulators),然后再输入测试数据,这时WID就会自动调用相关的实现,将最后的结果返回。如果有异常抛出,你将在右边的详细属性栏里面看到具体的错误信息和异常跟踪(Exception Trace)。通过异常信息,你就可以通过分析找到问题的根源,修改错误,然后继续调试。
技巧:在事件页中,在输入测试数据后,我们可以点击数据池(Data Pool)按钮来将测试数据保存起来,将来再次测试时,可以先点击按钮,从数据池中找到初始数据做为请求数据再次测试。这样会大大减少输入测试数据所需要的精力和时间。
在结束一次调试后,要保存当前的测试文件(.wbiexetrace)。以后只要打开这个文件,就可以对接口映射进行快速调试。
4.4. 最佳实践
通过对接口映射的使用和了解,总结以下一些经验供大家参考:
- 如果映射Web服务,尽量不要使用WSDL的inline schema来定义参数类型。这很容易导致各个操作的参数的类型定义不匹配造成"无法找到指定数据类型"的错误。
- 必须保持接口名字空间的唯一性。在5.1.1中,接口的名字空间可以重复,但在WID6.0中,名字空间必须唯一。如果需要调用WBI SF5.1.1中发布的Web服务,那么在把wsdl接口文件从5.1.1导入到WID6.0中后,要确保每个接口的名字空间的唯一性,必要时进行修改。
- 调试时,要采用先模拟,再实际调用的测试步骤,一步步发现并解决问题。
- 充分利用数据池(Data Pool)和执行过程跟踪文件(.wbiexetrace)来保留历史数据,减少回归测试的任务量。
- 接口中参数的数据类型要注意区分int、Int以及Integer是不同的数据类型,以及自定义的数据类型的名字空间。例如可能有两个Order业务对象的定义,但名字空间不同。在定义类型为Order的参数时,一定要选择正确的名字空间下的Order业务对象类型。否则可能会导致映射失败。
5. 总结
在WPS/WID中,映射起着不可忽视的作用。映射通过为数据和接口进行变换,对WPS的SOA架构提供了强大的功能支持,使得系统的可移植性和可维护性大大提高。每个模块都可以维护自己独立的接口,而当需要访问其他系统的服务时,只需进行简单的数据或者接口映射,无需对模块自身实现做任何改变,这是映射的最显著作用。
在数据映射中通过对多种数据变换操作的支持,使得开发人员可以方便的进行数据整合。另外对可视代码片断的支持,使得非Java程序员也可以轻松地通过拖拽进行编程实现,很大程度上扩大了WID的使用对象群体。
作为面向服务架构的一项基础服务,映射是辅助开发人员进行集成的强大工具之一。
参考资料
作者简介  | |  | 薛江波,IBM 中国软件开发中心高级软件工程师,主要从事WebSphere InterChange Server以及WebSphere Process Server 软件的系统测试以及相关软件技术支持与服务、WBI 解决方案在电信领域的开发及实施,具有丰富的产品测试和实施经验。 |
 | |  | 徐苏,2005年加入IBM中国开发中心,一直从事WPS产品的系统测试工作。 |
对本文的评价
|