Human Task是IBM最新推出的WebSphere Integration Developer所提供的重要功能,它通过剥离传统UI界面上的输入与输出操作,为面向服务架构下的人机交互赋予了更加丰富的内容。在实现基于角色的任务分配基本功能的同时,Human Task还能够帮助企业管理人员实时获悉业务活动执行情况。本文首先从概念层面对于Human Task的问题背景和基本特征作了详细介绍,接下来结合一个汽车贷款的实例介绍了如何在WID中开发Human Task。希望通过这篇文章,能够帮助开发人员能够更好的理解和使用Human Task。
1. 问题背景
面向服务的体系结构(SOA)是IT业界提出的一种新的企业应用集成解决方案,其核心思路在于强调整合与重用,整合的对象包含信息、人员和流程等。WID(WebSphere Integration Developer)作为IBM提供的下一代的开发工具,提供了多种手段来帮助开发人员基于现有IT环境更好的构建新的业务系统,从而为创建主动实时的企业奠定良好的基础。Human Task是WID在人员整合方面的具体体现,它起源于BPEL1.0(Business Process Execution Language)规范中所定义的Staff活动。从传统视角来看,人员与IT系统的交互主要集中于输入与输出界面,用户在UI界面上输入业务数据,系统执行特定的业务逻辑然后将计算结果返回给用户,这样就构成了一个完整的交互场景。但是,SOA的一个重要承诺就是实现 业务(Business)与技术(IT)的无缝对接,管理人员需要从IT的角度获得更多业务活动监控的信息。所以SOA环境下的人员整合还需要某些更高级的功能,比如实现基于角色的任务分配,在活动出现问题时及时通知更高级别的管理人员,支持决策制定的回避规则等。针对这些问题,IBM与SAP在BPEL规范的基础上联合提出了一套BPEL4People的扩展规范,它在原有Staff活动的基础上为诸多高级特征提供了支持,如角色解析、活动调升与回避规则等。Human Task是IBM在WID中为BPEL4People规范提供的具体实现,它支持规范所定义的所有概念,为在业务流程中更好的集成人员活动提供了良好的手段。
WID中的Human Task在中间件支撑层面为人员集成提供了如下功能:首先,它定义了一套完整的角色解析模型,从而为基于角色的任务分配奠定良好基础;其次,它支持多通道的访问方式,由于Human Task以Web Service的形式暴露,用户能够使用多种访问手段来访问系统功能;最后,Human Task还提供了某些高级的功能,如在活动执行在时间上出现延迟时能够自动为管理人员发送通知等。本文结合一个汽车贷款的实例介绍了Human Task的基本概念与应用场景,整篇文章主要包含以下内容:第二节描述了一个具体的汽车贷款业务场景,其重点在于说明我们为什么需要Human Task;第三节说明了Human Task所包含的基本概念,如生命周期、角色解析和活动调升等;第四节结合前面的业务场景介绍如何在WID中实现Human Task;最后一部分是结束语。希望通过本文的介绍,能够帮助读者理清Human Task概念的脉络,了解基本的实施步骤,从而为在项目中正确的选择和使用Human Task奠定良好基础。


|
回页首 |
|
2. 业务场景
本文的业务场景是基于一个购车贷款的审批流程。某银行最近开展了一项购车贷款的新业务,该行的高层管理人员要求信息中心主任在短时间内从技术层面上为该业务的运营提供支撑。在经过与业务人员的反复讨论后,该项目的技术经理终于确定了整个购车贷款审批的基本步骤(如图1所示):首先是客户提交相关的申请材料,启动整个汽车贷款申请流程。系统首先需要验证客户资料的真伪,如身份信息等。如果上一步成功完成,系统进入客户资信评估与欺诈评估阶段。资信评估用于调查用户的资产情况和信用状况,欺诈评估则用于检查用户是否存在骗贷的可能性,其评估标准包括是否在短时间内多次提交贷款申请等。资信评估是一个非常重要的业务活动,评估结果的正确与否不仅涉及到贷款是否能够被收回,而且决定了整个分行的收支情况和不良贷款率。如果资信评估和欺诈评估通过,整个流程自动进入业务经理审批的阶段。业务经理需要根据分行整体业务情况,以及某些业务政策(如银根紧缩)来决定是否批准该贷款请求。
图1:汽车贷款申请的业务场景
在完成基本的汽车贷款业务功能的同时,信息中心主任还希望汽车贷款系统未来能够达成如下的目标:首先是多通道的访问方式,即不仅支持业务人员在营业大厅为客户办理相关手续,而且支持客户在网上自助提交贷款请求;其次是及时的报警消息。为提高客户的满意度,整个贷款流程需要在特定的服务时间内给客户答复,所以流程中人工活动的执行时间需要满足预先设定的条件。当超过预先设定的服务目标时,系统需要自动为管理人员发送报警消息;最后是基于角色的任务分配,当贷款请求到来时需要为相关业务人员创建工作条目。很明显,在传统的J2EE实施环境下,以上功能的实现都需要开发人员编写特定的代码。Human Task从中间件层面上为以上功能提供了支持,下面我们来看概念的细节。


