首页 > 其他分享 >Camunda中的Execution listeners和Task listeners

Camunda中的Execution listeners和Task listeners

时间:2024-10-24 19:58:50浏览次数:7  
标签:EVENTNAME Task equals eventName listeners 监听器 import org Camunda

在Camunda中大多数节点元素都可以设置执行监听器(Execution listeners),例如事件、顺序流、用户任务、服务任务和网关。其中用户任务除了可以设置执行监听器,还可以设置独有的用户任务监听器,相比于执行监听器,用户任务监听器可以设置更加细粒度的事件类型。

下面针对执行监听器和用户任务监听器,结合图片和代码进行说明。

1、Execution listeners

执行监听器支持的Listener type如下,有Java class、Expression、Delegate expression和Script,下面针对这几种的配置和代码实现进行说明

1.1、Java class

Java class配置完整的包名和类名,并选择Event type是开始或结束事件类型,对应节点执行前和执行后。

关键点:新增一个java类,实现JavaDelegate接口,并重写execute方法,利用spring@Component注解注入bean,配置当前类的完整路径即可。

根据eventName区分是什么事件,在里面实现对应的逻辑,代码示例如下:

package org.example.executionlistener;

import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.ExecutionListener;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class ExecutionTaskService implements JavaDelegate {

    @Override
    public void execute(DelegateExecution execution) throws Exception {
        String eventName = execution.getEventName();
        String currentActivityName = execution.getCurrentActivityName();
        if (ExecutionListener.EVENTNAME_END.equals(eventName)) {
        } else if (ExecutionListener.EVENTNAME_START.equals(eventName)) {
        } else if (ExecutionListener.EVENTNAME_TAKE.equals(eventName)) {
        }
        log.info("SystemTaskService execute,taskName={},eventName={}", currentActivityName, eventName);
    }
}

 1.2 Expression

针对自定义的java类和方法,支持通过表达式的方式配置,配置如下:

关键点:EL表达式不需要实现JavaDelegate接口,直接使用Spring Bean的名称和方法名称即可,根据eventName区分是start事件还是end事件,在里面实现自己的逻辑。

注:camunda内置了一部分上下文参数,可以在表达式中直接使用,文档链接:Expression Language | docs.camunda.org

代码示例如下:

package org.example.executionlistener;

import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Component;

@Component("expressionExecutionService")
@Slf4j
public class ExpressionService {

    public void expression(DelegateExecution execution) {
        String eventName = execution.getEventName();
        String currentActivityName = execution.getCurrentActivityName();
        log.info("Execution ExpressionService,taskName={},eventName={}", currentActivityName, eventName);
    }

}

 1.3 Delegate expression

委托表达式配置如下:

关键点:DelegateExpression和Expression类似,区别在于需要实现JavaDelegate接口,此时只需要传入bean的名称即可,不需要指定方法名和参数。

示例代码如下:

package org.example.executionlistener;

import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.ExecutionListener;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import org.springframework.stereotype.Component;

@Component("executionTaskService")
@Slf4j
public class ExecutionTaskService implements JavaDelegate {

    @Override
    public void execute(DelegateExecution execution) throws Exception {
        String eventName = execution.getEventName();
        String currentActivityName = execution.getCurrentActivityName();
        if (ExecutionListener.EVENTNAME_END.equals(eventName)) {
        } else if (ExecutionListener.EVENTNAME_START.equals(eventName)) {
        } else if (ExecutionListener.EVENTNAME_TAKE.equals(eventName)) {
        }
        log.info("SystemTaskService execute,taskName={},eventName={}", currentActivityName, eventName);
    }
}

 1.4 Script

camunda支持在执行监听器中编写脚本进行处理,如下可以在Script框中编写脚本,没有使用过,不进行详细说明,感兴趣可以自行研究

2、Task listeners

任务监听器是独属于用户任务的,其支持的事件类型和监听器类型分别如下所示:

从上面可以看到,与执行监听器相比,任务监听器支持的事件类型更加丰富,意味这个可以在用户任务的各个阶段处理我们自定义的逻辑;其监听器类型和Execution listeners一样,同样支持四种方式。

下面给出Java Class和Delegate expression两种方式的实现。

2.1、Java class

用户任务监听器和执行监听器的Java class配置和代码实现类似,区别在于实现的接口不同,eventName的种类更多,示例配置如下所示:

关键点:新增一个java类,实现TaskListener接口,并重写notify方法,利用spring@Component注解注入bean,最后配置当前类的完整路径即可。

代码示例如下:

package org.example.usertask;

import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.delegate.DelegateTask;
import org.camunda.bpm.engine.delegate.TaskListener;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class JavaClassListener implements TaskListener {

    @Override
    public void notify(DelegateTask delegateTask) {
        String eventName = delegateTask.getEventName();
        String name = delegateTask.getName();
        if (TaskListener.EVENTNAME_CREATE.equals(eventName)) {
        } else if (TaskListener.EVENTNAME_ASSIGNMENT.equals(eventName)) {
        } else if (TaskListener.EVENTNAME_COMPLETE.equals(eventName)) {
        } else if (TaskListener.EVENTNAME_DELETE.equals(eventName)) {
        } else if (TaskListener.EVENTNAME_TIMEOUT.equals(eventName)) {
        } else if (TaskListener.EVENTNAME_UPDATE.equals(eventName)) {
        }
        log.info("UserTaskListener UserTaskListener,userTaskName={},eventName={}", name, eventName);
    }
}

2.2 Delegate expression

其在委托表达式的配置示例如下所示:

关键点:只需要实现TaskListener接口,利用spring的@Component注解,传入设置的Bean的名称即可。

代码示例如下:

