JBPM3的任务分配方式主要由以下几种:
(1)直接设置actor-id属性,既可以设置固定的任务处理人,如actor-id='dinguangx'(这种情况在实际开发中极少用到的吧);也可以从流程变量中取出任务处理人,如actor-id="#{actorid}".
(2)通过TaskInstance实例直接调用API方法设置,如ti.setActor("dinguangx");;
(3)通过AssignmentHandler在任务创建的时候分配任务;这是最为常用的一种方式,也是最灵活的一种任务分配方式,可以在任务分配的时候做一些其他的操作;
(4)通过Swimlane的方式分配任务.通过第(3)种方式来分配任务时,虽然灵活,但是如果要将多个任务分配给同一个处理人时我们不得不编写多个handler类,造成java类的过度膨胀;这时候就可以通过Swimlane的方式来分配任务,多个相同处理人的Task结点只引用定义好的Swimlane就可以完成任务分配。
这里主要来分析一下使用Swimlane来实现任务分配的过程。
TaskInstance类中的assign(ExecutionContext)方法实现了任务的分配,下面的这段代码取自于TaskInstance类的源码.
public void assign(ExecutionContext executionContext) {
TaskMgmtInstance taskMgmtInstance = executionContext.getTaskMgmtInstance();
Swimlane swimlane = task.getSwimlane();
// if this task is in a swimlane
if (swimlane!=null) {
// if this is a task assignment for a start-state
if (isStartTaskInstance()) {
// initialize the swimlane
swimlaneInstance = new SwimlaneInstance(swimlane);
taskMgmtInstance.addSwimlaneInstance(swimlaneInstance);
// with the current authenticated actor
swimlaneInstance.setActorId(SecurityHelper.getAuthenticatedActorId());
} else {
// lazy initialize the swimlane...
// get the swimlane instance (if there is any)
swimlaneInstance = taskMgmtInstance.getInitializedSwimlaneInstance(executionContext, swimlane);
// copy the swimlaneInstance assignment into the taskInstance assignment
copySwimlaneInstanceAssignment(swimlaneInstance);
}
} else { // this task is not in a swimlane
taskMgmtInstance.performAssignment(task.getAssignmentDelegation(),
task.getActorIdExpression(),
task.getPooledActorsExpression(),
this,
executionContext);
}
updatePooledActorsReferences(swimlaneInstance);
}
我们假设当前任务不是位于Start-state中,并且使用Swimlane的任务分配方式,即task.getSwimlane()不为空,且isStartTaskInstance()为false的情况。
此时,代码将执行到
swimlaneInstance = taskMgmtInstance.getInitializedSwimlaneInstance(executionContext, swimlane);
再来看一下getInitializedSwimlaneInstance(ExecutionContext)方法执行的是什么工作:
public SwimlaneInstance getInitializedSwimlaneInstance(ExecutionContext executionContext, Swimlane swimlane) {
// initialize the swimlane
if (swimlaneInstances==null) swimlaneInstances = new HashMap();
SwimlaneInstance swimlaneInstance = (SwimlaneInstance) swimlaneInstances.get(swimlane.getName());
if (swimlaneInstance==null) {
swimlaneInstance = new SwimlaneInstance(swimlane);
addSwimlaneInstance(swimlaneInstance);
// assign the swimlaneInstance
performAssignment(swimlane.getAssignmentDelegation(),
swimlane.getActorIdExpression(),
swimlane.getPooledActorsExpression(),
swimlaneInstance,
executionContext);
}
return swimlaneInstance;
}
这个方法位于TaskMgmtInstance类中,而一个流程实例只对应一个TaskMgmtInstance实例,所以taskMgmtInstance实例中的swimlaneInstances将会包括流程实例中创建过的所有Swimlane实例。所以在getInitializedSwimlaneInstance方法执行时,如果任务是第一次被创建,将会根据设置的Swimlane创建一个新的SwimlaneInstance实例;否则就会在数据库中查询之前创建好的TaskInstance记录映射成TaskInstance对象返回给上一级调用过程。
再返回到assign()方法,紧跟着的处理代码是
copySwimlaneInstanceAssignment(swimlaneInstance);
下面是copySwimlaneInstanceAssignment方法的代码:
public void copySwimlaneInstanceAssignment(SwimlaneInstance swimlaneInstance) {
setSwimlaneInstance(swimlaneInstance);
setActorId(swimlaneInstance.getActorId());
setPooledActors(swimlaneInstance.getPooledActors());
}
很容易理解,就是将SwimlaneInstance中的actorId,pooledActors分配给当前任务。
注意到这里就存在一个问题,如果Task结点相应的任务不是第一次被创建,就不会再调用Swimlane的AssignmentHandler类来创建SwimlaneInstance。换句话说,Swimlane的AssignmentHandler类将只会被调用一次,而不是被多次调用,所以当流程用到Swimlane时(比如流程被审核退回再次提交审核时,审核结点就被多次执行到),AssignmentHandler类只执行一次,我们就不能在Swimlane中做额外的其他操作。比如,现在想把任务处理的URL设置在任务变量中,这个操作在AssignmentHandler类中进行;此时就会发现,当流程再次到达此结点时,任务变量中没有我们需要的值。原因也正在于此。
所以,更准确地说,普通的AssignmentHandler方式每次都选择任务处理人,而Swimlane一旦创建之后,就把处理人绑定,之后的任务实例不能再选择处理人了。
不过我们也可以利用它的这个特性实现一些其他的特殊业务.比如,一个共享的任务,如果被其中一个人选择处理,那么任务被退回之后再次到达此任务结点时,还应该由他来处理这个任务,就可以考虑通过设置SwimlaneInstance中的actorId来达到目的。
分享到:
相关推荐
**jbPM 3.2 知识点详解** jbPM,全称为Java Business Process Management,是一个开源的工作流管理系统,主要用于企业级应用中的业务流程管理。jbPM 3.2是该系统的一个版本,它提供了丰富的功能,包括流程设计、...
在jbpm3.2中,流程的每个状态(节点)之间的流转,可以通过定义条件表达式或者采用事件触发的方式,比如在任务完成后触发下一个状态的转换。 jbpm3.2中定义了几个核心的类和接口,例如ActionHandler,这是一个接口...
JBPM3.2工作流开发指南 JBPM是一个扩展性很强的工作流系统,百分百用JAVA语言开发,持久层采用Hibernate实现,理论上说,只要Hibernate支持的数据库JBPM都支持。同时它还能被部署在任何一款JAVA应用服务器上。
jbpm3.2表说明 很详细 1.1 JBPM_PROCESSDEFINITION:流程模版表 关系表 外键存在表 外键名称 外键存在表字段 存在原因 可能 关系 JBPM_NODE JBPM_NODE FK_PROCST_SBPRCDEF SUBPROCESSDEFINITION_ 子流程的...
JBPM3.2与Spring的整合主要是为了实现任务调度的功能,这在企业级应用中是非常重要的,因为它能够自动化执行定时任务,如流程启动、数据同步、报告生成等。在JBPM3.1.x版本中,通过SpringModules提供的`spring-...
**JBPM3.2 表初始化与流程发布详解** JBPM(Java Business Process Management)是一款开源的工作流管理系统,主要用于业务流程的建模、部署、执行和监控。在JBPM3.2版本中,用户需要对数据库进行初始化,以便正确...
1. 数据库准备:JBPM3.2需要与数据库进行交互来存储流程实例、任务和变量等信息。因此,首先需要确保已经配置好与JBPM兼容的数据库,并创建相应的数据库表。JBPM提供了SQL脚本,用于在MySQL、Oracle、PostgreSQL等...
jbpm3.2 .jar是基于Java的企业流程管理(Business Process Management,BPM)框架jbpm的特定版本,主要用于设计、执行和管理业务流程。jbpm是一个开源项目,它提供了全面的工作流和业务规则管理功能,使开发人员能够...
jBPM 3.2版本是该框架的一个重要里程碑,提供了强大的工作流引擎和丰富的功能,帮助开发者构建和执行复杂的业务流程。本文将深入探讨jBPM 3.2中的关键知识点,以助于学习者更好地理解和应用这一工具。 首先,我们要...
用erstudio v7.1查看 博文链接:https://evanz.iteye.com/blog/106101
5. **源码分析**:深入理解JBPM3.2源码,可以帮助开发者掌握其内部工作原理,包括流程引擎如何解析JPDL并执行流程,任务服务如何管理任务分配和完成,以及持久化机制如何存储流程实例和变量等。这对于优化性能、调试...
**jbpm3.2.x 开发环境搭建及关键jar包详解** 在Java企业级应用开发中,业务流程管理(Business Process Management,BPM)扮演着重要角色,而Jbpm是一个开源的BPM框架,它提供了流程定义、执行、监控和优化等一系列...
jbpm3.2 mysql修改可用建表语句 在mysql命令行下使用:source D:1.sql
在本场景中,我们关注的是jbpm3.2版本的一个简单的请假流程示例。jbpm3.2是jbpm项目早期的一个稳定版本,它提供了一个强大的框架,允许开发者创建、部署和执行业务流程。 jbpm的请假流程示例通常会展示如何通过jbpm...
JBPM3.2,扫描版本,还算很清晰,虽然比较老,但是用来学习下还算不错,而且是中文,此文件因为太大,所以分为两个压缩包压缩,都已全部上传,请全部下载再解压缩。
JBPM不仅提供流程的执行引擎,还包括工作流管理、任务分配、监控等功能。通过与Spring的集成,我们可以利用Spring的IoC管理JBPM的bean,实现流程服务的自动化管理和调度。 整合这三个框架的关键在于它们之间的接口...
JBPM3.2,扫描版本,还算很清晰,虽然比较老,但是用来学习下还算不错,而且是中文,此文件因为太大,所以分为两个压缩包压缩,都已全部上传,请全部下载再解压缩。
jBPM 3.2版本在2004年10月18日发布,并被纳入JBoss企业中间件平台,更名为JBoss jBPM。这个系统的设计目标是提供一个灵活且可扩展的流程控制流机制,通过流程语言来表达各种商业流程元素,如任务、异步通信、定时器...
jbpm-jpdl-suite-3.2GA -(2)分开压缩(五个文件)jbpm下载 jbpm-jpdl-suite-3.2GA -(2)分开压缩(五个文件)jbpm下载