工作流中非常重要的一个就是任务的分配,这里我们采用assignee的分配方式,对于其他的几种方式我们在后面的博客中详细介绍。任务的分配分为动态和静态两种,我们之前对jbpm的讲解都采用的是静态的分配方式,也就是对于任务分配给了谁,我们都会写死在jpdl文件中,例如科长审批分配给了张三我们会这样写:
<task assignee="张三"name="111科长审批" g="255,101,92,52">
<transition name="提交到主任" to="主任审批" g="-69,-20"/>
</task>
采用这种方式分配任务,使程序不灵活,如果我们想要更改任务分配人,还需要手动更改流程定义文件,这会带来极大的不方便。
现在我们采用动态分配的方式,使任务的分配人根据程序的确定而进行选择,结合el表达式我们来对动态分配做一个简单的实践。
建立一个User实体对象:
package com.tgb.video.entity;
import java.io.Serializable;
public class User implements Serializable{
private String kezhang;
public String getKezhang() {
return kezhang;
}
public void setKezhang(String kezhang) {
this.kezhang = kezhang;
}
public String getZhuren() {
return zhuren;
}
public void setZhuren(String zhuren) {
this.zhuren = zhuren;
}
private String zhuren;
}
因为实体对象要放到数据库中进行持久化,所以一定要实现一个序列化接口。
然后我们部署流程和创建流程实例,在创建流程实例的时候动态赋值即可:
public void createInstance() {
super.startUp();
Map<String,Object> map=new HashMap<String,Object>();
User user=new User();
user.setKezhang("张三");
user.setZhuren("李四");
map.put("user", user);
ProcessInstance processInstance=executionService .startProcessInstanceByKey("test",map);
print("流程实例ID",processInstance.getId());
}
这样,我们设置了kezhang为张三,zhuren为李四。此时任务已经分配下去了,我们只要在流程定义文件中采用el表达式取得即可:
<?xml version="1.0" encoding="UTF-8"?>
<process name="test" key="test" xmlns="http://jbpm.org/4.4/jpdl">
<start name="start1" g="310,49,48,48">
<transition name="提交到科长" to="科长审批" g="-52,-22"/>
</start>
<task assignee="${user.kezhang}" name="科长审批" g="285,151,92,52">
<transition name="提交到主任" to="主任审批" g="-52,-22"/>
</task>
<task assignee="${user.zhuren}" name="主任审批" g="281,256,92,52">
<transition name="通过" to="end1" g="-50,-22"/>
</task>
<end name="end1" g="302,359,48,48"/>
</process>
${user.kezhang}的值就是张三,${user.zhuren}的值就是李四。采用这种方式动态分配,使得我们程序更加灵活,更加容易扩展。就和我们采用配置文件读取数据一样,我们把这些容易改变的数据和重要的文件隔离开,如果一方面需要修改不会影响到另一个方面。这种思想是我们程序开发非常重要的。