一个Task instance(任务实例)可以被分配给一个actorId (java.lang.String)。所有的Task instance都被保存在数据库中的表jbpm_taskinstance里。当你想得到特定用户的任务清单时,你就可以通过一个与用户关联的actorId来查询这张表。
一个流程定义有一个TaskMgmtDefinition;一个TaskMgmtDefinition对应多个swimlane,同时对应多个task;一个swimlane有多个task,可以从TaskMgmtDefinition中通过task的名称直接获取相应的task;
swimlane对象有四个属性,分别是name(名字)、assignmentDelegation(分配代理类)、taskMgmtDefinition、tasks(Set 对应多个task),可以增加task
task对象主要的属性:taskMgmtDefinition、swimlane、assignmentDelegation、taskNode,需要注意的是swimlane和assignmentDelegation中间只是可以一个属性有值,因为它们都和任务的分配有关系。
一个流程实例有一个TaskMgmtInstance;一个TaskMgmtInstance对应多个swimlaneInstance,同时对应多个taskInstance;一个swimlaneInstance有多个taskInstance,可以从TaskMgmtInstance中直接获取相应的taskInstance;
swimlaneInstance对象主要有五个属性,分别是name、actorId、pooledActors(Set)、swimlane、taskMgmtInstance。
taskInstance对象的主要属性:name、actorId、task、swimlaneInstance、taskMgmtInstance、pooledActors。
当对任务进行分配时,一般需要实现AssignmentHandler这个接口,这个接口的方法只有一个:
void assign( Assignable assignable, ExecutionContext executionContext ) throws Exception;
一个典型的实现(把名字是'change nappy'的任务交给NappyAssignmentHandler这个类来分配)
NappyAssignmentHandler类:
public void assign(Assignable assignable, ExecutionContext executionContext) {
assignable.setActorId("papa");
}
同样,Assignable只是一个接口,它有两个方法:setActorId()和setPooledActors(),Assignable的具体实现类也是两个
swimlaneInstancehe和taskInstance。这样就不不难理解整个任务分配流程了:
1、流程进入TaskNode节点,执行TaskNode类的execute()方法,该方法首先获得TaskMgmtInstance实例,然后通过它来创建TaskInstance。taskMgmtInstance.createTaskInstance(task, executionContext);
2、在上面的createTaskInstance(task, executionContext)里,该方法调用了taskInstance.assign(executionContext)对taskInstance进行分配。
3、在assign(executionContext)方法里,首先会判断task属性里是否存在swimlane,如果有的话,这个taskInstance就会分配给swimlane指定的ActorId或 PooledActors;如果不存在,再去找task属性里 assignmentDelegation(分配代理类)通过代理类(即我们自己写的实现AssignmentHandler这个接口的类)指定ActorId或 PooledActors。
一个流程定义有一个TaskMgmtDefinition;一个TaskMgmtDefinition对应多个Actor,同时对应多个Task;
一个Actor有多个Task,可以从TaskMgmtDefinition中通过task的名称直接获取相应的task;
一个流程实例有一个TaskMgmtInstance;一个TaskMgmtInstance对应多个actorInstance,同时对应多个taskInstance;
一个actorInstance有多个taskInstance,可以从TaskMgmtInstance中直接获取相应的taskInstance;
一个TaskNode对例应多个Task
(1)对于这样的流程定义:
代码
- <task-node name='a'>
- <task name='laundry' />
- <task name='dishes' />
- <task name='change nappy' />
- <transition to='b' />
- task-node>
<script>render_code();</script>
只有当节点中的三个任务都完成后,流程才进入后面的节点
(2)对于这样的流程定义:
代码
- <task-node name='a' signal='first'>>
- <task name='laundry' />
- <task name='dishes' />
- <task name='change nappy' />
- <transition to='b' />
- task-node>
<script>render_code();</script>
当第一个任务完成后,token就指向后面的节点
(3)对于这样的流程定义:
代码
- <task-node name='a' signal='never'>>
- <task name='laundry' />
- <task name='dishes' />
- <task name='change nappy' />
- <transition to='b' />
- task-node>
<script>render_code();</script>
三个任务都完成后,token仍然不会指向后面的节点;需要自己手动调用processInstance.signal()
才会驱动流程到下面的节点
(4)对于这样的流程定义:
代码
- <task-node name='a' signal='unsynchronized'>>
- <task name='laundry' />
- <task name='dishes' />
- <task name='change nappy' />
- <transition to='b' />
- task-node>
<script>render_code();</script>
token不会在本节点停留,而是直接到后面的节点
jbpm用join/fork/merge/decision也可以实现同样的功能,不过它们的实现办法不同,一个是通过
NODE来实现,一个是通过TASK来实现
分享到:
相关推荐
12. jbpm的任务管理实现 一个Task instance(任务实例)可以被分配给一个actorId (java.lang.String)。所有的Task instance都被保存在数据库中的表jbpm_taskinstance里。当你想得到特定用户的任务清单时,你就可以...
Clavy是一个方便的任务管理器,可以帮助您实现目标。 这个名字取自“聪明”一词。 这意味着它很智能,可以帮助完成各种任务。 我们的想法是让通用助手来计划您的一天。 您需要做的只是定义每个任务的截止日期和...
您的任务是实现一个非常简单的REST API,该API允许用户创建和管理任务。 我们在寻找什么 使用Git进行版本控制。 编程逻辑。 具有构建REST API的丰富知识。 [可选]具备有关编写测试的知识。 [可选]有关编写API...
任务管理器API 该存储库包含用于创建简单任务管理器(如支持多个用户的功能)的后端代码。 整个应用程序已用Node.js编写。 该项目使用以下软件包来实现所需的功能: 用于上传文件并将文件发送到后端服务的软件包...
Node.js中的Celery客户端/工作者该项目致力于在受影响的node.js中使用celery协议实现任务队列什么是任务队列和芹菜?任务队列任务队列是一种在“工人”或“机器”之间分配或分派“任务”或“工作”以异步执行它们的...
推介会@cotep/role-and-task是一个程序包,能够启动和管理多个Node.js进程; 为每个任务分配具体任务。 @cotep/role-and-task是一种简单的方法,可将应用程序离线扩展100%并摆脱单线程问题。项目历史该项目于2016年...
Executor:执行器,在worker node上执行任务的组件、用于启动线程池运行任务。每个Application拥有独立的一组Executors。 SparkContext:整个应用的上下文,控制应用的生命周期。 RDD:Spark的基本计算单元,一组RDD...
Node.js的多实例任务管理器。 该软件包支持集群,多服务器和多线程Node.js实例。 该软件包的目标是确保跨多服务器(多线程/多实例)设置运行每个任务( job / cron )的唯一单个进程。 这是仅服务器的程序包。 收...
Grunt 基于 Node.js ,用 JS 开发,这样就可以借助 Node.js 实现跨系统跨平台的桌面端的操作,例如文件操作等等。此外,Grunt 以及它的插件们,都作为一个 包 ,可以用 NPM 安装进行管理。 所以 NPM 生成的 package....
实用工具 TASK 任务栏 Extend/Trim feature 剪切所得内容与你画线的方向有关。 2. 自动捕捉跟踪工具 点击Editor工具栏中Snapping来打开Snapping Environment对话框 捕捉设置中有3个选项, vertex edge end 分别是...