|
回页首 |
|
3. 基本概念
Human Task脱胎于BPEL规范第一版中的Staff活动。从本质上来看,BPEL1.0规范规约了Staff活动的应用场景、使用语法和语义内容,但是它只是试图提供一种在流程中集成业务人员的手段,而没有进一步的规定人工活动实现的具体内容。BPEL4People规范弥补了这一差距,它将Human Task划分为不同的类型,规约了人工活动运行时刻的生命周期与角色解析模型,并引入了诸多高级特征,如回避规则、调升和授权等。本节详细介绍了Human Task的概念模型,希望能够帮助读者从概念层次上掌握Human Task具体的内容。需要指出的是,本节内容的介绍并不局限于BPEL4People规范,而是针对WID中所提供的Human Task的实现。
3.1 活动类型
活动类型的划分通常是基于不同的维度。按照调用角色关系的不同,Human Task可以划分为:参与任务(Participating Task)、发起任务(Originating Task)和纯粹的人工任务(Human Task)三类。参与任务又被称为M2H任务 (Machine-to-Human),即业务人员提供了服务接口实现,可以认为是机器在调用人。发起任务是一种常见的使用场景,人通过输入特定的业务参数,调用系统的业务逻辑并获取计算结果,此时是人在调用机器,所以发起任务又可以被称为H2M任务(Human-to-Machine)。纯粹人工任务则是一种单纯的人调用人的服务,它拥有两种基本的参与角色:服务请求者与服务提供者。服务请求者为服务提供者创建待处理任务,服务提供者提供了该服务接口的具体实现,所以人工任务被称为 H2H任务 (Human-to-Human)。以上三种类型的业务活动都是从使用的角度来定义Human Task,从管理的角度来看,还存在一种额外的任务类型:管理任务,其主要功能是管理人工任务的生命周期,如终止和删除人工任务实例的执行等。
另外一种划分方式是按照实现方式的不同,Human Task可以被划分为独立任务(Standalone Task)和内置任务(Inline Task)两种。独立任务是指独立于任何流程的人工任务,它在WID中实现标准的SCA构件。当独立任务被其他类型的SCA构件(如BPEL流程)调用时,通常是采用异步调用的方式,而且开发人员需要在部署图中显式绑定该任务。内置任务则通常被实现为BPEL流程中的Staff活动,此时该人工任务只能被该流程所使用。两种不同类型的Human Task在能力上是存在差距的,独立任务能够为系统实现提供较好的复用性和弹性,而内置任务则能够让开发人员访问流程的上下文信息。由于独立任务被实现为SCA构件,所以它不仅能够被BPEL流程所调用,也能够被其他类型的SCA构件所使用,同时,由于独立任务是标准的SCA构件,当其实现方式变化为其他类型的实现(如基于规则的实现)时不需要修改调用者的代码,从而使系统达到较好的复用性与弹性。而内置任务则能够访问流程运行的上下文信息,如流程启动者和特定活动的拥有者等。这些环境信息对于独立任务是不可获得的,其主要的原因在于容器在执行标准的SCA调用很难直接将这些上下文信息传递给任务管理器。需要注意的是,独立任务只能是参与任务、发起任务和纯粹的人工任务三种类型,而内置任务则只能是参与任务、发起任务和管理任务。
3.2 生命周期
Human Task的生命周期不仅决定了用户在每一阶段所能够执行的操作,而且决定了人工服务管理器运行时刻的实现细节。从高层来看,Human Task实例从创建到销毁要经过如下阶段:准备(ready)、声明(claimed)、完成(completed)或失败(failed)。当任务被创建,但是潜在的任务拥有者还没有声明该任务时, Human Task所处于的状态为ready。接下来,潜在的任务拥有者之一使用claim操作显式声明该任务由其处理,此时的Human Task实例进入申明状态,声明者的身份也随之变为任务拥有者。随后,任务拥有者输入相关的业务数据,调用complete操作完成该任务实例,则Human Task的状态转化为完成。如果任务执行中间存在异常,则进入失败状态。从实现的角度来看,由于Human Task通常执行异步调用,所以其信息需要持久化至数据库,每一种状态对于运行环境而言不过是一种标志位,但是管理器需要针对当前状态校验用户操作的合法性。
3.3 角色解析
角色解析解决了用户访问授权的问题。WID所提供的Human Task角色解析模型主要包含三个部分:用户角色类型、查询模版和流程环境变量。从较高的层次来看,角色类型大致可以划分为流程启动者、流程参与者、活动潜在拥有者和流程管理者等。流程启动者是创建特定流程实例的用户,它通常是针对整个流程来配置。流程参与者则是指能够参加到流程运行过程的用户,参与者可以做进一步的划分,如读者只能察看特定流程或活动的状态信息,而编辑则可以修改相关的任务数据。活动的潜在拥有者圈定了能够声明和完成某一特定任务的用户角色集合,在活动被声明之前,每一个潜在的拥有者都包含相同的权限,如果其中某一个用户执行了声明操作,则其身份会由潜在的拥有者转化为真正的活动拥有者。流程管理者则是相对于整个流程实例而言,它能够针对特定流程执行相关的管理操作,如终止或删除流程实例等。需要注意的是,所有的用户角色都是预先定义的,每一种角色都代表了具有特定权限的用户集合。
查询模版是WID所提供的角色解析模型的核心内容,它的一个重要特点是支持按照角色属性确定用户的集合。从实现的层面来看,每一个查询模版都提供了一条参数化的查询语句,如"Users by user Id"的语义是按照用户ID查询相关用户。在运行时刻,Human Task管理器按照查询模版的定义以及开发人员输入的属性参数,从用户注册仓库中获取潜在的用户列表。当业务人员位于该用户列表内时,管理器会授予该用户相关的访问权限,否则,管理器将会拒绝该用户的访问。查询模版不同于用户角色的定义,WID提供了相关的扩展机制,如允许开发人员定义按照用户电子邮件地址查询用户等。另外,Human Task管理器还提供了若干预定义的环境变量,如%wf.process.starter%和%wf:activity(activity_name). potentialOwner%等,前者表示流程启动者,后者表示某一个活动所有潜在拥有者用户列表。在汽车贷款流程中,一个重要的需求是贷款批复人员必须是风险评估人员的经理,而不能是其他部门的经理,所以管理器需要从流程实例运行环境中取出风险评估活动拥有者身份。此时环境变量就较好的解决了该问题,开发人员需要将查询模版设定为Manager of Employee,而在输入参数栏填入%wf:activity('Evaluate Credit Risk').owner%。从本质上来看,环境变量的使用使得开发人员能够在运行时刻动态建立逻辑角色与物理用户之间的绑定关系,从而为角色解析提供了更强大的功能。
由于用户解析是整个Human Task框架中非常重要的内容,下面我们将通过汽车贷款审批的实例来说明Human Task管理器是如何来解析用户角色的。如图2所示,开发人员首先需要为贷款审批活动指定潜在拥有者的查询模版,即用户注册表中所有隶属于Approvers组的用户。接下来,Human Task管理器会按照设定构造特定的查询语句,然后从用户注册仓库中选择所有合法用户,最后确定所有潜在拥有者为Tom。如果此时操作人员拥有Tom 的证书,则允许用户执行声明操作,否则管理器将拒绝用户的请求。
图2:用户角色解析过程
3.4 高级特征
在以上基本功能之外,BPEL4People规范还提供了诸多高级的特征,如回避规则、任务调升、任命、子任务和附加任务等。这些高级功能用于帮助管理人员更好的监控企业业务活动,识别企业运营活动中存在的问题,从而在业务与技术之间建立更好的对接。由于当前WID只为回避规则和任务调升提供了支持,所以本文讨论的范围也局限于这两种特征。
3.4.1 回避规则
回避规则也被称为"4-eyes principle",用形象的语言来描述,就像是有四只眼睛同时盯在一件事件上,通过多人合作达到最优决策的目的。回避规则的使用通常是出于风险规避的目的。在某些特定的行业里面(如金融业或医疗业),有些重大决定的做出需要两个独立的业务人员同时做出决定。在我们前面提到的汽车贷款实例中,在严格的情况下,为规避内部腐败的风险,贷款授予的决策可能同时需要两个信贷专员来评估客户的信用和欺诈风险,并做出决策。在极端的情况下,这两个独立的人甚至完全不知道对方的身份。WID通过定义特殊的查询模版,可以帮助开发人员实现回避规则。
3.4.2 任务调升
任务调升是指在某些异常的情况下如果业务活动无法正常完成,系统会自动提升任务的处理级别,从而使得更高级别的管理人员能够干预活动的执行。从某种意义上来看,人工活动是对于物理世界中业务操作的抽象,将人工活动从传统的UI实现中剥离,一个重要的好处就在于能够为人员与计算机系统的交互提供更加丰富的操作语义,使得管理人员能够及时地发现当前业务运行过程中存在的问题,并做出有效的反应。比如,在某一笔业务的执行时间超过了该活动预先设定的时间值的情况下,系统能够通过email或是即时消息的方式自动为更高级别的业务人员发送预警消息,从而能够使得管理人员实时获悉企业运营状况,并做出相应调整。WID为任务调升提供了直接的支持。


