在本系列的前几篇文章中,您了解了如何使用业务流程和状态机来实现服务组件。然后您了解了如何通过使用业务规则和选择器来实现其他组件,从而快速响应不断变化的业务条件;业务规则和选择器都允许您在部署应用程序之后更改参数。在本文中,我们将研究 WebSphere Integration Developer 中的更多支持功能。
有一个挑战肯定会在面向服务的应用程序中出现:当两个服务需要很好地协同工作,但它们却不知道如何通信时,会发生什么情况呢?在本系列早些时候,我们解释了一个组件实现使用引用来调用另一个组件。我们曾指出,引用的接口必须与它所连线到的组件的接口匹配。然而,如果接口不匹配会怎么样呢?
例如,假设某个引用的接口有一个 retrieveCustomerData 操作,您希望该引用连线到的组件有一个带 getCustomerData 操作的接口。更深入地研究一下,如果 getCustomerData 操作返回的其中一个业务对象有一个名为 custId 的字段,而 retrieveCustomerData 操作预期的返回参数名称只是 id,则问题就复杂化了。
在小型的局部化应用程序中,解决方案很简单:只需更改接口以使一切都匹配。然而在实践中,您的业务合作伙伴通常为您使用的服务提供接口,例如 Web 服务定义语言(Web Service Definition Language,WSDL)文件,因此更改它们就不在您的控制之内了。即使您能够更改接口,也可能会破坏服务的现有使用者。在客户端,更改引用的接口也可能根本无法办到,因为您必须更改实现以使用不同的名称。WebSphere Integration Developer 使得绕过此障碍变得非常容易:它允许您创建接口和业务对象映射。
如果您尝试将引用连线到其接口之间存在不匹配的组件,则会打开一个对话框,询问您是否希望创建接口映射。本文将向您介绍创建不同类型的映射是多么容易。
除了映射外,我们还将探索人工任务。自动化业务流程对于公司的效率和效用非常重要。然而,业务流程仍然经常需要人工介入。例如,银行贷款批准流程可能需要资深贷款专家对可疑贷款申请进行评估。在库存量低于某个下限时自动添购存货的零售店流程可能需要商店经理批准所有的大额订单。在业务流程期间处理例外情况时也可能需要人工介入。在类似的情况下,您可以在设计集成应用程序时使用人工任务组件。
顾名思义,人工任务是涉及到人的任务。它是模块中的一个组件,就像我们已看到过的其他组件一样,如业务流程、业务状态机或业务规则。您可能想知道,WebSphere Studio Application Developer Integration Edition, Version 5.1 中的员工活动与人工任务组件之间的区别是什么。您只能从业务流程中使用员工活动,并且其功能是有限的。例如,员工活动不允许升级(还未认领或完成的任务的自动重新分配)。在 Version 6 中,人工任务是一级组件,不再局限于业务流程中的内部活动。此外,人工任务组件不仅允许计算机与人交户,而且允许人与计算机和人与人的交互。
在解释人工任务、接口映射和业务对象映射以后,我们将再次让您进行动手练习,这次是使用一个映射来创建一个人工任务,该映射允许两个具有不同接口的组件彼此通信。
在下面几个部分中,您将了解如何使用 WebSphere Integration Developer 来执行更多任务:
- 映射接口和参数
- 映射业务对象
- 将组件实现为人工任务
- 创建自己的人工任务
- 创建自己的接口和业务对象映射
接口 映射位于两个具有不同接口的组件之间,允许您指示“当我调用接口 A 的操作 X 时,将请求发送到接口 B 的操作 Y”。当然,两个操作的参数也可能不匹配。因此,接口映射还允许您指示“将操作 X 的参数 1 传递给操作 Y 的参数 2”。如果两个操作的参数属于相同类型,那么接口映射也不过如此而已。然而,参数类型通常是不同的。在“参数映射”部分,我们将向您介绍在参数类型不同时为您提供帮助的各种映射工具。
例如,假设某个订单处理组件需要调用发货组件的 shipOrder 操作。然而,发货组件的接口有一个名为 ship 的操作,并且两个操作的参数具有不同的名称。图 1 显示了这两个接口:一个包含 shipOrder 操作,另一个包含 ship 操作。请注意,每个操作的参数名称是不同的。图 2 显示了解决这些差异的接口映射。
图 1. 两个需要映射的操作
图 2. 接口映射
在接口映射编辑器的顶部,您将左侧接口的操作连接到右侧接口的操作。对于操作参数,该编辑器底部显示了您通过连接每个操作的各个参数(输入和输出)来创建的映射。当您连接参数时,会自动创建一个移动映射类型。我们很快将讨论不同类型的参数映射。
映射类型的一端带有箭头,以指示该映射的方向。例如,上方的移动指示将 orderInfo 输入值传递给 order 参数,而下方的移动指示将输出参数 ok 的值传递给 shipped 参数。
存在两种创建接口映射的方法。第一种方法是使用接口映射向导 (File - NewInterfaceMap),如图 3 所示。使用此方法,您将选择或创建源和目标接口。源接口 是属于某个组件引用的接口,目标接口 是属于从该引用调用的组件的接口。
图 3. New Interface Map 向导
另一种创建接口映射的方法是将一个组件的引用连线到另一个组件。当引用和组件具有不同的接口时,您将使用此方法。组装编辑器询问您是否希望在源和目标节点(分别代表引用和组件的节点)之间创建接口映射。
创建接口映射以后,您需要定义接口操作之间的映射,从图 4 的顶部可以看到这点。您将通过如下方式创建映射:在左侧某个操作的旁边单击,并将该连接端拖动到右侧的对应接口。当您选择两个操作之间的连接时,参数映射显示在编辑器的下半部分。下一步是绘制等效参数之间的连接。
图 4. 创建接口映射
在指定一个接口的哪个操作对应于另一个接口的哪个操作以后,您需要映射操作参数。与操作映射一样,您将一个操作的输入和输出连接到另一个操作的对应输入和输出。然而,映射对应的操作只需在它们之间绘制一条线,而映射数据可能会更复杂。如果参数类型匹配,则您只需连接对应的输入或输出,如图 4 所示。类型通常是不匹配的,但是业务对象映射编辑器会帮助您映射数据,我们将在“业务对象映射”部分向您介绍这一点。
首先,让我们研究如何创建参数映射。对于输入参数映射,您将连接从左侧的某个输入参数拖动到右侧的对应输入参数。对于输出参数映射,您从右向左拖动连接。创建映射以后,下一步是指定映射类型。您可以从 Properties 视图的 Description 选项卡中的映射类型列表中选择。在下面几个部分中,我们将解释五种类型的映射:
- 移动
- 提取
- 映射
- 赋值
- Java
移动
缺省情况下,当您连接两个参数时,所创建的映射类型称为移动参数映射。在前面的示例中,我们展示了移动参数映射。使用移动参数映射,源参数的确切值将按原样传递到目标参数。每个参数的类型(无论是字符串还是业务对象)必须相同。移动映射类型具有一对多的关系,意味着您可以将一个源参数映射到一个或多个目标参数。
提取
有时,目标参数只需要源参数中的部分数据。在此情况下,您可以使用提取。提取参数映射 取得业务对象的属性值(可以是简单类型或嵌套业务对象),并将其放到目标中。图 5 显示了前一示例的变体,其中 ship 操作有两个输入参数,其类型分别为 Item 和 Address。shipOrder 操作中使用的Order 业务对象包含同样的 Item 和 Address 类型的属性,从图中底部的 XPath 树中可以看到这点。Properties 视图显示了一个从 orderInfo 中选择 item 属性的 XPath 表达式。当您使用该映射时,orderInfo.item 的值被传递给 item 参数。我们使用对 orderInfo 的第二个提取作为源,将 orderInfo.address 值传递给 address 参数。
图 5. 提取参数映射
映射
如果参数类型不匹配,您将使用映射而不是移动。映射参数映射 允许您协调不同的业务对象参数。两个业务对象之间可能存在许多不匹配的地方,虽然每个业务对象都包含另一个所需要的信息。由于一个业务对象的属性顺序不同,并具有与另一个业务对象的属性不同的名称,就会出现不匹配。不匹配情况也可能变得相当复杂:一个业务对象可能表示一个具有三个属性的名称(salutation、firstName 和 lastName),而另一个业务对象所表示的名称可能仅使用一个属性,该属性旨在包含逗号分隔的字符串。您甚至可能有多个业务对象,它们的各个部分需要映射到一个业务对象,或者从一个业务对象映射到各个部分。使用映射时,您将指定一个业务对象映射,用于将一个业务对象的属性映射到另一个。业务对象映射的部分详细描述了此映射类型。
赋值
您还可以将常数值映射到目标参数。赋值参数映射 允许您指定一个常数值来放在目标参数中。此类映射只有一个目标。因此,若要创建赋值映射,您不能在两个参数之间创建连接和更改要赋值的类型(因为双端连接不能是赋值映射)。所以,若要创建赋值映射,请右键单击某个目标参数(右侧的某个输入或左侧的某个输出),并选择 Create Transform - Assign。在 Properties 视图中,您可以输入该常数值。
当目标操作包含源操作中不存在的参数时,您应该使用赋值映射。额外的参数可能不再使用。由于映射要求所有目标都具有映射,您可以向额外参数赋予某些缺省值。额外参数还可以始终具有在从您的模块调用时的相同值。例如,图 6 显示了一个 ship 操作,它带有一个 orderType 参数,此参数在 shipOrder 操作中不存在。赋值映射在每次使用该映射时传递一个值 express。
图 6. 赋值参数映射
Java 参数映射
对于需要自定义逻辑的映射,您可以使用 Java 参数映射。Java 参数映射 允许您编写任意 Java 代码来将一个对象转换为另一个对象。在 Properties 视图的 Details 部分,您可以指定类名,该类必须扩展 Java 类 com.ibm.wbiserverspi.mediation.JavaMediation。JavaMediation 类包含一个中介方法,该方法接受一个对象(此对象就是将被映射的值)作为输入,并返回一个对象(即转换后的值)。
在参数映射示例中,您看到了如何使用诸如移动和提取等映射类型,在操作之间映射参数。在本部分中,我们将研究当参数类型不同并且您无法使用参数映射时,将会发生什么情况。正如我们在前面指出的,映射参数映射类型要求您指定业务对象映射,此映射处理两个业务对象的属性之间的映射。在本部分,我们将介绍什么是业务对象映射以及如何使用它们。
映射业务对象属性类似于映射参数:将源属性连接到目标属性。映射属性也称为转换属性。由于转换属性一般要比映射参数需要更多的灵活性,因此存在更多的转换类型。下面几个部分将介绍下列转换类型:
- 移动
- 子映射
- 提取
- 赋值
- 自定义
- 联接
- 关系
移动
移动转换 类似于移动参数映射类型。它将源业务对象中的某个基元类型属性的值赋予目标业务对象中的某个基元类型属性。您可以将一种基元类型的属性(如字符串)映射到另一种基元类型的属性(如整数)。务必记住,如果无法在运行时转换该数据,则会产生异常。例如,如果将字符串“123a”映射到到一个整数,您将在服务器日志中看到 NumberFormatException。此外,与移动参数映射不同,您无法使用移动转换来映射复杂类型。对于业务对象之间的映射,您需要一个子映射,很快我们就会讲到这一点。
图 7. 移动转换
子映射
子映射 是另一种业务对象映射,用于将一个业务对象转换为另一个业务对象。例如在图 8 中,PO 业务对象包含一个 Address 业务对象。在右侧,在 Order 中,Customer 业务对象中也有一个 Address。Details 选项卡显示 Address 业务对象映射将 Order/customer/address 映射到 PO/shipTo。由于源和目标具有相同类型 Address,该子映射仅包括带 Address 属性的参数之间的移动转换。这可能使您想起了前面的提取参数映射。如果包含 PO 的接口具有两个参数 invoiceNum 和 shipTo,而不只是一个 PO 参数,我们可能已经在这里使用了提取参数映射。
图 8. 子映射转换
提取
提取转换 与对应的参数映射稍有不同,因为它的源属性必须是字符串。您使用提取转换来提取该字符串的各个部分,并将那些部分分配给另一个字符串,或分配给任何其他基元类型,并注意我们在移动转换部分中提到的告诫。
例如,图 9 显示了两个提取,它们从一个格式为 lastname, firstname 的字符串中分离出姓氏和名字。第二个提取的详细信息表明,截止第一个逗号的姓名字符串部分被复制到了 Person 对象的 lastName 属性中。子字符串索引确定了要使用该字符串的哪个部分(从 0 开始)。因此,firstName 提取包含与 lastName 提取相同的详细信息,只不过子字符串索引为 1(它使用该字符串的第二部分:第一个逗号和第二个逗号之间的字符)。如果 name 属性的值为“Smith, Joe”,则 firstName 将获得值“Joe”,lastName 将获得值“Smith”。
图 9 提取转换
联接
联接转换 组合两个或更多个源属性的值,并将它们复制到一个目标属性。联接转换的目标必须是字符串。您可以将联接转换视为提取转换的逆向过程,因为它接受一组字符串输入(或任何其他基元类型,它们将被转换为字符串),并将它们联接为单个字符串,并可选地用分隔符来分隔。
在提取转换示例中,我们演示了如何将逗号分隔的字符串映射为单独的名字和姓氏属性。通常您需要进行两个方向的映射。图 10 显示了如何从 Person 业务对象映射回 emp 业务对象。如果 firstName 包含值“Joe”,并且 lastName 包含“Smith”,则 name 属性将获得值“Joe,Smith”,因为 firstName 有一个设置为逗号的分隔符。
您可以通过查看 Details 选项卡底部的示例,检查该联接转换是如何连接那些值的。务必记住,分隔符可以包含多个字符。Prefix 和 Postfix 字段允许您添加字符串来为结果联接字符串添加前缀或追加后缀。您还可以使用 Reorder 图标来更改对属性进行连接的顺序。
图 10. 联接转换
赋值
赋值转换 将一个常数值设置到目标属性。图 11 显示了一个赋值转换,它将 Person 的 prefix 属性设置为空。
图 11. 赋值转换
自定义、自定义赋值和自定义调出
若要编写 Java 代码来指定源和目标属性之间的映射逻辑,您将使用自定义转换。如果不存在源属性,您将使用自定义赋值转换,它与赋值转换类似,只不过您将使用 Java 代码来计算所赋的值。如果不存在目标属性,则您将使用自定义调出转换来初始化值。
关系
当相同数据具有不同的名称或不同的标识时,您将使用关系转换。关系转换与其他映射不同,因为对于其他映射,我们感兴趣的是如何连接引用相同数据的不同属性名称或业务对象。关系转换则更进一步,它还处理数据不同但具有相同含义或引用相同事物的情况。
存在两种类型的关系转换:动态关系和静态关系。静态关系 使引用相同事物的不同值相互关联。此类值从不或很少变化。一个典型示例就是州名或省名:一个系统可能使用两个字母的名称,例如 ON,而另一个系统可能使用更长的缩写,例如 Ont.,还有一个系统可能使用完整名称,例如 Ontario。
当您使用静态关系将数据从一个属性映射到另一个属性时,还可以按照您用关系编辑器创建的表来转换数据。例如,在将一个业务对象的值为“ON”的 province 属性映射到另一个业务对象属性时,所赋的值可以是“Ontario”。
您将使用动态关系 来基于主键对数据进行关联。例如,商店中的某种产品可能在库存跟踪系统中具有一个标识符,而在供应商系统中具有另一个标识符。您的系统可能在通用业务对象中有某个标识符,该标识符不仅包含与其他业务对象中的标识符相同的数据,而且还包含某个所需内容,用于跟踪哪些数据实际是相同的。例如,在将值为“123”的 itemNumber 映射到 productCode(在供应商接口中使用的业务对象中)时,可能需要插入值“a234”,以便能够从供应商系统订购正确的产品。WebSphere Process Server 的关系管理器将负责处理这一点。
参考资料部分列出的两篇关于关系的文章“WebSphere Process Server relationship service, Parts 1 and 2”将指导您完成一些练习,阐明如何使用这两种类型的关系转换。
若要存储希望重用的数据,您可以创建变量。变量可以是前述每种转换类型的源和目标。例如,如果您有一个希望赋值给许多目标的值,您可以使用赋值来将某个值设置到该变量,然后使用从该变量到多个属性的移动转换。
作为示例,图 12 显示了一个映射,它带有一个使用 orderInfo.code 的值来填充的名为 code 的变量。orderItems.code 和 shipTo.code 中使用了此值。请注意,为了使这能够工作,对变量赋值的执行秩(由转换类型左侧的数字来指示)必须低于该变量所映射到的目标。否则,该变量在使用时将是未初始化的。
图 12. 使用变量
WebSphere Integration Developer 帮助您开发允许不同计算机应用程序协同工作的解决方案。然而,开发集成信息系统通常涉及到支持与人的交互。
人工介入具有多种形式。例如,可能需要人来启动某个流程实例,然后该实例可以自己继续工作。可能需要人来处理应用程序内置逻辑所无法处理的例外情况,或许是因为该情况被认为太复杂或太特殊。正常处理由于某种原因而失败,这种情况也可能需要人工介入。
在决定某个流程应该涉及到人之后,开发人员将面对着如何实现此功能的决策。WebSphere Integration Developer 提供了一个人工任务组件,可以极大地简化支持人与 SCA 应用程序交互所需要的工作。
面向服务的应用程序中涉及到人的场景之一是这样的流程:该流程在继续之前,需要某人做出决策来批准订单,如图 13 所示。
图 13. 流程中由人做出的决策
考虑此场景的一些要求:
- 从用户处获得数据或将数据提供给用户的机制
- 异步或长期运行(因为人可能无法即时响应)
- 用于支持交互的界面。由于任何时间可能有多个流程实例需要人工介入,该用户界面需要显示正在等待输入的流程,并且需要提供所选任务的详细信息。
- 用于验证用户有权执行该任务的方法
人工任务满足这些要求并提供一个独立组件,就像业务流程和业务状态机一样。它使用接口和业务对象与其他组件通信。图 14 显示了一个名为 ApprovalHumanTask 的人工任务组件,这是图 13 中显示的流程所调用的组件。
图 14. 人工任务组件
然而,人工任务组件是独特的,因为它们仅支持单个可能只有单个操作的接口。这反映了如下事实:一个人工任务仅定义单个交互,多个交互将需要多个人工任务。让我们考虑一个文件夹作为类比。该文件夹包含确定和完成任务所需的信息。用户向该文件夹内容添加任何所需注释或数据并返回它。
人工任务天生就是异步和长期运行的。假设有人能够立即处理所有请求是不现实的。相反,需要人工介入的任务必须在队列上进行管理,以等待有人空闲时来完成它。使用我们的文件夹类比,假设有一个具有一堆文件夹的收件箱等待处理。每个文件夹都保留在收件箱中,直到能够对它进行处理和重新归档。
存在三种类型的人工任务,我们将在接下来的几个部分中研究它们:
- 参与
- 发起
- 纯粹
参与人工任务
在参与人工任务 中,某个组件(例如图 14 中的 OrderProcessing 组件)调用某个人工任务组件。换句话说,该人工任务参与工作的完成。
图 15. 参与人工任务
发起人工任务
发起人工任务 调用另一个组件。与分配工作给它不同,是由它开始完成工作的过程。发起人工任务表示某人请求某个内容而不是满足某个请求。
图 16. 发起人工任务
纯粹人工任务
纯粹人工任务 类似于发起人工任务,因为也是人请求它。然而,对于纯粹人工任务,将是另一个人而不是某个计算机应用程序满足该服务请求。在此情况下,该应用程序充当人与人之间的交互中介。
图 17. 纯粹人工任务
若要向模块添加人工任务,请选择 File - New - Human Task。New Human Task 向导允许您指定任务的名称和容器。该向导的第二和第三个页面允许您指示想要创建的任务类型,并指定其接口。然后将为新创建的任务打开人工任务编辑器。
现在让我们研究一下如何配置人工任务。
人员设置——角色
可以想象,您需要某种方法来将人工任务与有资格并且允许完成该任务的特定人员或某组人员的任何成员关联。您还可以向人工任务分配角色(例如,潜在所有者、读者),以便能够授予特定的访问权限。
图 18. 人员设置
客户端设置
WebSphere Process Server 包括一个用于人工任务的基于 Web 的内置用户界面,即 Business Process Choreographer (BPC) Explorer。该界面适合用于测试和管理目的,但是不应在现实应用程序中将它用作人工任务的用户界面。开发人员应该开发自定义用户界面,以显示任务内容并允许用户处理该任务。
WebSphere Integration Developer 包括对两种用户界面实现的内置支持,但是您可以通过扩展来添加其他实现类型。受支持的用户界面类型为 JSP 和 Portlet。在该编辑器的客户端设置区域,您可以选择要提供的界面类型,在详细信息区域,您可以指定该界面实现所在的位置。本文结尾处的参考资料提供了有关实现自定义界面的特定详细信息。
图 19. 客户端设置
升级设置
当用户认领某个任务时,其目的是为了在合理时段内完成它。然而,通常存在阻止及时完成任务的情况。例如,用户可能要等待其他材料,然后才能做出决策。如果调用该任务的流程可能要求在某个时段内响应,结果会怎么样呢?为了响应此类情况,人工任务允许开发人员指定在任务未被认领或未在某个时段内完成时进行升级。
当人工任务被调用时,它要么处于就绪(还未认领)状态,要么处于已认领 状态。升级就像业务状态机中的计时器。当任务进入某个状态后,如果它在到达升级中指定的时间时还没有离开该状态,则会触发升级并执行其指定的操作。您可以指定一系列升级,其中每个升级在某个持续时间过期而任务还保持其特定状态时马上触发。
人工任务的另一种状态是子任务状态。当用户认领某个任务时,该用户可以将任务的某个部分委托给另一个用户,从而将人工任务置于子任务状态。您可以向该子任务状态添加升级,以确保完成任务的该部分,以便总体任务能够继续。
图 20 显示了一个人工任务,如果该任务在两个小时内未完成,则会发送通知。Verb 选项卡包含将在升级发生时接收通知的人。在下面几个部分中,我们将探索您将在应用程序中构建的升级。本文结尾处的参考资料还提供了更多相关信息,介绍如何使用人工任务管理器和开发您自己的客户端来分配子任务和响应升级。
图 20. 升级设置
与作为单独组件而存在不同,内联人工任务 是另一种形式的参与人工任务,它是在业务流程内定义的。只能从该流程内访问它。这种人工任务的优点在于,它可以访问流程的上下文(例如,流程变量),从而允该流程中的多个人工任务共享信息。
图 21. 内联人工任务
为了理解如何映射接口和业务对象以及调用人工任务,我们将指导您完成一个映射两个接口的过程,然后介绍如何从流程请求人工任务。在第一个场景中,假设您有一个订单处理系统和一个处理发货的业务合作伙伴。为了进行产品发货,您将使用合作伙伴的 Web 服务。遗憾的是,格式与合作伙伴的 Web 服务输入不兼容,虽然您的模块中使用的 Order 业务对象包含用于对订单发货的足够信息。例如,Order 业务对象包含一个 CustomerInfo 业务对象和一个 Item 对象列表,如图 22 所示。
图 22. OrderProcessing 业务对象及其内容
图 23 显示了该 Web 服务接口中预期的业务对象。使用这些业务对象的接口与图 24 所示的接口也不匹配。
图 23. ShippingService 业务对象
图 24. placeOrder 和 shipOrder 接口
在我们的场景中,订单必须由某个员工批准,然后才能发货。如果此任务未在某个时间内完成,则对其进行升级。出于演示的目的,我们仅使用允许任何人认领任务和处理升级的缺省设置。
项目交换文件(在本文结尾处的“下载”部分)包含一个带有订单处理组件的模块。该组件是使用一个业务流程来实现的,并具有 ApproveOrder 和 ShippingPartner 引用,这些引用带有 ApproveOrder 和 Shipping 接口。还有一个包含 ShippingService WSDL 文件的库,该文件访问合作伙伴的 Web 服务。
在 Business Integration 视图中,WSDL 文件内容(它是该 Web 服务的接口)显示为与任何其他接口一样。例如,参数类型(WSDL 消息部分)显示为业务对象。此外,还有一个对 ShippingService 接口的导入,您可以使用此接口来调用该 Web 服务。
让我们首先导入包含支持组件、接口和业务对象的项目交换文件。
- 从本文结尾处的下载部分下载 mappingexamplebegin.zip 文件。
- 单击 File - Import - Project Interchange,然后单击 Next。
-
单击 Browse,浏览到您刚才下载的
mappingexamplebegin.zip文件,然后单击 Open。此 zip 文件就是项目交换文件。 -
选中 Select All,然后单击 Finish。所导入的模块在 Business Integration 视图中打开,而且在生成项目时,您可以在工作台右下角看到
Building workspace消息。等待工作区完成生成过程。
现在该工作区已经生成,您需要使用 New Human Task 向导来创建一个人工任务以实现 ApproveOrder 接口。
- 在 MappingExample 项目下,右键单击 Business Logic 类别并选择 New - Human Task。
-
输入
ApprovalHumanTask作为名称,并将它添加到MappingExample模块。然后单击 Next。 - 将缺省设置保留为 Participating Human Task,然后单击 Next。
- 确保选中 Select an existing Interface,然后选择 ApproveOrder 作为接口,再单击 Finish。
此时将打开 ApprovalHumanTask 的人工任务编辑器。现在您可以为它设置必要的属性。
- 在 Client settings 部分,右键单击 Client settings 并选择 Add - BPC Explorer。
- 在 Escalation 部分,右键单击 Claimed,然后选择 Add - Escalation。
-
在该升级的 Properties 的 Details 选项卡中,确保对 Expected task state 选择 Finished,并对 Duration until escalated 输入
2mins。 - 保存编辑器内容。
接下来的步骤允许 OrderProcessing 组件引用新的人工任务。
- 双击 MappingExample - Mapping example 以打开组装编辑器。
- 选择 Human Tasks 类别下面的 ApprovalHumanTask,并将其拖到组装关系图上。
-
将 OrderProcessing 组件的 OrderApprovalPartner 引用连线到 ApprovalHumanTask,如图 25 所示。
图 25. MappingExample 组装关系图
观察图 25 中的组装关系图,可以看到您需要将 OrderProcessing 引用连线到 Shipping
service 导入,因为 OrderProcessing 应该调用 ShippingService。让我们看一下,当源和目标接口不匹配时,尝试创建连线会发生什么情况。
- 将鼠标悬停在 OrderProcessing 组件右侧的引用上。
- 拖动出现在 ShippingService 组件旁的控制柄。此时会打开 Add Wire 对话框。
组装编辑器检测到您在尝试将某个源连线到具有不同接口的目标。此时会打开如图 26 所示的 Add Wire 对话框,以便您可以选择创建接口映射,或者向该导入添加适当的接口。接下来的步骤将帮助您开始创建接口映射。
图 26. 对 MappingExample 组装关系图中的组件连线
- 若要关闭 Add Wire 对话框,请单击 OK。此步骤将创建一个新的接口映射,如图 27 所示。
- 双击 OrderProcessingToShippingServiceMap 以打开接口映射编辑器。
图 27. 两个组件之间的接口映射
接下来的步骤帮助您定义 OrderProcessing 和 ShippingService 接口之间的映射:
- 在接口映射编辑器中将鼠标悬停在 placeOrder 操作接口上(如图 28 所示),然后拖动出现在 shipOrder 操作旁的控制柄。
- 单击在两个接口之间创建的连接,以显示每个接口的参数。
- 将鼠标悬停在 order 参数上,并将控制柄连接到 shipTo 参数
这样就在 order 和 shipTo 参数之间创建了一个映射。缺省情况下,它是移动映射类型。然而,我们需要业务对象映射,以便能够将订单参数的属性映射到 shipTo 和 orderInfo 参数。
- 将鼠标悬停在 move 映射类型上,并将控制柄拖动到 orderInfo 参数。
- 选择 move 类型的映射并打开 Properties 视图中的 Description 选项卡。
- 将 Parameter Mapping Type 更改为 map。
- 以同样的方式,将 shipOrder 操作中的 orderNumber 参数连接到 placeOrder 操作中的 orderNumber 参数。保留移动映射类型不变。
- 保存编辑器内容。
图 28. OrderProcessingToShippingServiceMap 接口映射
您的接口映射现在应该与图 28 所示的接口映射类似。映射连接中有一个红色的“X”,这是因为还没有定义业务对象映射。接下来的步骤将创建业务对象映射。
- 在该映射的 Properties 视图中选择 Details 选项卡,然后单击 Business Object Map 旁边的 New。
-
在随后打开的 New Business Object Map 对话框中,为 Name 输入
PlaceOrderToShipOrderMap,然后单击 Next。 - 确保选择 Order 业务对象作为输入,并选择 destination 和 order 作为输出,如图 29 所示。这些类型对应于您为该映射选择的源(输入)和目标(输出)的每个参数。
图 29. 创建新的业务对象映射
- 单击 Finish。
- PlaceOrderToShipOrderMap 应该作为 Business Object Map 的设置出现。如果它没有出现,则保存并关闭接口编辑器,然后重新打开它并从列表中选择 PlaceOrderToShipOrderMap。
图 30. 设置业务对象映射
此时您已创建了一个空的业务对象映射,因此您可以将 Order 业务对象映射到 Destination 和 Order 业务对象。通过按照接下来的步骤操作,您将创建各个业务对象属性之间的映射。
- 在接口映射编辑器中双击映射类型的映射,以打开该映射的业务对象映射编辑器(如果还未打开的话)。
- 在业务对象映射编辑器中,将左侧 Order 业务对象中的 items 连接到右侧订单业务对象中的 items。这会自动创建一个子映射转换,因为两个项都是业务对象。
-
在子映射转换的 Properties 视图的 Details 选项卡中,单击业务对象映射旁边的 New,输入
ItemsMap作为名称,然后单击 Next。 -
确保为 inputs 选择 Item(带名称空间
http://MappingExample/),为 outputs 选择 item(带名称空间http://e.z.orders.com/)。 - 单击 Finish。
-
在为
ItemsMap打开的业务对象映射编辑器中,按图 31 所示连接属性。 - 保存子映射编辑器内容,并切换回到 PlaceOrderToShipOrderMap 编辑器。
图 31. ItemsMap 业务对象映射
这样就实现了子映射转换,如图 32 所示。下面我们将映射包含目的地信息的属性:
-
将 firstName 和 lastName 分别从左侧的
Order业务对象连接到右侧destination中的 firstname 和 lastname(如果还未展开,则首先展开 customerInfo)。 -
将 street、city、state 和 zip 从左侧的
Order连接到右侧destination中的 address。您将四个源属性映射到了一个目标属性。
图 32. 业务对象映射
您的映射现在应该与图 32 所示类似。请注意,当您将许多属性连接到单个目标属性时,编辑器会创建一个联接转换,并将所有目标重定向为该联接的输入(您也可以直接将源属性连接到该联接)。
对于大型业务对象,映射很快就会变得非常复杂,使得辨别哪些属性映射到哪些属性变得非常困难。业务对象映射编辑器可以帮助您,为您提供不同的映射视图。在图 32 中,转换是按目标排序的,跟踪转换的源变得非常困难,所以图 33 显示了在按源对转换排序时的映射情况。
图 33. 按源排序的业务对象转换
下一步是调整在将四个属性合并为地址属性时所发生的情况:
- 打开该联接转换的属性详细信息。
- 为 street、city 和 state 输入“, ”(逗号和空格,无引号)作为分隔符。请注意,该示例将更新,以向您展示合并属性在添加了分隔符时的情况,如图 34 所示。
图 34. 联接详细信息
大功告成。现在您可以使用下面这些步骤来测试该应用程序了:
- 切换回 MappingExample 的组装编辑器,并选择 OrderProcessing、ApprovalHumanTask 和 OrderProcessingToShippingServiceMap 组件(按住 Ctrl 键的同时单击每个组件)。
-
右键单击任何选定组件并选择 Test Components。这会打开集成测试客户端。由于没有选择
ShippingService来进行测试,所以将对它进行模拟。(ShippingService WSDL 文件所描述的 Web 服务并不实际存在。您可能希望试验那些工具并创建该 Web 服务)。如果切换到测试客户端底部的 Configuration 选项卡,您将看到Emulators下面列出的ShippingService。 - 确保对组件名称选择 OrderProcessing。
-
通过右键单击 Initial request parameters 部分的产品行并选择 Add Element,您可以向订单的产品列表添加一个
Item业务对象。 - 对于每个值字段,请输入任何值,例如图 35 所示的值,并单击 Continue。
- 当提示选择部署位置时,请选择任何 WebSphere Process Server,然后单击 OK。
图 35. 测试映射应用程序
该应用程序将部署到服务器上。最终此流程在调用人工任务的位置停止。
图 36. 等待人工任务批准
- 在 Server 视图中选择服务,从 Launch 上下文菜单中选择 Launch BPC Explorer。
-
单击 My Tasks。任务列表显示了等待完成的任务,如图 37 所示。选中该任务旁边的复选框,单击 Work on 以认领该任务。
图 37. 等待认领的任务实例列表
-
与单击该任务的 Available actions 下面的 Complete 不同,如图 38 所示,您只需等待两分钟过去以触发升级。
图 38. 完成任务
该任务现在处于已认领状态,并保持该状态,直至升级或原始任务完成。由于您已将截止升级时间的持续时间设置为两分钟,升级时将把该任务从认领状态转移到完成状态,因此在两分钟以后,您将看到该任务在升级列表中。
- 在 BPC Explorer 的左侧,单击 My Escalations。
- 单击 ApprovalHumanTask,然后单击 Work on。与图 37 所示相同的页面将显示出来。
- 单击 Complete。
然后该任务将出现,同时显示输入数据,并等待您的输入。若要返回缺省值 true,请单击 Complete。
最后会提示您为 ShippingService 导入(它是模拟的)的输出参数输入值。请注意,您在前述步骤中输入的信息已映射到 shipTo 和 orderInfo 参数,如图 39 所示。要完成该流程,请为 orderNumber 输入任何值,然后单击 Continue。ShippingService 接口的 orderNumber 参数被映射回 OrderProcessing 接口的 orderNumber 参数。
图 39. 模拟 ShippingService 导入
人工任务、接口映射和业务对象映射是对 WebSphere Integration Developer 提供的各种组件类型的有用补充。在本文中,我们介绍了人工任务的主要概念和不同类型的映射,并演示了如何在您的订单处理应用程序中使用它们。
| 描述 | 名字 | 大小 | 下载方法 |
|---|---|---|---|
| MappingExample module | mappingexamplebegin.zip | 15 KB | FTP |
| Complete MappingExample module | mappingexamplecomplete.zip | 19 KB | FTP |
学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
- WebSphere Integration Developer 指导教程,第 1 部分:WebSphere Integration Developer 概览
- WebSphere Integration Developer 指导教程,第 2 部分:使用 WebSphere Integration Developer 进行 SOA 开发
- WebSphere Integration Developer 指导教程,第 3 部分:构建面向服务的简单应用程序
- WebSphere Integration Developer 指导教程,第 4 部分:在面向服务的应用程序中利用可视化代码片段和业务状态机
- WebSphere Integration Developer 指导教程,第 5 部分:面向服务的世界中的业务流程
- WebSphere Integration Developer 指导教程,第 6 部分:使用动态业务规则来变得更加随需应变
- WebSphere Process Server 关系服务,第 1 部分: 静态关系
- Websphere Process Server 关系服务: 第 2 部分:动态关系
- How to embed a new client type into the human task editor
- Installing and starting Business Process Choreographer Explorer
- XML Path Language (XPath)
- Business Process Choreographer 示例(选择 Human Task Features 和 Interaction with Processes - Custom JSF Client)。
- WebSphere Process Server V6.0 Business Process Choreographer Programming Model(第 6.3 节:人工任务编辑器)
- 用于 Web 服务的业务流程执行语言(1.1 版)
- Business Process with BPEL4WS: Understanding BPEL4WS
- WebSphere Integration Developer 产品信息
- WebSphere Process Server 产品信息
- WebSphere Process Server:IBM 为 SOA 提供的新基础
- Build a Hello World SOA application
- 服务组件体系结构
- Common Event Infrastructure
- developerWorks:WebSphere Process Server 和 WebSphere Integration Developer 资源
- developerWorks:WebSphere Business Integration 专区
- developerWorks:WebSphere 开发工具专区
- 专家访谈: Paul Pacholski 谈 WebSphere Integration
获得产品和技术
讨论

Richard Gregory 是 IBM Toronto Lab 的 WebSphere Integration Developer 团队的一名软件开发人员。他的主要职责包括 WebSphere Integration Developer 的改进及其测试工具的交付。

Randy Giffen 是 IBM Ottawa Lab 的 WebSphere Integration Developer 团队的一名顾问软件开发人员。他负责 WebSphere Integration Developer 的业务状态机工具和可视化代码编辑器。在此之前,他曾是 WebSphere Studio Application Developer Integration Edition、Eclipse 和 VisualAge for Java 的用户界面团队的一名成员。

Jane Fung 是 IBM Canada Ltd 的一名高级软件开发人员,她负责开发 Business Process Execution Language (BPEL) 和 WebSphere Integration Developer 中的 Business Rules 调试工具。在此之前,她曾担任 WebSphere Studio Technical Support 团队的负责人。

Greg Adams 是优秀的 Eclipse 平台中用户界面首席架构师,最近又担任了核心 WebSphere Business Integration Tools (包括 WebSphere Studio Application Developer Integration Edition 和 WebSphere Integration Developer)的首席架构师和开发负责人。Greg 领导了 IBM 的第一个完整的面向服务的体系结构 (SOA) 工具组和第一个支持 Business Process Editor 的 BPEL4WS 标准的交付,这两个项目都是 IBM 的随需应变策略中非常关键的交付。