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();
    }
}
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 监听器。
在这里插入图片描述## 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 执行监听器

在这里插入图片描述执行监听器(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)}"
这些变量如下所示:
在这里插入图片描述

监听器 字段或属性值注入

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

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

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

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Camunda是一种用于管理和执行业务流程的开源工作流引擎。在Camunda中,Service Task是一种任务类型,用于执行具体的逻辑操作。而Java是一种编程语言,可以在Camunda中使用来开发和定制Service Task。 使用CamundaService Task Java功能,可以通过编写Java代码来执行各种业务逻辑。通过创建一个Java Delegate类,我们可以定义任务执行过程。在Java Delegate类中,我们可以访问Camunda提供的API,对流程中的数据进行操作,并与外部系统进行交互。 要使用Camunda Service Task Java功能,需要按照以下步骤进行: 1. 创建一个Java类,实现org.camunda.bpm.engine.delegate.JavaDelegate接口。 2. 在Java类中,实现execute方法,该方法定义了任务执行逻辑。 3. 在execute方法中,可以使用Camunda提供的API与流程引擎进行交互,例如获取流程变量、发送消息或启动子流程等。 4. 在Camunda中,将Service Task节点与Java Delegate类进行关联,以便在执行过程中调用指定的Java代码。 使用Camunda Service Task Java功能的一个示例是将某些业务逻辑封装在一个自定义的Java类中,然后在流程执行过程中调用该类以执行特定的任务。这样可以在执行流程时,根据具体的业务需求,定制和扩展业务逻辑。 总之,CamundaService Task Java功能可以通过编写Java代码来实现定制的业务逻辑,并在流程执行过程中执行特定的任务。通过与Camunda的API进行交互,可以实现与外部系统的集成,进一步增强和扩展业务流程的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值