【2025】camunda API接口介绍以及REST接口使用(3)

前言

在前面的两篇文章我们介绍了Camunda的web端和camunda-modeler的使用。这篇文章主要介绍camunda结合springboot进行使用,以及相关api介绍。

该专栏主要为介绍camunda的学习和使用

  • 🍅【2024】Camunda常用功能基本详细介绍和使用-下(1)
  • 🍓【2024】Camunda常用功能基本详细介绍和使用(业务决策和定时事件)-下(2)
  • 🍇【2025】camunda API接口介绍以及REST接口使用(3)

一、项目搭建

1、依赖引入

先创建好一个springboot项目,这里依旧使用的camunda7.20的版本,然后jdk使用的是17的版本,springboot版本使用的是3.3.0。这里可以根据自己的项目情况去跟换camunda7.20版本。可以在官方文档查看版本适配。
尽量选择适配的避免增加不必要的麻烦!

➡️官网地址
在这里插入图片描述

在这里插入图片描述

依赖我主要添加了几个camunda引擎还有web页面以及rest接口和openapi的几个依赖;数据库用的是mysql的数据库;swagger文档用了knife4j的。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.zheng</groupId><artifactId>camunda-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>camunda-demo</name><description>camunda-demo</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version><camunda.version>7.20.0</camunda.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--        camunda相关 依赖-->
<!--        引擎--><dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter</artifactId><version>${camunda.version}</version></dependency>
<!--        web ui界面--><dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId><version>${camunda.version}</version></dependency>
<!--        rest接口--><dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boot-starter-rest</artifactId><version>${camunda.version}</version></dependency>
<!--       openapi 文档 --><dependency><groupId>org.camunda.bpm</groupId><artifactId>camunda-engine-rest-openapi</artifactId><version>${camunda.version}</version></dependency><!-- swagger文档--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.4.0</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</artifactId><version>4.4.0</version></dependency><!--       mysql 数据库--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.32</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><annotationProcessorPaths><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></path></annotationProcessorPaths></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

2、配置文件

2.1、yaml配置文件

主要配置了数据库连接配置,camunda基础配置,以及swagger相关配置

server:port: 8090spring:application:name: camunda-demo# 数据库配置datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/camunda?nullDatabaseMeansCurrent=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=falseusername: rootpassword: 123456type: com.mysql.cj.jdbc.MysqlDataSource# camunda基础配置
camunda.bpm:
#  auto-deployment-enabled: false #如果不是第一次启动可以把这个打开,避免每次去检查自动部署数据库admin-user:id: admin  #用户名password: 123456  #密码firstName: yufilter:create: All tasksgeneric-properties:# 历史生存时间properties:historyTimeToLive: P10D# swagger文档配置
springdoc:swagger-ui:path: /swagger-ui.htmltags-sorter: alphaoperations-sorter: alphaurls:- url: /openapi.json # camunda中编写好的api的文档信息name: camunda- url: /v3/api-docs  # 咱们自己在项目中自定义的文档信息name: camundaapi-docs:path: /v3/api-docsenabled: true

2.2、添加openapi.json

把依赖下载下来之后我们需要到camunda-engine-rest-openapi把openapi.json文件添加到resources.static目录下供配置文件读取

在这里插入图片描述
存放位置
在这里插入图片描述

3、验证

  1. 启动项目,访问
    http://localhost:8090/camunda/app/cockpit/default/#/dashboard
    使用自己yaml配置的 账号 密码登陆则代表页面成功
    在这里插入图片描述

  2. 访问swagger
    http://localhost:8090/swagger-ui/index.html
    需要把端口改为自己的端口,或者直接修改openapi.json文件
    在这里插入图片描述

  3. doc.html访问
    http://localhost:8090/doc.html#/home登陆,然后还需要修改这个地方,改为实际地址的前缀

在这里插入图片描述

二、REST API介绍

1、Camunda API介绍

中心起点是 ProcessEngine,可以通过配置部分中描述的几种方式创建。从 ProcessEngine,您可以获取包含工作流/BPM 方法的各种服务。ProcessEngine 和服务对象是线程安全的。因此,您可以为整个服务器保留对其中一个的引用。

