jBPM用户指南(5)

 

作者:jBPM组

版本:5.0.0

原文版权归作者所有,该翻译稿仅供学习交流使用,引用或转载请保证该部分的完整

 

 

章节6人工任务(Human Tasks)

6.1流程中的人工任务

6.1.1泳道

6.2人工任务的管理组件

6.2.1任务生存期

6.2.2任务组件链接到jBPM引擎

6.2.3启动任务管理组件

6.2.4与任务管理组件的交互

6.3人工任务管理接口

6.3.1整合Eclipse

6.3.2Web方式的任务视图

 

 

人工任务管理是工作流BPM中一个重要的方面。流程中有些工作是自动完成的,另外一些则需要与人工进行交互。jBPM在流程中使用用户任务节点来表示这种交互以支持人工任务。这种节点允许流程设计人员定义任务类型,角色,与任务相关的数据等。当然也提供了用与管理这些用户任务的服务。这是开放的,可插接的,用户也可以选择集成其他的解决方案。

 

要在流程中使用人工任务,首先需要(1)在流程定义中添加人工任务节点,(2)集成你选择的任务管理组件(如我们提供的WS-HT实现),(3)终端用户跟任务管理组件进行交互。在下面的章节中将对此进行更详细的讨论。

 

6.1流程中的人工任务

 

 

 

 jBPM支持在流程中用特定的用户任务节点来应用人工任务(如上图所示)。一个用户任务节点表示一项需要由人工角色执行的原子任务。虽然jBPM用特定的用户任务节点来表示人工任务,其实各种需要调用的实现某种工作事项的外部服务都可理解成人工任务。而用户任务节点的特别之处在于对泳道的支持,便于向用户指派任务(参考下面)。用户任务节点包含下列属性:

 Id:节点的标识(在节点容器内唯一)

  • Name:显示名称
  • TaskName:人工任务(human task)名称
  • Priority:优先级
  • Comment:注释
  • ActorId:处理该任务的角色标识,多个标识可以用逗号(",")分隔
  • Skippable:是否可以跳过该任务,任务角色可以决定是否执行该任务。
  • Content:与任务相关的数据
  • Swimlane:该任务所属泳道的名称。使用泳道可以方便地将多个任务指派给相同的角色。参考人工服务章节了解泳道更多的细节。
  • Wait fro Completion:如果该属性为真("true"),人工任务节点将等待任务终止(完成或者其他结束状态),否则在创建任务之后立即向后执行。
  • On-entry及on-exit动作:在进入或者离开节点时执行的动作
  • Parameter mapping:从流程中复制变量作为参数传递给任务。
  • Result mapping:结果映射。任务完成之后复制结果到流程变量中。变量"Result"包含返回的数据,变量"ActorId"包含执行该任务的角色标识。
  • Timer:与该节点相连的计时器(详细信息参考计时器一节)
  • ParentId:允许指定父任务标识,当前任务作为子任务存在(详细信息参考子任务"sub task"一节)

选择用户任务节点可以在属性视图中编辑这些变量,或者双击节点,将打开定制的节点编辑器,如下所示:

 

 

 

 即可以直接为这些属性赋置常量值(在运行期保持不变),也可以设置与实例上下文相关的可变值。比如用#{expression}将值嵌入到字符串中,在创建工作事项时将获取该表达式的值然后进行替换。表达式可以是简单的变量名(解析时获取该变量的值),也可以是高级的MVEL表达式如#{person.name.firstname}。譬如,在发送邮件时,正文中可以包含"Dear #{customer.name},..."这样的字符串。对于其他类型的节点,可以用参数映射方式将变量映射到参数。

 

6.1.1泳道

 

用户任务节点可以与泳道配合使用实现在多个人工任务分配给同一类角色。同一泳道中的任务将指派给相同的角色。在泳道中创建第一个任务时,该任务对应的角色将与所在的泳道关联,再在泳道中创建其他任务时则会使用关联角色而不管是否为任务指定了角色。

 

泳道内的任务完成时将自动将执行任务的角色设置到泳道上。举例来说如果把人工任务指派给一组用户,该泳道中的后续任务将使用与第一个任务相同的用户。如果任务重新指派给了其他用户则其他任务的指派将自动更改。

 

向泳道中添加任务只要把任务节点的"Swimlane"属性值设置为所要泳道的名称即可。流程需要定义所用到的泳道,在定义的背景上双击打开属性窗体,选择"Swimlane",录入新的泳道。

 

6.2人工任务的管理组件

 

在jBPM引擎中人工任务跟其他的外部服务一下需要作为工作事项实现、调用,流程只拥有所需执行的人工任务的一个抽象描述,及一个与具体实现绑定的事项句柄。使用这种可插接的工作事项句柄,用户可以接入任何后台实现。

 

我们提供了一个基于WS-HumanTask规范的人工任务管理组件的实现,如果你不想自己做,可以直接调用这个服务。这个服务将管理任务的生存期(创建、认领、完成等),保存任务的持续性状态,也支持像国际化,日历集成,任务指派、委托、时限等特性。

 

我们不想在现有标准之外再实现一个特殊的方案,因此选择基于WS-HT规范来实现我们的服务。这个规范定义了任务模型的细节,如生存期,以及上面提到的许多特性,所涵盖的范围是很广泛的。(查看规范)

 

6.2.1任务生存期

 

