12、流程监听器-ExecutionListener

流程监听器

流程监听器,可监听流程开启、结束,流程审批达到哪个连线上或者流程审批达到那个节点的审批,节点审批完成、取消等操作时,是否触发某些业务逻辑。

流程监听器

  1. 全局的监听器。
    全局监听器主要使用的场景就是监控这个流程的启动和结束。流程开始的时候可以监控,流程结束的时候可以监控。
    主要监听事件:start、end
public interface BaseExecutionListener extends Serializable {
  String EVENTNAME_START = "start";
  String EVENTNAME_END = "end";
  String EVENTNAME_TAKE = "take";
}

public class MyExecutionListener 
	implements ExecutionListener {}
  1. 连线的监听器。
    在流程连线上使用的监听器,主要监听 take 事件

  2. 节点的监听器。
    TaskListener 监听节点是否到达、是否认领任务、是否完成任务等操作

public interface BaseTaskListener extends Serializable {

  String EVENTNAME_CREATE = "create";
  String EVENTNAME_ASSIGNMENT = "assignment";
  String EVENTNAME_COMPLETE = "complete";
  String EVENTNAME_DELETE = "delete";

  //以上节点所有事件都会监听
  String EVENTNAME_ALL_EVENTS = "all";
}

1、activiti:executionListener class 配置

<process id="test1" isClosed="false" isExecutable="true" processType="None">
    <extensionElements>
      <activiti:executionListener class="cn.maitian.form.activiti.listener.MyExecutionListener" event="start"/>
      <activiti:executionListener class="cn.maitian.form.activiti.listener.MyExecutionListener" event="end"/>
    </extensionElements>
	
    <startEvent id="_2" name="StartEvent"/>
    <serviceTask activiti:exclusive="true" id="_3" name="ServiceTask"/>
    <userTask activiti:assignee="zyk" activiti:exclusive="true" id="_4" name="审批"/>
    <endEvent id="_5" name="EndEvent"/>
	
    <sequenceFlow id="_9" sourceRef="_2" targetRef="_4">
		 <extensionElements>
        <activiti:executionListener event="take" class="cn.maitian.form.activiti.listener.MyExecutionListener"></activiti:executionListener>
      </extensionElements>
	</sequenceFlow>
	
    <sequenceFlow id="_10" sourceRef="_4" targetRef="_3"/>
    <sequenceFlow id="_11" sourceRef="_3" targetRef="_5"/>
  </process>

2、类型定义

public class MyExecutionListener implements ExecutionListener {
    @Override
    public void notify(DelegateExecution execution) {
        String eventName = execution.getEventName();
        System.out.println("eventName = " + eventName);

        System.out.println("execution = " + execution);
        System.out.println("流程监听器触发业务逻辑。。。");
    }
}

3、节点 监听器配置及类型定义

<userTask activiti:assignee="zyk" activiti:exclusive="true" id="_4" name="审批">
		 <extensionElements>
			<activiti:taskListener event="all" class="cn.maitian.form.activiti.listener.MyTaskListener">
			</activiti:taskListener>
      </extensionElements>
	</userTask>
public class MyTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        String assignee = delegateTask.getAssignee();
        String eventName = delegateTask.getEventName();
        String formKey = delegateTask.getFormKey();
        //camunda 可以在UserTask 节点的create类型事件上设置当前节点审批用户
        if(eventName.equate("create")){
        	delegateTask.setAssignee("zyk");
        }
        System.out.println("eventName = " + eventName);
    }
}

4、单元测试

@Test
    public void complete(){
        //部署流程
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("bpmn/test1.bpmn")
                .name("请假流程")
                .deploy();
        log.info("部署流程成功:Id:{},Key:{},Name:{}",deployment.getId(),deployment.getKey(),deployment.getName());

        //开启流程
        ProcessInstance instance = runtimeService.startProcessInstanceByKey("test1");
        log.info("流程开启:{}",instance.getId());
        String instanceId=instance.getId();

        //审批流程
        Map<String,Object> variables=new HashMap<>();
        variables.put("assignee","jl1)");
        variables.put("age",23);

        Task task = taskService.createTaskQuery().processInstanceId(instanceId).singleResult();
        taskService.complete(task.getId(),variables);
        log.info("流程{} - {} 任务已完成。",task.getProcessInstanceId(),task.getId());
    }

监听器如何和Spring 集成?

1、expression 设置EL表达式

注意:

  1. myTaskListener Spring 管理的Bean名称,普通类即可。可以不实现接口TaskListener
  2. 注意是 expression="#{}" 不是"${}"
  3. task 如果接口第一次参数是DelegateTask 类型时,参数名称必须是task,否则会报异常
  4. 这个方法参数可以有多个,参数名称,必须是流程变量中的参数名称或者 Spring 管理的Bean名称,会IOC注入。
  5. 具体更多使用方式可参考**11、ServiceTask 服务任务-Spring集成**

1、用户审批节点监听器配置

 <userTask activiti:assignee="zyk" activiti:exclusive="true" id="_4" name="审批">
      <extensionElements>
        <activiti:taskListener event="all" expression="#{myTaskListener.notify(task)}"/>
      </extensionElements>
    </userTask>

2、监听器类型定义

与Spring集成时,监听器类可以不实现接口 TaskListener

@Component("myTaskListener")
public class MyTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask task) {
        String assignee = task.getAssignee();
        String eventName = task.getEventName();
        String formKey = task.getFormKey();
        System.out.println("eventName = " + eventName);
    }
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值