在这里插入图片描述
ProcessEngines.getDefaultProcessEngine()将在第一次调用时初始化并构建流程引擎,之后始终返回相同的流程引擎。可以使用 和 正确创建和关闭所有流程ProcessEngines.init()引擎ProcessEngines.destroy()。
在这里插入图片描述

创建流程引擎的时候我们要知道一点,所有流程引擎服务都是无状态的。这意味着您可以轻松地在集群中的多个节点上运行 Camunda 7,每个节点都访问同一个数据库,而不必担心哪台机器实际执行了之前的调用。对任何服务的任何调用都是幂等的,无论它在何处执行。

下面就是我们流程引擎内部的api service,这些service都注入到bean容器里面去了,我们可以直接跟其他的接口一样,使用spring的方式在使用时直接引入

常用介绍:

  • RepositoryService:RepositoryService是你与Camunda引擎交互的第一个切入点。它主要用于管理流程定义的部署,包括上传流程定义文件(如BPMN文件)到引擎中。
    • 部署和管理流程定义
    • 查询已部署的流程定义和部署信息
    • 挂起和激活流程定义,控制其是否可以被启动
    • 检索流程定义中的文件和流程图。
  • RuntimeService:RuntimeService是用于在流程执行期间与引擎交互的服务。它允许启动流程实例,并且可以查询正在执行的流程实例状态
    • 启动流程实例
    • 存储和检索流程实例的变量。
    • 查询正在执行的流程实例和执行实例(指向流程实例当前位置的“令牌”)
    • 处理流程实例的外部触发。
  • TaskService:TaskService专注于管理流程中的任务,特别是那些需要人为干预的任务。
    • 查询分配给用户的任务。
    • 创建新的任务,这些任务可以独立于任何流程实例。
    • 分配任务给用户或组。
    • 认领和完成任务。
  • IdentityService:IdentityService提供了管理用户和组的功能,但请注意,核心引擎并不会在运行时验证用户身份。
    • 创建、更新、删除和查询用户和组。
    • 尽管可以将任务分配给任何用户,但实际的身份验证和授权需在应用层实现。
  • FormService:FormService是可选的,它支持流程中的表单功能,比如启动流程前展示的表单或任务完成时所需的表单。
    • 管理和渲染开始表单和任务表单。
    • 表单数据与流程变量的交互。
  • HistoryService:HistoryService提供了访问流程执行历史记录的功能。
    • 查询流程实例的历史数据,如开始时间、执行用户、任务耗时等
    • 数据持久化级别可配置
  • FilterService:FilterService允许创建和管理过滤器,用于简化常见的查询需求
    • 创建存储的查询,如任务查询。
    • Tasklist应用使用过滤器来筛选任务。
  • ExternalTaskService:ExternalTaskService专门处理外部任务,即在流程引擎之外执行的工作项。
    • 提供对流程外部任务的访问和管理
    • 支持异步处理模式下的任务领取和完成。

2、常用API详细使用

2.1、 RepositoryService

下面的查询接口我们要知道一点,如ProcessDefinition这个返回出来的实际是使用多态,实际的实体对象会是ProcessDefinitionEntity,Camunda中全部的api返回都是这个格式,要查看实体对象则需要加Entity

	//    管理流程定义相关的api@Autowiredprivate RepositoryService repositoryService;/*** 流程部署*/@Testvoid testRepositoryService(){//        添加流程/** 表示把test.bpmn作为流程部署到数据库设置name为test** *///        Deployment deployment = repositoryService.createDeployment() //添加流程部署记录 ACT_RE_DEPLOYMENT//                .name("test")   //name//                .addClasspathResource("test.bpmn")   //文件地址//                .deploy(); //添加流程定义 实际数据 ACT_RE_PROCDEF//        查询 流程部署 数据执行器 ACT_RE_PROCDEFProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();//        返回全部数据List<ProcessDefinition> processDefinitionList = processDefinitionQuery.list();processDefinitionList.forEach(it-> System.out.println(it.getName()));//        根据key查询返回符合的流程定义列表(每一个版本算一条记录)List<ProcessDefinition> processDefinitionList2 = processDefinitionQuery.processDefinitionKey("shopping").list();//        根据流程name查询,并且按照版本号查询最新的数据ProcessDefinition processDefinition = processDefinitionQuery.processDefinitionName("shopping").latestVersion().singleResult();//        查询 流程定义 数据执行器 ACT_RE_DEPLOYMENTDeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();List<Deployment> deploymentList = deploymentQuery.list();List<Resource> resourceList = repositoryService.getDeploymentResources("036d2809-b795-11ef-9e74-46c5fd5dfd3a");System.out.println(resourceList);List<CaseDefinition> caseDefinitionList = repositoryService.createCaseDefinitionQuery().list();System.out.println(caseDefinitionList);//        查询ACT_RE_DECISION_DEFList<DecisionDefinition> decisionDefinitionList = repositoryService.createDecisionDefinitionQuery().list();System.out.println(decisionDefinitionList);List<DecisionRequirementsDefinition> decisionRequirementsDefinitionList = repositoryService.createDecisionRequirementsDefinitionQuery().list();System.out.println(decisionRequirementsDefinitionList);        根据流程定义删除数据//        repositoryService.deleteDeployment("WorkOrderProcess:4:3659eb47-b794-11ef-9e74-46c5fd5dfd3a",true);//        根据流程部署id删除数据//        repositoryService.deleteProcessDefinition("db155b13-b793-11ef-9e74-46c5fd5dfd3a");}