package org.example.usertask;

import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.delegate.DelegateTask;
import org.camunda.bpm.engine.delegate.TaskListener;
import org.springframework.stereotype.Component;

@Component("userTaskListener")
@Slf4j
public class UserTaskListener implements TaskListener {

    @Override
    public void notify(DelegateTask delegateTask) {
        String eventName = delegateTask.getEventName();
        String name = delegateTask.getName();
        if (TaskListener.EVENTNAME_CREATE.equals(eventName)) {
        } else if (TaskListener.EVENTNAME_ASSIGNMENT.equals(eventName)) {
        } else if (TaskListener.EVENTNAME_COMPLETE.equals(eventName)) {
        } else if (TaskListener.EVENTNAME_DELETE.equals(eventName)) {
        } else if (TaskListener.EVENTNAME_TIMEOUT.equals(eventName)) {
        } else if (TaskListener.EVENTNAME_UPDATE.equals(eventName)) {
        }
        log.info("UserTaskListener UserTaskListener,userTaskName={},eventName={}", name, eventName);
    }
}

2.3 Expression

用户任务监听器的表达式写法和上面执行监听器的表达式写法一样,区别在于其用到的上下文参数不一样,执行监听器用到的方法参数是DelegateExecution execution,用户任务监听器用到的方法参数是DelegateTask task,详细见上面的Camunda内置的上下文参数,其示例配置如下:

 示例代码如下:

package org.example.usertask;

import lombok.extern.slf4j.Slf4j;
import org.camunda.bpm.engine.delegate.DelegateTask;
import org.springframework.stereotype.Component;

@Component("expressionService")
@Slf4j
public class ExpressionService {
    public void expression(DelegateTask task) {
        String eventName = task.getEventName();
        String name = task.getName();
        //根据eventName来进行自定义逻辑
        log.info("ExpressionService expression,userTaskName={},eventName={}", name, eventName);
    }
}

2.4 Script

和上面的执行监听器类似,不再赘述。

标签:EVENTNAME,Task,equals,eventName,listeners,监听器,import,org,Camunda
From: https://www.cnblogs.com/zhaodalei/p/18402092

相关文章

  • InternVL-1.0: Scaling up Vision Foundation Models and Aligningfor Generic Visual
    论文:https://arxiv.org/abs/2312.14238代码:https://github.com/OpenGVLab/InternVL背景在LLM时代,视觉基础模型通常通过一些轻量级的“粘合”层(如QFormer或线性投影)与LLMs连接。然而,这些模型主要源自ImageNet或JFT等纯视觉数据集,或使用图像文本对与BERT系列对齐,缺乏与L......
  • CSC3100 Problem Scale & Subtasks
    RequirementsCode(90%)YoucanwriteyourcodeinJava,Python,C,orC++.Thetimelimitmayvaryamongdifferentlanguages,dependingontheperformanceofthelanguage.Yourcodemustbeacompleteexcutableprograminsteadofonlyafunction.Weg......
  • Task01:课程简介、安装Installation
    标题:PyCharm安装流程详解摘要:本文详细介绍了在不同操作系统下安装PyCharm的步骤,包括软件的下载、安装过程中的各项设置以及可能遇到的问题和解决方法,旨在为Python开发者提供一个全面且清晰的PyCharm安装指南。一、引言PyCharm是一款由JetBrains开发的功能强大......
  • Task03:数据类型和操作 Data Types and Opeartors
    Python数据类型与表达式:数据转换视角下的高效编程策略一、引言1.1研究背景在当今的编程领域,Python以其简洁性、易读性和强大的功能而备受青睐。Python数据类型与表达式在编程中具有至关重要的地位。Python的数据类型丰富多样,包括整型、浮点型、布尔型、None类型以及......
  • CE243 CSEE handling Task
    SchoolofComputerScienceandElectronicEngineering(CSEE)1CE243(NWU)Assignment1ObjectivesThisassignmentaimstodemonstrateyourmasterofadvancedCprogrammingskills.TheTaskYoushallwriteaCprogramtoimplementsometexthandlingtask.......
  • Datawhale 组队学习 文生图 Prompt攻防 task03随笔
    这期我们从不同角度切入探讨赛题的进阶思路思路1:对比不同大模型首先我们可以选择尝试不同的大模型,使用更复杂的大模型可以提高文本改写的质量和效果。随着模型大小的增加,其表示能力也随之增强,能够捕捉更细微的语言特征和语义信息。这意味着大型模型在理解和生成文本时可以更......
  • C#线程4---Task(任务并行库TPL)
     简介:   线程池的优势与不足:使用线程池可以使我们在减少并行度花销时节省操作系统资源。我们可以认为线程池是一个抽象层,其向程序员隐藏了使用线程的细节,使我们专心处理程序逻辑,而不是各种线程问题。但使用线程池也相当复杂。从线程池的工作者线程中获取结果并不容易。......
  • task.2
     ......
  • Stanford CS149 -- Assignment 2: Building A Task Execution Library from the Groun
    作业描述及代码参见:CS149-asst2PartAStep1只需要实现一个简单的任务系统,在run()的开始生成工作线程,并在run()返回之前从主线程合并这些线程。任务的分配方式采用动态分配,即每个线程每次取一个任务完成,能者多劳。每个线程的核心实现为:while(true){inttaskID=done+......
  • C++异步调用 future async promise packaged_task
    背景:C++异步调用是现代C++编程中的一种重要技术,它允许程序在等待某个任务完成时继续执行其他代码,从而提高程序的效率和响应性。C++11引入了std::async、std::future和std::promise等工具,使得异步编程变得更加方便和直观。以下是关于C++异步调用的详细介绍,包括基本概......