`
xiangzhengyan
  • 浏览: 124291 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

task-node 任务管理实现

    博客分类:
  • jBPM
阅读更多

一个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)对于这样的流程定义:

代码
  1. <task-node name='a'>  
  2.      <task name='laundry' />  
  3.      <task name='dishes' />  
  4.      <task name='change nappy' />  
  5.      <transition to='b' />  
  6. task-node>  

<script>render_code();</script>
只有当节点中的三个任务都完成后,流程才进入后面的节点

 

(2)对于这样的流程定义:

代码
  1. <task-node name='a' signal='first'>>  
  2.       <task name='laundry' />  
  3.       <task name='dishes' />  
  4.       <task name='change nappy' />  
  5.       <transition to='b' />  
  6.  task-node>   

<script>render_code();</script>

 

当第一个任务完成后,token就指向后面的节点

(3)对于这样的流程定义:

代码
  1. <task-node name='a' signal='never'>>  
  2.       <task name='laundry' />  
  3.       <task name='dishes' />  
  4.       <task name='change nappy' />  
  5.       <transition to='b' />  
  6.  task-node>  

<script>render_code();</script>

 

三个任务都完成后,token仍然不会指向后面的节点;需要自己手动调用processInstance.signal()
才会驱动流程到下面的节点

(4)对于这样的流程定义:

代码
  1. <task-node name='a' signal='unsynchronized'>>  
  2.       <task name='laundry' />  
  3.       <task name='dishes' />  
  4.       <task name='change nappy' />  
  5.       <transition to='b' />  
  6.  task-node>  

<script>render_code();</script>
token不会在本节点停留,而是直接到后面的节点

 

jbpm用join/fork/merge/decision也可以实现同样的功能,不过它们的实现办法不同,一个是通过
NODE来实现,一个是通过TASK来实现

 

分享到:
评论

相关推荐

    jbpm安装及使用方法

    12. jbpm的任务管理实现 一个Task instance(任务实例)可以被分配给一个actorId (java.lang.String)。所有的Task instance都被保存在数据库中的表jbpm_taskinstance里。当你想得到特定用户的任务清单时,你就可以...

    task-manager:层次任务管理器

    Clavy是一个方便的任务管理器,可以帮助您实现目标。 这个名字取自“聪明”一词。 这意味着它很智能,可以帮助完成各种任务。 我们的想法是让通用助手来计划您的一天。 您需要做的只是定义每个任务的截止日期和...

    node-task-assessment

    您的任务是实现一个非常简单的REST API,该API允许用户创建和管理任务。 我们在寻找什么 使用Git进行版本控制。 编程逻辑。 具有构建REST API的丰富知识。 [可选]具备有关编写测试的知识。 [可选]有关编写API...

    task-manager-api

    任务管理器API 该存储库包含用于创建简单任务管理器(如支持多个用户的功能)的后端代码。 整个应用程序已用Node.js编写。 该项目使用以下软件包来实现所需的功能: 用于上传文件并将文件发送到后端服务的软件包...

    celery.node:Node.js的Celery任务队列客户端工作器

    Node.js中的Celery客户端/工作者该项目致力于在受影响的node.js中使用celery协议实现任务队列什么是任务队列和芹菜?任务队列任务队列是一种在“工人”或“机器”之间分配或分派“任务”或“工作”以异步执行它们的...

    role-and-task:eliot-server的npm软件包部分

    推介会@cotep/role-and-task是一个程序包,能够启动和管理多个Node.js进程; 为每个任务分配具体任务。 @cotep/role-and-task是一种简单的方法,可将应用程序离线扩展100%并摆脱单线程问题。项目历史该项目于2016年...

    spark-2.2.2安装流程

    Executor:执行器,在worker node上执行任务的组件、用于启动线程池运行任务。每个Application拥有独立的一组Executors。 SparkContext:整个应用的上下文,控制应用的生命周期。 RDD:Spark的基本计算单元,一组RDD...

    速记::person_running::robot_face:多服务器和集群设置上的node.js中的作业和任务的调度程序和管理器

    Node.js的多实例任务管理器。 该软件包支持集群,多服务器和多线程Node.js实例。 该软件包的目标是确保跨多服务器(多线程/多实例)设置运行每个任务( job / cron )的唯一单个进程。 这是仅服务器的程序包。 收...

    Node.js的项目构建工具Grunt的安装与配置教程

    Grunt 基于 Node.js ,用 JS 开发,这样就可以借助 Node.js 实现跨系统跨平台的桌面端的操作,例如文件操作等等。此外,Grunt 以及它的插件们,都作为一个 包 ,可以用 NPM 安装进行管理。 所以 NPM 生成的 package....

    arcgis工具

    实用工具 TASK 任务栏 Extend/Trim feature 剪切所得内容与你画线的方向有关。 2. 自动捕捉跟踪工具 点击Editor工具栏中Snapping来打开Snapping Environment对话框 捕捉设置中有3个选项, vertex edge end 分别是...

Global site tag (gtag.js) - Google Analytics