Jbpm 任务

流程中的任务是流程与操作者的一种交互手段,任务是Jbpm的核心。一般使用Task Node 节点定义。当在task 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¬-createtask-assigntask-starttask-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节点。不多做解释。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值