流程中的任务是流程与操作者的一种交互手段,任务是Jbpm的核心。一般使用Task Node 节点定义。当在task node节点中定义了任务时,流程流转到此就会产生任务实例,等待任务实例的参与者处理完任务之后流程才继续执行。
任务实例在jbpm中主要体现在jbpm_taskinstance这个表中。任务的分配,一般一个任务产生一个实例,可以分配给一个参与者或者多个参与者,如果分配给了多个参与者,则只能由多个参与者的其中一个完成,当参与者处理完成之后,其他人将不会在自己的代办任务栏中看到这个任务实例。任务的分配一般有两种方式:
一种是Handler,即定义一个实现AssignmentHandler接口的类 重写assign方法。
自定义实现类
另外一种是swimlane方式,先定义好泳道swimlane,然后在任务中调用。(类似全局变量)具体使用如下(仍然使用前面的action类):
此外还有其他几种方式:expression(需要结合jpdl身份认证组件)、pooled actors、actor方式。注意:泳道只初始化一次,这是他的局限性。可以结合handler方式。
如果使用pooled actors、actor方式必须注意,不可以使用pooled actors代替actor,因为pooled actors指的是潜在参与者而actor为指定参与者。
一般任务实例的生命周期分为:task¬-create、task-assign、task-start、task-end。不过task-assign只有在任务分配的时候才会执行。一般来说执行的顺序是这样的:
task¬-createtask-assigntask-starttask-end
任务控制器taskController的作用主要是用来处理输入输出,与流程变量打交道。
在上面代码中,可以看到access有三个可选值:
Read:表示任务实例初始化时会从流程实例上下文中读取key为name的变量的值进行赋值
Write:表示任务完成之后写回流程上下文,如果设置了mapped-name的话,则用mapped-name作为key写回(通过setVariable(String key,Object object)完成。)
如果没有设置mapped-name则使用name为key写回
Required:在设置了write的情况下,如果设置了required则必须将值写回流程上下文,否则会抛出异常IllegalArgumentException
任务实例变量的获取可以通过taskinstance.getVariableInstances()获取(access中有read的变量),返回的是一个Map。同样当我们为taskInstance写回变量的时候可以通过taskInstance.addVariables(Map map)来设置。(只设置access中有write的变量)
一般任务创建之后需要对任务的执行人做相应的提醒。Jbpm中有两种方式
第一种是:设置任务的notify属性,在任务分配的时候对执行人提醒,配置如下:
使用这种方式时必须在jbpm.mail.template.xml文件中添加一个模版:task-assign
第二种是:设置任务的reminder属性,这种方式是任务分配完之后在duedate之后定时repeat时间对执行人提醒,需要jbpm的任务调度服务支持(必须开启jbpm任务调度服务)。
Jbpm的任务调度主要是使用一个定时器,定时扫描jbpm_job这张表,看看有没有job需要执行。
要实现jbpm的任务调度必须开启jbpm任务调度服务,代码如下:
使用reminder的配置如下:
使用这种方式时必须在jbpm.mail.template.xml文件中添加一个模版:task-reminder
上面两种设置方法都涉及到邮件发送,邮件发送的配置类似之前的mail-node节点。不多做解释。
任务实例在jbpm中主要体现在jbpm_taskinstance这个表中。任务的分配,一般一个任务产生一个实例,可以分配给一个参与者或者多个参与者,如果分配给了多个参与者,则只能由多个参与者的其中一个完成,当参与者处理完成之后,其他人将不会在自己的代办任务栏中看到这个任务实例。任务的分配一般有两种方式:
一种是Handler,即定义一个实现AssignmentHandler接口的类 重写assign方法。
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.2" name="tasknode">
<start-state name="start-state1">
<transition to="task-node1"></transition>
</start-state>
<task-node name="task-node1">
<task name="mytask">
<assignment class="com.royzhou.AssignAction"></assignment>
</task>
<transition to="end-state1"></transition>
</task-node>
<end-state name="end-state1"></end-state>
</process-definition>
自定义实现类
package com.royzhou.action;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.taskmgmt.def.AssignmentHandler;
import org.jbpm.taskmgmt.exe.Assignable;
public class AssignAction implements AssignmentHandler {
public void assign(Assignable assignable, ExecutionContext executionContext)
throws Exception {
assignable.setActorId("royzhou");//单一参与者
//assignable.setPooledActors(new String[]{"royzhou","jane"});
}
}
另外一种是swimlane方式,先定义好泳道swimlane,然后在任务中调用。(类似全局变量)具体使用如下(仍然使用前面的action类):
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.2" name="tasknode">
<swimlane name="taskassign">
<assignment class="com.royzhou.AssignAction"></assignment>
</swimlane>
<start-state name="start-state1">
<transition to="task-node1"></transition>
</start-state>
<task-node name="task-node1">
<task name="mytask" swimlane="taskassign">
</task>
<transition to="end-state1"></transition>
</task-node>
<end-state name="end-state1"></end-state>
</process-definition>
此外还有其他几种方式:expression(需要结合jpdl身份认证组件)、pooled actors、actor方式。注意:泳道只初始化一次,这是他的局限性。可以结合handler方式。
如果使用pooled actors、actor方式必须注意,不可以使用pooled actors代替actor,因为pooled actors指的是潜在参与者而actor为指定参与者。
一般任务实例的生命周期分为:task¬-create、task-assign、task-start、task-end。不过task-assign只有在任务分配的时候才会执行。一般来说执行的顺序是这样的:
task¬-createtask-assigntask-starttask-end
任务控制器taskController的作用主要是用来处理输入输出,与流程变量打交道。
<task name="mytask">
<controller>
<variable name="a" access="read,write" mapped-name="a"></variable>
<variable name="b" access="read,write,required" mapped-name="mappedb"></variable>
<variable name="c" access="read" mapped-name="mappedc"></variable>
<variable name="d" access="write"></variable>
</controller>
</task>
在上面代码中,可以看到access有三个可选值:
Read:表示任务实例初始化时会从流程实例上下文中读取key为name的变量的值进行赋值
Write:表示任务完成之后写回流程上下文,如果设置了mapped-name的话,则用mapped-name作为key写回(通过setVariable(String key,Object object)完成。)
如果没有设置mapped-name则使用name为key写回
Required:在设置了write的情况下,如果设置了required则必须将值写回流程上下文,否则会抛出异常IllegalArgumentException
任务实例变量的获取可以通过taskinstance.getVariableInstances()获取(access中有read的变量),返回的是一个Map。同样当我们为taskInstance写回变量的时候可以通过taskInstance.addVariables(Map map)来设置。(只设置access中有write的变量)
一般任务创建之后需要对任务的执行人做相应的提醒。Jbpm中有两种方式
第一种是:设置任务的notify属性,在任务分配的时候对执行人提醒,配置如下:
<task-node name="task-node1">
<task name="mytask" notify="true">
</task>
<transition to="end-state1"></transition>
</task-node>
使用这种方式时必须在jbpm.mail.template.xml文件中添加一个模版:task-assign
第二种是:设置任务的reminder属性,这种方式是任务分配完之后在duedate之后定时repeat时间对执行人提醒,需要jbpm的任务调度服务支持(必须开启jbpm任务调度服务)。
Jbpm的任务调度主要是使用一个定时器,定时扫描jbpm_job这张表,看看有没有job需要执行。
要实现jbpm的任务调度必须开启jbpm任务调度服务,代码如下:
JbpmConfiguration configuration = JbpmConfiguration.getInstance();
configuration.getJobExecutor().start();
使用reminder的配置如下:
<task name="mytask">
<reminder duedate="30 seconds" repeat="20 seconds"/>
</task>
使用这种方式时必须在jbpm.mail.template.xml文件中添加一个模版:task-reminder
上面两种设置方法都涉及到邮件发送,邮件发送的配置类似之前的mail-node节点。不多做解释。