2.2、TaskService

	//    查询流程中的任务相关的api@Autowiredprivate TaskService taskService;/*** 任务查询*/@Testvoid testTaskService() {taskService.createTaskQuery();//        Java 对象查询 数据执行器 ACT_RU_TASKTaskQuery taskQuery = taskService.createTaskQuery();List<Task> taskList1 = taskQuery.list();taskList1.forEach(task -> System.out.println(task.getName()));//        根据用户查询代办任务List<Task> taskList2 = taskQuery.taskAssignee("admin").list();System.out.println(taskList2);//        Native sql 查询 数据执行器NativeTaskQuery nativeTaskQuery = taskService.createNativeTaskQuery();List<Task> taskList3 = nativeTaskQuery.sql("SELECT * from ACT_RU_TASK").list();taskList3.forEach(task -> System.out.println(task.getName()));taskList3.forEach(task -> System.out.println(task.getName()));}

2.3、RuntimeService

	//    管理流程实例相关的api@Autowiredprivate RuntimeService runtimeService;@Testvoid testRuntimeService(){//        查询 (执行在流程上的每一种结果)   Execution可以代表这个执行过程中的某一个分支或上下文List<Execution> executionList = runtimeService.createExecutionQuery().list();System.out.println(executionList);//        获取查询流程实例  ProcessInstance表示整个流程的一次完整执行List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery().list();//        查询当前正在活动的任务ActivityInstance activityInstance = runtimeService.getActivityInstance("86f6ef7d-b935-11ef-8a29-46c5fd5dfd3a");System.out.println(activityInstance);//        根据任务id查询任务参数Map<String, Object> variables = runtimeService.getVariables("86f6ef7d-b935-11ef-8a29-46c5fd5dfd3a");}

3、REAT API介绍使用

很多时候我们在开发的项目过程中不想和工作流引擎过于紧密,我们通常可能需要做到解耦合。在其他的服务通过调用camunda的Open API的方式去获取工作流中的相关数据,这时候我们就需要了解常用到的API接口,这时候我们可能需要获取到对应的接口的实体接收类,但又不想添加工作流引擎的依赖,这时候我们需要添加两个依赖。

3.1、依赖

添加这两个依赖,这两个依赖主要是一些实体类和API接口的相关参数

<!--        实体对象--><dependency><groupId>org.camunda.bpm</groupId><artifactId>camunda-engine-spring-6</artifactId><version>7.20.0</version></dependency><!--        open api接口以及相关的DTO对象--><dependency><groupId>org.camunda.bpm</groupId><artifactId>camunda-engine-rest-core-jakarta</artifactId><version>7.20.0</version></dependency>

3.2、REST API接口介绍

我们打开camunda-engine-rest-core-jakarta依赖的sub包下的对应的这些文件夹是不是很熟悉,是的这些文件夹就是对应的Camunda API中的service名字。
分别对应着task、runtime、repository、management、identity、history 六个service,每个service的具体的介绍就看上面就行。

在这里插入图片描述

3.2.1、接口介绍

这里介绍一下task,可以看到不同的接口文件分别是表示一个分类。对应着task相关的接口。可以看到这里的一个类对应着swagger 中接口文档的一个类

