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

Service Task

  • Service Task
    • Expression
    • Delegate Expression
  • Task 监听器
    • Expression 或Delegate Expression
  • Execution 执行监听器
    • Expression 或Delegate Expression
  • 内置上下文变量
  • 监听器 字段或属性值注入

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

Service Task

25、Camunda Service Task、任务监听器和执行监听器_第1张图片服务任务 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();
    }
}
public class MonitorActivityBehavior implements ActivityBehavior {
    @Override
    public void execute(ActivityExecution execution) throws Exception {
        String processInstanceId = execution.getProcessInstanceId();
    }
}

Expression

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

@Component("monitorExecution")
public class MonitorExecution {
    public void execution(DelegateExecution execution){
        String processInstanceId = execution.getProcessInstanceId();
    }
}

Delegate Expression

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

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

Task 监听器

对于用户任务,可添加Task 监听器。
25、Camunda Service Task、任务监听器和执行监听器_第2张图片## 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();
    }
}

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();
    }
}

Execution 执行监听器

25、Camunda Service Task、任务监听器和执行监听器_第3张图片执行监听器(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();
    }
}

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();
    }
}

内置上下文变量

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

监听器 字段或属性值注入

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

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

25、Camunda Service Task、任务监听器和执行监听器_第5张图片


@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();
    }
}

属性注入类型可以是 Expression 表达式:
25、Camunda Service Task、任务监听器和执行监听器_第6张图片会获取流程中的 myurl 变量值,注入到监听器属性myurl 中。

你可能感兴趣的:(Activiti7,与,SpringBoot,java)