• 25、Camunda Service Task、任务监听器和执行监听器


    Service Task、任务监听器和执行监听器都可执行调用Java 业务代码。
    参考资料:
    http://camunda-cn.shaochenfeng.com/user-guide/process-engine/delegation-code/

    Service Task

    在这里插入图片描述服务任务 Class 配置的类,必须实现接口
    org.camunda.bpm.engine.impl.pvm.delegate.ActivityBehavior; 功能大于JavaDelegate,用不好会出问题,小心使用。

    org.camunda.bpm.engine.delegate.JavaDelegate;推荐使用。

    public class MonitorJavaDelegate implements JavaDelegate {
        @Override
        public void execute(DelegateExecution execution) throws Exception {
            String processInstanceId = execution.getProcessInstanceId();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    public class MonitorActivityBehavior implements ActivityBehavior {
        @Override
        public void execute(ActivityExecution execution) throws Exception {
            String processInstanceId = execution.getProcessInstanceId();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Expression

    执行EL表达式 ,可直接调用JavaBean 的方法
    expression=“#{monitorExecution.execution(execution)}”

    @Component("monitorExecution")
    public class MonitorExecution {
        public void execution(DelegateExecution execution){
            String processInstanceId = execution.getProcessInstanceId();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Delegate Expression

    基本使用和Expression 使用方式类似,支持EL表达式。
    delegateExpression=“#{monitorExecution.execution(execution)}”

    如果当前的Bean实现接口 ActivityBehavior 或 JavaDelegate 接口时,可直接配置Bean名称。
    delegateExpression=“${monitorExecution}”

    Task 监听器

    对于用户任务,可添加Task 监听器。
    在这里插入图片描述## Class
    任务监听器(Task Listener) class 必须实现接口:
    org.camunda.bpm.engine.delegate.TaskListener

    实现接口:并不能配置任务监听器类型;
    org.camunda.bpm.engine.impl.pvm.delegate.ActivityBehavior;
    org.camunda.bpm.engine.delegate.JavaDelegate;

    public class MonitorClassTaskListener implements TaskListener {
        @Override
        public void notify(DelegateTask delegateTask) {
            String processInstanceId = delegateTask.getProcessInstanceId();
            int priority = delegateTask.getPriority();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Expression 或Delegate Expression

    使用方式和服务任务的用法基本一样。
    Delegate Expression 可以配置 delegateExpression=“${monitorUserTaskListener}”,这个Bean实现接口TaskListener

    @Component("monitorUserTaskListener")
    public class MonitorUserTaskListener {
        public void monitor(DelegateTask task){
            String processInstanceId = task.getProcessInstanceId();
            int priority = task.getPriority();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Execution 执行监听器

    在这里插入图片描述执行监听器(Execution Listener) class 必须实现接口:
    org.camunda.bpm.engine.delegate.JavaDelegate;或
    org.camunda.bpm.engine.delegate.ExecutionListener;推荐使用

    实现接口:
    org.camunda.bpm.engine.impl.pvm.delegate.ActivityBehavior 并不能配置执行监听器类型;

    public class MonitorExecutionListener implements ExecutionListener {
        @Override
        public void notify(DelegateExecution execution) throws Exception {
            String processInstanceId = execution.getProcessInstanceId();
            //执行监听器中可以获取Camunda其他服务,调用执行;
            //无法获取Spring 管理的服务,需要通过静态类获取Spring上下文获取服务;
            RuntimeService runtimeService = execution.getProcessEngine().getRuntimeService();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Expression 或Delegate Expression

    使用方式和服务任务的用法基本一样。
    expression 可以配置:expression=“#{monitorExecution.execution(execution)}”
    Delegate Expression 可以配置 delegateExpression=“${monitorExecution}”,这个Bean实现接口 ExecutionListener

    @Component("monitorExecution")
    public class MonitorExecution {
        public void execution(DelegateExecution execution){
            String processInstanceId = execution.getProcessInstanceId();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    内置上下文变量

    在配置服务任务、任务监听器或执行监听器的时候,如果配置 Expression 表达式时,可以直接把内置上下文变量传递到JavaBean实例对象方法中。
    expression="#{monitorExecution.execution(execution)}"
    这些变量如下所示:
    在这里插入图片描述

    监听器 字段或属性值注入

    可以向委托类的字段中注入数据。支持以下类型的注入
    * 固定字符串值
    * 表达式

    1.只有任务监听器 或 执行监听器 配置的是Java Class 类型时,才能够属性值注入
    2.配置 Expression 或 Delegate Expression 不能够注入(Spring 单列Bean,会有问题);
    3.类中定义的 属性类型必须是 org.camunda.bpm.engine.delegate.Expression;
    4.类中定义的属性类型名称 必须和流程中定义的属性名称一致
    5.字段或属性必须要有Setter 方法,经过测试,没有Setter也可以注入值;

    在这里插入图片描述

    
    @Data
    public class MonitorExecutionListener implements ExecutionListener {
        //这里定义的Expression  字段名称必须要和流程中 Field Injection 名称一致
        private Expression myexe;
    
        @Override
        public void notify(DelegateExecution execution) throws Exception {
            String myexe_val = (String) myexe.getValue(execution);
            System.out.println("myexe_val = " + myexe_val);
    
            String processInstanceId = execution.getProcessInstanceId();
    
            //执行监听器中可以获取Camunda其他服务,调用执行;
            //无法获取Spring 管理的服务,需要通过静态类获取Spring上下文获取服务;
            RuntimeService runtimeService = execution.getProcessEngine().getRuntimeService();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    属性注入类型可以是 Expression 表达式:
    在这里插入图片描述会获取流程中的 myurl 变量值,注入到监听器属性myurl 中。

  • 相关阅读:
    opencv dnn模块 示例(19) 目标检测 object_detection 之 yolox
    SpringBoot——全局异常处理
    在PyG上构建自己的数据集
    多线程应用——单例模式
    mybatis plus 常用方法
    SS310L-ASEMI肖特基二极管SS310L
    Redis总结
    新库上线 | CnOpenData科学研究和技术服务商注册企业基本信息数据
    小白课程,前端入门新手,必须了解的回调函数概念和应用实例
    关于不同数据库的SQL中比较串的形式为NULL=NULL的返回值不同
  • 原文地址:https://blog.csdn.net/u011109679/article/details/125410902