在这里插入图片描述

  • TaskResource
    文件中的TaskResource类就是对应的swagger的task,@GET注解表示请求方式,@Path表示路径,@Path表示拼接的路径后缀。
    在这里插入图片描述

在这里插入图片描述

  • TaskAttachmentResource
    这个就可以很明显看到他们的区别
    在这里插入图片描述

在这里插入图片描述

3.2.2、接口组成

以这个接口举例

http://localhost:8080/engine-rest/task/47398c44-bab7-11ef-81ba-024191f3177f/form

  • http://localhost:8080/engine-rest:是服务和统一的路径,不用管
  • task:表示这个类名的前缀
  • 47398c44-bab7-11ef-81ba-024191f3177f:{id}是我们传入的路径参数,还没到接口的位置就被解析了,所以在这个位置没有参数
  • form:表示接口的路径

所以我们接收的参数就是FormDto对象,一般可以直接使用,有部分是内部还包裹着的类属性就不能直接使用,需要做自己去声明对应的属性。

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/68047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java进阶学习之路

Java进阶之路 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 Java进阶之路前言一、Java入门 Java基础 1、Java概述 1.1 什…

JAVA安全—反射机制攻击链类对象成员变量方法构造方法

前言 还是JAVA安全&#xff0c;哎&#xff0c;真的讲不完&#xff0c;太多啦。 今天主要是讲一下JAVA中的反射机制&#xff0c;因为反序列化的利用基本都是要用到这个反射机制&#xff0c;还有一些攻击链条的构造&#xff0c;也会用到&#xff0c;所以就讲一下。 什么是反射…

DeepSeek-R1 论文解读:强化学习如何 “炼” 出超强推理模型?

深度解析DeepSeek-R1&#xff1a;强化学习驱动大语言模型推理能力新突破 论文链接&#xff1a;DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 在大语言模型&#xff08;LLMs&#xff09;飞速发展的当下&#xff0c;提升模型推理能力成…

【数据结构】循环链表

循环链表 单链表局限性单向循环链表判断链表是否有环思路code 找到链表入口思路代码结构与逻辑 code 单链表局限性 单链表作为一种基本的数据结构&#xff0c;虽然在很多场景下都非常有用&#xff0c;但它也存在一些局限性&#xff1a; 单向访问&#xff1a;由于每个节点仅包含…

ip属地是手机号还是手机位置?一文理清

在数字化和网络化的今天&#xff0c;IP属地这一概念逐渐成为了人们关注的焦点。特别是在社交媒体和在线平台上&#xff0c;IP属地的显示往往让人联想到用户的地理位置。然而&#xff0c;关于IP属地到底与手机号还是手机位置有关&#xff0c;却存在着不少误解和混淆。本文将深入…

离散时间傅里叶变换(DTFT)公式详解:周期性与连续性剖析

摘要 离散时间傅里叶变换&#xff08;DTFT&#xff09;是数字信号处理领域的重要工具&#xff0c;它能将离散时间信号从时域转换到频域&#xff0c;揭示信号的频率特性。本文将深入解读DTFT公式&#xff0c;详细阐述其具有周期性和连续性的原因&#xff0c;帮助读者全面理解DT…

哈希表与散列表的原理及C++实现

1. 什么是哈希表&#xff1f; 哈希表&#xff08;Hash Table&#xff09;是一种高效的数据结构&#xff0c;用于存储键值对&#xff08;Key-Value Pairs&#xff09;。它通过哈希函数&#xff08;Hash Function&#xff09;将键&#xff08;Key&#xff09;映射到一个固定大小…

图像分类与目标检测算法

在计算机视觉领域&#xff0c;图像分类与目标检测是两项至关重要的技术。它们通过对图像进行深入解析和理解&#xff0c;为各种应用场景提供了强大的支持。本文将详细介绍这两项技术的算法原理、技术进展以及当前的落地应用。 一、图像分类算法 图像分类是指将输入的图像划分为…

数字化转型:概念性名词浅谈(第四讲)

​大家好&#xff0c;本篇文章是在新年之际写的&#xff0c;所以在这里先给大家拜个年。 今天要介绍的名词为ETL: ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transfor…

UVM factory机制