|
回页首 |
|
4. 实例分析
本节将结合汽车贷款流程说明如何使用WID来创建Human Task。汽车贷款流程所包含的人工活动主要是风险评估和经理审批两个活动,由于二者实现步骤非常类似,所以本节将主要针对风险评估来说明。同时,由于本文的目的在于说明如何使用WID开发Human Task,所以其他的内容(比如如何在WID中创建新的SCA模块,如何为SCA模块建立部署视图等,如何创建业务规则等)将会被省略,有兴趣的读者可以参考后面附录所列的文章。
4.1 创建新的Human Task
前面已经提到,Human Task按照使用环境可以分为独立任务和内置任务两类。在创建新的人工任务时二者所采取的步骤是不一样的。独立任务是一个单独的SCA构件,流程使用标准的SCA调用来访问,所以需要在模块中先创建一个新的Human Task,然后在流程中使用invoke活动来访问。内置任务的创建方式则非常类似于WBISF5.1中的Staff活动,开发人员从活动面板中拖入人工活动图标,选择相应的接口,并设置相关属性。本文采用内置任务来实现风险评估活动,下面是详细的创建步骤。需要注意的是,以下步骤是在创建模块CarLoanModule以及流程CarLoanProcess之后开始,前面的创建过程不再详述。
1) 为CarLoan模块中创建一个新的接口,将其命名为CreditEvaluationService,该接口包含的唯一的操作是evaluate(),其输入参数和输出参数类型均为LoanApplication。LoanApplication是我们之前创建的一个业务对象类型(Business Object)。
图3:创建风险评估服务接口
| XML error: The image is not displayed because the width is greater than the maximum of 572 pixels. Please decrease the image width. |
2) 从活动类型面板拖入一个新的Staff活动到现有购车贷款流程中,将其命名为Evaluate Credit Risk,该Staff活动就是我们所需要的Human Task;
图4:创建信用风险评估业务活动
3) 选择新创建的Human Task,打开屏幕下方属性视图中的details标签,为Human Task选择合适的接口。点击面板中的New…按钮,屏幕上弹出接口选择对话框。选择我们之前创建的CreditEvaluateService接口,并选择接口所包含的evaluate操作;
4) 点击details面板下方的User Data Type Variables单选框,激活变量设置表格,我们将该人工活动的input和output均设置为以前创建的流程变量LoanApplication。如果不要求实现基于角色的任务分配和任务调升等功能,以上步骤就创建了一个最简单的Human Task。
图5:选择风险评估活动所对应的接口
5) 选择整个流程的属性视图,在Process is long-running的单选框前打勾,表示该流程由于包含人工活动,运行时间较长,需要在数据库中存储流程的状态。
在以上步骤完成后,资信评估人工服务就被成功的加入到整个流程中,但是,由于当前的实现还缺乏相关的安全设置,任何人都可以冒充信贷专员来评估客户的信用风险,在流程出现问题时也无法及时通知高层管理人员,下面将逐步解决这些问题。
4.2 为资信评估活动指派访问角色
角色指派为Human Task定义了用户授权模型。前文已经提到,流程活动允许定义四种角色类型:管理者、潜在拥有者、编辑和读者,每一种角色都拥有不同的资源访问权限。由于四种角色定义的过程类似,所以本节只针对潜在拥有者讨论。
6) 选择Human Task编辑器中Staff Setting下方的Potential Owner条目,在属性视图中打开Verb标签(如果编辑器中没有Potential Owner条目,开发人员需要手动添加);
7) 选择相关的查询模版(verb),通常较为常见的模版包括按照用户名称查询用户集合和按照小组名称查询用户集合。为资信评估活动选择Users查询模版。需要注意的是,每一种User Registry所支持的查询模版类型是不一样的,如果使用WPS缺省提供的User Registry,则只支持按照用户名和小组名查询,如果使用LDAP作为User Registry,则能够支持非常丰富的查询类型,如按照用户ID查询其经理等。
8) 在查询模版下方的参数框内输入相关的查询参数,这里只需要输入一个合法用户名称。不同的查询模版所需要的参数是不一样的,如果开发人员选择的是按照用户名称查询,则需要输入用户名,如果选择的是按照小组名称查询,则需要输入小组名。
图6:设置角色解析模型
以上步骤完成后,Human Task的用户解析模型就已经被设定,Human Task管理器在运行时刻会自动调用相关功能来确定用户是否拥有相关的权限。特别需要注意的是,如果需要执行安全认证,必须要将服务器的安全选项打开,否则所有的角色解析设置都是无效的。关于如何开启WPS的安全功能的问题,读者可以参考WPS信息中心。
4.3 设置通知与调升
任务调升用于解决在人工任务执行超时的问题。如果Human Task的执行时间超过了开发人员预先设定的时间值,系统需要自动提升任务处理级别,并向相关管理人员发送通知。本节介绍了如何为Human Task设置调升选项。
9) 打开信用风险评估Human Task 编辑器。在Escalation Settings下方的Ready状态添加一个新的调升条目。该条目代表了从活动进入ready状态开始,到某一个特定的终止状态预期所需要的时间。
10) 打开刚刚创建的Escalation的属性视图,选择Details标签,按照下面的说明设置相关属性:将Expected task state设置为finished,同时将Duration until escalated属性设置为2hours,表明我们预期从该任务开始到任务结束所花费的总时间为2个小时,如果不满足这一条件,则触发相关的预警动作。
11) 设置Notification Type为work item,表明当活动被触发时,系统会自动为管理人员创建一个工作条目。如果选择e-mail和event则会分别发送电子邮件和创建消息。
12) 选择Escalation属性视图中的Verb标签,设定查询模版为Users,同时输入合法的用户ID,从而完成当异常触发时所通知的用户。这一步的设置非常类似于角色指派的步骤,具体的细节不再赘述。
图7:为人工任务设置调升功能
4.4 编写客户端访问代码
客户端访问人工任务的代码主要通过Human Task 管理器所提供的API。HTM能够帮助开发人员查询、声明和完成Human Task,具体的实现步骤如下:
13) 将开发环境切换至Web Perspective,我们可以看到开发工具会自动生成若干的J2EE项目,包括CarLoanModuleEJB、CarLoanModuleWeb和CarLoanModuleEAR等。这些项目将作为部署项目直接运行于应用服务器。
14) 在CarLoanModuleWeb中创建一个新的JSP文件test.jsp,并输入表1中的代码。客户访问和HTM API的方式实际是通过标准的EJB调用,首先客户会试图从JNDI中获取一个远程对象引用,然后调用相关的操作来完成功能。详细的BPE API接口规约和HTM API接口规约读者可以参照WID自带的帮助文档,本文不再赘述。WID还支持客户端为BPC Explorer或是Portal,从而使得开发人员能够更容易的访问人工任务。
表1:Human Task服务接口访问代码示例
try {
// obtain the default initial JNDI context
Context ctx = new InitialContext();
// lookup the remote home interface of the HumanTaskManager
Object result = ctx.lookup("java:comp/env/ejb/HumanTaskManagerHome");
// convert the lookup result to the proper type
HumanTaskManagerHome humanTaskManagerHome =
(HumanTaskManagerHome)javax.rmi.PortableRemoteObject.narrow(
result, HumanTaskmanagerHome.class);
if(humanTaskManagerHome != null) {
HumanTaskManager humanTaskManager = humanTaskManagerHome.create();
// list the tasks belonging to a logged-on person
// that are ready to be worked on
QueryResultSet result = humanTaskManager.query(
"TASK.TKIID",
"TASK.STATE = TASK.STATE.STATE_READY AND " +
"TASK.KIND = TASK.KIND.KIND_PARTICIPATING AND " +
"WORK_ITEM.REASON = WORK_ITEM.REASON.REASON_POTENTIAL_OWNER",
null, null, null);
// claim and complete the task
……
}
else System.out.println("Could not find the ejb reference in jndi");
} catch(Exception e) {
e.printStackTrace();
}
|
4.5 使用BPC浏览器测试业务流程
BPC浏览器为测试业务流程的正确性提供了非常好的工具,它不仅能够让开发人员启动流程实例,也能够让开发人员完成流程中所包含的Human Task,所以BPEL流程的单元测试通常是使用BPC浏览器来完成。下面是详细的测试步骤:
15) 打开服务器视图,右键选择服务器列表中的WebSphere Process Server测试环境(需要在安装WID时选择安装),选择启动服务器。此时开发环境将会自动切换至控制台视图,开发人员可以从中察看服务器启动过程中所输出的日志信息。
16) 在服务器启动完毕后,在服务器视图中选择已启动的服务器,打开环境菜单,点击Launch选项下的BPC Explorer,启动BPC浏览器。此时,开发环境主窗口中将会出现我们所需要的测试界面。
图8:启动流程实例
| XML error: The image is not displayed because the width is greater than the maximum of 572 pixels. Please decrease the image width. |
17) 选择功能列表中的Process Template,察看当前可用的流程模版。此时,界面上应该会出现CarLoanProcess。如图6所示,选择CarLoanProcess流程,点击Start Instance按钮,进入流程启动界面。在出现的界面中输入参数,点击启动按钮,启动流程实例。
图9:输入调用参数启动流程
18) 选择功能列表Task Instances下的My Tasks,界面上应该出现一个等待处理的风险评估活动。选择该活动,点击Claim按钮,声明该活动为自己所有。然后再次选择该活动,点击Complete按钮,进入活动完成页面。在界面上输入相关的参数,点击完成。需要注意的是,由于我们为流程指定了潜在所有者,在开启服务器安全性的情况下,必须以相应的身份登陆才能看到待处理工作事项。如果没有开启服务器安全性,则只有管理员才能看到该工作事项。
图10:完成风险评估人工活动
| XML error: The image is not displayed because the width is greater than the maximum of 572 pixels. Please decrease the image width. |
19) 最后一步是经理审批,其过程与上一步类似。在所有的活动完成后,流程实例的状态将会变为finished,表示整个流程已经被成功完成。


|
回页首 |
|
5. 结束语
Human Task是WebSphere Integration Developer所提供的重要功能。从上面的介绍可以看出, Human Task为传统的人机交互提供了更加丰富的内容。在实现基本输入输出功能的同时, Human Task还能够实现基于角色的任务分配以及通过调升帮助管理人员实时监控业务运营状况,从而更好的使得企业能够更好的整合人力资源和为顾客提供更好的服务。希望通过本文的介绍,能够帮助开发人员更好的理解和掌握Human Task,并能够在未来的项目中付诸实践。 |