从流程的角度看,在实例到达一个用户任务节点时将创建一项人工任务,流程将等待该任务的完成或者取消(除非你设置"Wait for completion"属性为false,明确流程不需要等待)。另一方面,人工任务通常也有其独立的生存期。下面将简短地介绍这个生存期,如下图所示。更多的细节信息可以参考WS-HumanTask规范。

 

 

 

 任务创建之后,它的状态是"Created"。一般它的状态将自动转换到"Ready",在所有允许办理该任务的用户的任务列表中都将显示该任务。之后它将等待某一角色用户认领,表示他/她将执行该任务。一旦有用户认领,状态将切换至"Reserved"。如果一个任务只有一个角色用户可以处理,那在任务创建时将自动指派给该用户。认领任务之后用户开始执行,此时状态将变成"InProgress"。最后,执行完毕需要结束该任务(指定返回数据给任务),这时状态变成"Completed"。如果任务无法完成,用户可以给出一个错误响应(包括错误数据),此时状态是"Failed"。

 

上面解释的是一个正常的生存期,服务也允许其他的一些方法,诸如:

  • 委托或者向前分发任务,此时任务将指派给其他角色。
  • 撤回任务,用户放弃认领,任务重新出现在可处理角色的任务列表中。
  • 临时挂起/恢复任务。
  • 处理中停止任务。
  • 跳过任务(允许跳过),将不再执行该任务。

6.2.2任务组件链接到jBPM引擎

 

 像其他外部服务一样,任务管理组件需要与jBPM引擎集成,这可通过注册负责将抽象工作事项(这里是指人工任务)传递给特定调用的事项句柄来完成。我们已经实现了这样的事项句柄(在jbpm-human-task模块中的org.jbpm.process.workitem.wsht.WSHumanTaskHandler),你可以轻松的使用:

 

 

 

 默认情况下,这个句柄将在本机的9123端口与任务管理组件连接,也可以调用WSHumanTaskHandler.setConnection(ipAddress,port)更改。

 

如果你应用了会话的持续性(参考关于持续性的章节),可在与引擎交互后使用org.jbpm.process.workitem.wsht.CommandBasedWSHumanTaskHandler来检查流程实例状态有没有正确被持续化。

 

 人工任务服务与引擎及其他任务客户端之间的通讯用服务器/客户端之间消息传递的方式进行。现有的实现允许不同的传输机制以插件方式接入,默认是Mina(http://mina.apache.org/),HornetQ是另外一种选择。

 

 任务客户端提供了以下方法管理人工任务生存期:

 

 你可以直接调用这些方法,也可以以GUI方式提供给终端用户,便于查找、执行指派给他们的任务。浏览一下这些方法的原型,你会发现都带有以下的参数:

  •  taskId:需要处理的任务标识。
  • userId:执行操作的用户标识。
  • responseHandler:与任务服务进行异步通讯,当返回值可用时响应句柄将获得通知。

 你可以想象一下,方法向服务端发送消息,服务端则根据执行实现正确逻辑的操作。

 

6.2.3启动任务管理组件

 

任务管理组件是一个非常独立的服务,因些我们建议以独立服务的方法启动它。安装程序包括一个启动任务服务的命令(在传输协议层使用Mina),也可以用以下代码启动:

 

 

 任务管理组件使用Java Persistence API(JPA)保存全部任务信息,因些需要正确修改配置文件 persistence.xml。下面的片段显示如何将任务管理组件与hibernate及内存数据库H2结合起来使用。

 

 首次启动任务管理组件时,需要保证数据库里已经添加了必要的用户与组。我们的实现要求在指派任务之前已经预定义好了用户及组。可以使用taskSession.addUSer(user)、taskSession.addGroup(group)方法向数据库添加。至少需要一个"Administrator"用户,这样所有任务将自动指派到作为管理员角色的这个用户。

 

jbpm-human-task模块的src/test/java目录中包含一个org.jbpm.task.RunTaskService类,可以用它来启动任务服务器。它将自动添加定义在LoadUsers.mvel和LoadGroups.mvel配置文件中的用户与组。

 

6.2.4与任务管理组件的交互

 

任务管理组件以Java API的方法提供了多种管理任务生存期的方法,允许客户端(在底层)集成任务管理。正确的做法一般是避免终端用户直接调用这些底层API而是用一个任务列表客户端替代。这些客户端使用所提供的API与管理组件交互。下面的代码演示了如何创建一个与任务服务交互的客户端,用来创建、启动、完成任务。

 

 

 

 

 

 6.3人工任务管理接口

  

6.3.1整合Eclipse

 

Drools IDE包含了一个名为org.drools.eclipse.task的插件,可供你用人工任务来测试/调试流程。插件里面包含一个连接到当前正在运行的任务管理组件的人工任务视图,可以呈现某一用户的相关任务(可以认领,已经认领,正在执行的任务)。也可以改变任务执行状态,比如认领或发布任务,启动或停止执行任务,以及完成任务等。下面是该视图的截图。可以在Drools Task 首先项页中配置要连接到哪个任务管理组件(选择 Window->Preferences 然后选择Drools Task)。可以设置url及端口(默认为127.0.0.1:9123)。

 

 

 

 

6.3.2Web方式的任务视图

 

 

 jBPM控制台也包含了一个任务视图可以查找并管理任务。参考jBPM控制台章节了解更多信息。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值