目录 1. factory-register 1.1 uvm_object_registry#(type T=uvm_object, string Tname="") 1.1 uvm_default_factory::register 2. factory-override 2.1 set_type_override(uvm_object_wrapper override_type) 2.2 set_inst_override(uvm_object_wrapper ove…

奥迪改名风波再起,A6L能否率队创下新奇迹

文/王俣祺 导语&#xff1a;春节假期刚过&#xff0c;奥迪的车型命名规则又变了。在如今以内卷为主基调的环境下&#xff0c;车型改名可不是小事&#xff0c;而奥迪的这次调整背后藏着许多深意&#xff0c;也预示着2025年奥迪在产品布局上的新动向。 改名能否“改命” 回溯到…

改进Transformer,解读Tokenformer论文:基于参数分词化重新思考Transformer的扩展策略

Transformer 训练成本高昂的问题日益凸显&#xff0c;不仅需要耗费巨额的资金与大量的计算资源&#xff0c;还对环境产生了不可忽视的影响&#xff0c;最近由北京大学与谷歌联合发表的一篇论文&#xff0c;为这一棘手难题带来了全新的曙光。论文中提出的创新方案&#xff0c;有…

【STM32】HAL库USB虚拟U盘MSC配置及采用自带的Flash作为文件系统

【STM32】HAL库USB虚拟U盘MSC实现配置及采用自带的Flash作为文件系统 本文将自带的Flash作为文件系统 通过配置USB的MSC功能实现虚拟U盘 没有单独建立FATFS文件系统 仅仅是配置USB和Flash读写而已 当然 这里也可以用外部Flash等等 也可以配置文件系统来进行套壳 但总体而言不如…

Nginx通过设置自定义标记识别代理调用

Nginx通过设置自定义标记识别代理调用 业务场景 最近遇到一个业务场景&#xff0c;部署在云端服务器的一个平台&#xff0c;接口提供给多个现场调用&#xff0c;其中一个现场是通过nginx代理服务器代理转发到云服务器&#xff0c;另外一个现场则是直接通过云服务器接口进行调…

【DeepSeek系列】01 DeepSeek-V1 快速入门

1、DeepSeek简介 2024年底&#xff0c;DeepSeek 相继推出了其第一代推理大模型&#xff1a;DeepSeek-R1-Zero 和 DeepSeek-R1。 DeepSeek-R1-Zero 是一个通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;训练过程中没有使用监督微调&#xff08;SFT&…

基于LabVIEW的Modbus-RTU设备通信失败问题分析与解决

在使用 LabVIEW 通过 Modbus-RTU 协议与工业设备进行通信时&#xff0c;可能遇到无法正常发送或接收指令的问题。常见原因包括协议参数配置错误、硬件连接问题、数据帧格式不正确等。本文以某 RGBW 控制器调光失败为例&#xff0c;提出了一种通用的排查思路&#xff0c;帮助开发…

密云生活的初体验

【】在《岁末随笔之碎碎念》里&#xff0c;我通告了自己搬新家的事情。乙巳年开始&#xff0c;我慢慢与大家分享自己买房装修以及在新家的居住体验等情况。 跳过买房装修的内容&#xff0c;今天先说说这三个月的生活体验。 【白河】 潮白河是海河水系五大河之一&#xff0c;贯穿…

Python爬虫:1药城店铺爬虫(完整代码)

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

openwebui入门

1 简介 ‌Open WebUI‌&#xff08;网址是openwebui.com&#xff09;是一个高度可扩展、功能强大且用户友好的自托管Web用户界面&#xff0c;专为完全离线操作设计&#xff0c;编程语言是python。它支持对接Ollama和OpenAI兼容的API的大模型。‌ Open WebUI‌在架构上是一种中…

Day36-【13003】短文,数组的行主序方式,矩阵的压缩存储,对称、三角、稀疏矩阵和三元组线性表,广义表求长度、深度、表头、表尾等

文章目录 本次课程内容第四章 数组、广义表和串第一节 数组及广义表数组的基本操作数组的顺序存储方式-借用矩阵行列式概念二维数组C语言对应的函数-通常行主序方式 矩阵的压缩存储对称矩阵和三角矩阵压缩存储后&#xff0c;采用不同的映射函数稀疏矩阵-可以构成三元组线性表三…