一。简单介绍
任务监听器类需要实现:
org.flowable.engine.delegate.TaskListener
流程监听器需要实现:
org.flowable.engine.delegate.ExecutionListener;
为了方便,两个都实现了。
ExecutionListener有三个事件:start、take、end。start是流程开始节点的事件一般用在开始节点;end是流程结束时触发的事件,take是流程图中流转线条的事件。
TaskListener的事件:create、assigeneed、complete和delete事件。
create事件是流程流转到该节点触发的事件。
assigeneed事件是该任务节点设置了"assigenee"后才会触发的事件,若没有设置assigenee则不会触发此事件
complete事件是完成时触发
delete是删除任务时触发。
二。网上介绍是在任务节点通过实现TaskListener动态,然后调用delegate.setAssigenee("assigenee")动态设置审批人:
public class UserTaskListner implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
String eventName=delegateTask.getEventName();
delegateTask.setAssignee("user1");
}
此时通过以下方法可以查询出来:
List list=taskService.createTaskQuery().taskAssignee("user1").list();
数据在ACT_RU_TASK表中也正常,但是在ACT_HI_TASKINS表中的ASSIGENEE_审批人字段是空的,所以查询历史时查不出来,
具体原因不清楚,一直没搞明白为什么。。。
最后,选择了实现ExecutionListener监听器,在流程创建时直接通过设置流程变量的方式直接设置各个节点的审批人.
也可选择如下监听器,在到达该节点任务时再设置审批人:
@Component
public class UserTaskListner implements TaskListener, ExecutionListener {
@Autowire
privat TaskService taskService;
@Override
public void notify(DelegateTask delegateTask) {
String eventName=delegateTask.getEventName();
//监听器分配任务处理人
//这种无论流程图的处理人Assignee填不填都能正常分配
taskService.setAssignee(delegateTask.getId(),"用户处理人");
}
三、若使用了Spring框架则可以不用如上面那样使用监听器,直接用自己的bean
1.
定义bean:
@Component
public class TestServiceListener{
public String getUser(String name) {
return name;
}
}
在流程的assignee或者candidateUser或者candidateGroup处使用bean获取审批人:
格式 ${bean名.方法名(...)}
方法的参数必须是流程变量。
2.上面是通过@Compoment设定的bean,下面通过@Service设置
public interface TestBeanService {
String getUser(String name);
}
@Service
public class TestBeanServiceImpl implements TestBeanService {
@Override
public String getUser(String name) {
return name;
}
}
此时流程设置如下:
上面不能使用testBeanService必须使用testBeanServiceImpl
因为@Autowired是按类型注入的所以controller中使用testBeanService没问题,此处是按照bean名称寻找bean的所以只能使用testBeanServiceImpl