1.分配任务负责人
1.1 固定分配
简而言之,就是在进行业务流程建模的时候指定固定的任务负责人
其中Assignee就是任务负责人
1.2 UEL表达式分配
Activiti使用UEL表达式,UEL是javaEE6规范的一部分,UEL(Unified Expression Language) 即统一表达式语言
,activiti支持两个UEL表达式:UEL-value和UEL-method
1.2.1 UEL-value 方式:
就是一个${} 的这种方式,部门经理审批这个流程的处理人 是在程序之中动态分配的
user也是activiti的一个流程变量,user.assignee标识通过调用user的getter方法获取值,这其实类似javaee种的el表达式,相信学过javaee的朋友都不陌生。
1.2.2 UEL-method方式:
holidayBean是spring容器中的一个bean,标识调用该bean的getHolidayId()方法
1.2.3示例
1.首先前提:环境准备
2.复制一份资源文件bpmn和png文件:holiday2.bpmn、holiday2.png
3.在复制的资源文件流程图中通过UEL表达式设置好参数key
图中0 1 2的意思是UEL表达式中的key 分别是 assignee0、assignee1、assignee2
4.然后启动前面的流程部署,将这个复制的流程进行部署
public static void main(String[] args){
//main方法用于测试
//1.创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday2.bpmn") //添加bpmn资源
.addClasspathResource("diagram/holiday2.png")
.name("请假申请流程")
.deploy();
//4.输出部署信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}
5.启动流程实例,动态设置assignee
public static void main(String[] args){
//1.获得引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.获得RunTimeSerice
RuntimeService runtimeService = processEngine.getRuntimeService();
//3.设置assignee的取值,用户可以在界面设置流程执行人
Map<String,Object> map = new HashMap<String, Object>();
//map中的key就是UEL表达式中的key
map.put("assignee0","zhangsan");
map.put("assignee1","lisi");
map.put("assignee2","wangwu");
//4.启动流程实例,同时还要设置流程定义的assignee的值
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday2", map);
//5.输出
System.out.println(processInstance.getName());
}
结果应该是个null,但没报错就是好事。
接下来检查一下库里面的act_ru_identitylink这张表,应该会有一条处于zhangsan的记录,那就证明UEL表达式成功了。
1.3 监听器分配
任务监听器是发生对应的任务相关事件时执行自定义Java逻辑或表达式
任务事件包括:
事件 | 触发时机 |
---|---|
Create | 任务创建后触发 |
Assignment | 任务分配后触发 |
Delete | 任务完成后触发 |
All | 所有事件发生都触发 |
接下来为了测试重新创建一份资源文件 holiday3.bpmn和holiday3.png
在绘制流程图的时候可以看到
event默认就是create,type指定一个class,当监听器触发工作,要去调用一个类,第三个选项就是解决问题的类,选择即可,当然也是有要求的,作为监听器的类,该类要实现TaskListener接口,并实现notify方法,分配任务执行人。具体参考下面示例
public class AssigneeByListener implements TaskListener {
public void notify(DelegateTask delegateTask) {
System.out.println("触发了测试监听器");
delegateTask.setAssignee("zhangsan");
}
}
注意这个类要在流程图的listener里面指定好噢!
然后部署,这个其实调以前的类换一下参数即可,但我还是贴了出来
public static void main(String[] args){
//main方法用于测试
//1.创建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday3.bpmn") //添加bpmn资源
.addClasspathResource("diagram/holiday3.png")
.name("请假申请流程")
.deploy();
//4.输出部署信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}
然后启动流程实例即可这样启动的时候就会触发监听器,从而执行方法设置处理人
public static void main(String[] args){
//1.获得引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到runtimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//3.准备启动流程实例,同时指定业务标识businessKey,其本身就是请假单id
ProcessInstance instance = runtimeService.startProcessInstanceByKey("holiday3", "1001");
System.out.println(instance.getBusinessKey());
}
运行之后,在控制台能看到输出即成功