Camunda组件与服务与基本操作

文章目录

  • 下载与安装
  • Camunda Modeler
  • Download Camunda 7 Run
  • 与Spring Boot集成
  • 普通Java项目中集成Camunda
    • 手动部署流程
    • 查询流程
    • 启动流程实例
    • 完成任务
    • 删除流程定义
    • 查找历史节点信息

下载与安装

Camunda下载
Camunda7下载

有2个组件需要下载:

  1. Open Source Desktop Modeler,用于设计流程图
  2. Camunda 7 Community Edition,Community表示社区版

camunda modeler
camunda run
modeler与bpm-run

Camunda Modeler

Modeler目录:
Modeler目录

Modeler界面:
modeler操作界面

Download Camunda 7 Run

Download Camunda 7 Run可以直接部署Camunda服务,可以直接使用不用再做开发了

配置文件有default.yml、production.yml
camunda run配置文件

执行start脚本启动时,默认使用的是default.yml
camunda run目录

在配置文件中可以配置,用户和密码,默认都是demo:

camunda.bpm:admin-user:id: demopassword: demo

可以配置数据库,默认使用h2:

spring.datasource:url: jdbc:h2:./camunda-h2-default/process-engine;TRACE_LEVEL_FILE=0;DB_CLOSE_ON_EXIT=FALSEdriver-class-name: org.h2.Driverusername: sapassword: sa

指定数据库,可以通过SQL目录下的创建表SQL手动创建表:
camunda mysql
还需要将数据库驱动放在camunda-bpm-run\configuration\userlib目录下。

如果使用h2直接运行start脚本启动就可以:
登录页面
camunda 首页

Run相关配置文档

Camunda8文档

与Spring Boot集成

除了直接部署Camunda Run,还可以使用SpringBoot继承,可以通过下面的链接生成项目:

SpringBoot Camunda项目生成

生成项目和Camunda Run基本一样,可以通过application.yaml配置文件来进行配置。

默认配置:

spring.datasource.url: jdbc:h2:file:./camunda-h2-databasecamunda.bpm.admin-user:id: demopassword: demo

用户名和密码都是demo,数据库使用的是h2,默认是放在项目目录下

普通Java项目中集成Camunda

引入依赖:

<dependency><groupId>org.camunda.bpm</groupId><artifactId>camunda-engine</artifactId><version>7.15.0</version><scope>provided</scope>
</dependency>

在classpath中(如resources目录下)创建camunda.cfg.xml文件。

camunda配置文件

内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 默认id对应的值 为processEngineConfiguration --><bean id="processEngineConfiguration" class="org.camunda.bpm.engine.impl.cfg.StandaloneProcessEngineConfiguration"><property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"/><property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/clearn?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai&amp;useSSL=false&amp;nullCatalogMeansCurrent=true"/><property name="jdbcUsername" value="tim"/><property name="jdbcPassword" value="123456"/><property name="databaseSchemaUpdate" value="true"/></bean>
</beans>

databaseSchemaUpdate:

  1. true表示会检查更新Camunda相关表
  2. false表示检查相关版本是否匹配
  3. drop-create表示删除并重新创建表
  4. create-drop、drop-create、create表示要创建表

相关逻辑:

org.camunda.bpm.engine.impl.SchemaOperationsProcessEngineBuild#execute
org.activiti.engine.impl.db.DbSqlSession#performSchemaOperationsProcessEngineBuild
org.camunda.bpm.engine.impl.db.sql.DbSqlSession#isTablePresent
com.mysql.cj.jdbc.DatabaseMetaDataUsingInfoSchema#getTables
com.mysql.cj.jdbc.DatabaseMetaData#getDatabase

public String getResourceForDbOperation(String directory,String operation,String component) {String databaseType = dbSqlSessionFactory.getDatabaseType();return "org/activiti/db/" + directory + "/activiti." + databaseType + "." + operation + "." + component + ".sql";}
@Test
public void initCamundaTable() {//默认会使用classpath下的camunda.cfg.xml或activiti.cfg.xml创建processEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();System.out.println(processEngine);
}

如果配置文件不是:camunda.cfg.xml或activiti.cfg.xml

可以手动指定配置文件:

@Test
public void initCamundaTableUseSpecficConfigFile() {// 指定配置文件ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("custom.cfg.xml");ProcessEngine processEngine = configuration.buildProcessEngine();System.out.println(processEngine);
}

运行之前
运行之后,自动创建了相关表:
camunda表

手动部署流程

import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.ProcessEngines;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;import java.io.InputStream;
import java.util.zip.ZipInputStream;public class CamundaDeploymentTest {private static RepositoryService repositoryService;@BeforeAllpublic static void beforeAll() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();repositoryService = processEngine.getRepositoryService();}@Testpublic void deploy() {Deployment deployment = repositoryService.createDeployment().addClasspathResource("bpmn/javaservice.bpmn") // 添加bpmn资源.addClasspathResource("bpmn/javaservice.png")  // 添加png资源.name("javaservice").deploy();System.out.println("流程部署id:" + deployment.getId());System.out.println("流程部署名称:" + deployment.getName());}@Testpublic void deployZip() {// 可以直接部署压缩包资源InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("bpmn/javaservice.zip");assert inputStream != null;ZipInputStream zipInputStream = new ZipInputStream(inputStream);Deployment deployment = repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy();System.out.println("流程部署id:" + deployment.getId());System.out.println("流程部署名称:" + deployment.getName());}
}

查询流程

import org.apache.commons.io.IOUtils;
import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.ProcessEngines;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.repository.ProcessDefinition;
import org.camunda.bpm.engine.repository.ProcessDefinitionQuery;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;public class CamundaDeploymentQueryTest {private static RepositoryService repositoryService;@BeforeAllpublic static void beforeAll() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();repositoryService = processEngine.getRepositoryService();}/*** 查询流程定义*/@Testpublic void queryProcessDefinition() {ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();List<ProcessDefinition> definitionList = processDefinitionQuery.processDefinitionKey("Process_1ynfu43").orderByProcessDefinitionVersion().desc().list();for (ProcessDefinition processDefinition : definitionList) {System.out.println("流程定义 id=" + processDefinition.getId());System.out.println("流程定义 name=" + processDefinition.getName());System.out.println("流程定义 key=" + processDefinition.getKey());System.out.println("流程定义 Version=" + processDefinition.getVersion());System.out.println("流程部署ID =" + processDefinition.getDeploymentId());}}/*** 查找流程对应的只有* @throws IOException IO异常*/@Testpublic void queryBpmnResources() throws IOException {ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("Process_1ynfu43").singleResult();String deploymentId = processDefinition.getDeploymentId();try (FileOutputStream bpmnOut = new FileOutputStream("E:\\tmp\\jsv.bpmn");FileOutputStream pngOut = new FileOutputStream("E:\\tmp\\jsv.png");InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());) {IOUtils.copy(pngInput, pngOut);IOUtils.copy(bpmnInput, bpmnOut);}}
}

启动流程实例

import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.ProcessEngines;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.runtime.ProcessInstance;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;import java.util.HashMap;public class CamundaProcessTest {private static RuntimeService runtimeService;@BeforeAllpublic static void beforeAll() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();runtimeService = processEngine.getRuntimeService();}/*** 启动流程实例*/@Testpublic void startProcess() {HashMap<String, Object> params = new HashMap<>();params.put("number",101);ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("Process_1ynfu43",params);System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());System.out.println("流程实例id:" + processInstance.getId());}}

完成任务

import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.ProcessEngines;
import org.camunda.bpm.engine.TaskService;
import org.camunda.bpm.engine.task.Task;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;import java.util.HashMap;
import java.util.List;public class CamundaTaskTest {private static TaskService taskService;@BeforeAllpublic static void beforeAll() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();taskService = processEngine.getTaskService();}/*** 查询当前个人待执行的任务*/@Testpublic void taskList() {String assignee = "allen";
//        根据流程key 和 任务负责人 查询任务List<Task> list = taskService.createTaskQuery().processDefinitionKey("Process_1ynfu43") //流程Key.taskAssignee(assignee)//只查询该任务负责人的任务.list();for (Task task : list) {System.out.println("流程实例id:" + task.getProcessInstanceId());System.out.println("任务id:" + task.getId());System.out.println("任务负责人:" + task.getAssignee());System.out.println("任务名称:" + task.getName());}}// 完成任务@Testpublic void completTask() {Task task = taskService.createTaskQuery().processDefinitionKey("Process_1ynfu43") //流程Key.taskAssignee("allen")  //要查询的负责人.singleResult();
//        完成任务,参数:任务idHashMap<String, Object> params = new HashMap<>();params.put("approved",true);taskService.complete(task.getId(),params);}
}

删除流程定义

import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.ProcessEngines;
import org.camunda.bpm.engine.RepositoryService;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;public class CamundaDeleteTest {private static RepositoryService repositoryService;@BeforeAllpublic static void beforeAll() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();repositoryService = processEngine.getRepositoryService();}@Testpublic void deleteDeployment() {// 流程部署idString deploymentId = "1";//删除流程定义,如果该流程定义已有流程实例启动则删除不能删除repositoryService.deleteDeployment(deploymentId);}@Testpublic void deleteDeploymentCascade() {// 流程部署idString deploymentId = "1";// 级联删除流程定义,即使该流程有流程实例启动也可以删除repositoryService.deleteDeployment(deploymentId, true);}
}

查找历史节点信息

import org.camunda.bpm.engine.HistoryService;
import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.ProcessEngines;
import org.camunda.bpm.engine.history.HistoricActivityInstance;
import org.camunda.bpm.engine.history.HistoricActivityInstanceQuery;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;import java.util.List;public class CamundaHistoryTest {private static HistoryService historyService;@BeforeAllpublic static void beforeAll() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();historyService = processEngine.getHistoryService();}/*** 查看历史信息*/@Testpublic void findHistoryInfo() {HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();instanceQuery.processDefinitionId("pxxxxx");instanceQuery.orderByHistoricActivityInstanceStartTime().asc();List<HistoricActivityInstance> activityInstanceList = instanceQuery.list();for (HistoricActivityInstance hi : activityInstanceList) {System.out.println(hi.getActivityId());System.out.println(hi.getActivityName());System.out.println(hi.getProcessDefinitionId());System.out.println(hi.getProcessInstanceId());System.out.println("<==========================>");}}
}

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

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

相关文章

代码随想录算法刷题训练营day19

代码随想录算法刷题训练营day19&#xff1a;LeetCode(404)左叶子之和、LeetCode(112)路径总和、LeetCode(113)路径总和 II、LeetCode(105)从前序与中序遍历序列构造二叉树、LeetCode(106)从中序与后序遍历序列构造二叉树 LeetCode(404)左叶子之和 题目 代码 /*** Definitio…

JMeter GUI:测试计划和工作台

什么是测试计划&#xff1f; 测试计划是您添加 JMeter 测试所需元素的地方。 它存储运行所需测试所需的所有元素&#xff08;如线程组、计时器等&#xff09;及其相应的设置。 下图显示了测试计划的示例 测试计划是您添加 JMeter 测试所需元素的地方。 它存储运行所需测试…

自然语言nlp学习 三

4-8 Prompt-Learning--应用_哔哩哔哩_bilibili Prompt Learning&#xff08;提示学习&#xff09;是近年来在自然语言处理领域中&#xff0c;特别是在预训练-微调范式下的一个热门研究方向。它主要与大规模预训练模型如GPT系列、BERT等的应用密切相关。 在传统的微调过程中&a…

fgets函数和fputs函数的使用

----由于本人使用的是大白话来讲解fgets和fputs函数的使用&#xff0c;所以可能有些部分可能会有些不准确&#xff08;见谅&#xff09;&#xff0c;如果想十分严谨的了解fgets和fputs函数&#xff0c;可以移步其他文章。 -----那么不废话&#xff0c;直接开始 1.fgets函数 &a…

05. 交换机的基本配置

文章目录 一. 初识交换机1.1. 交换机的概述1.2. Ethernet_ll格式1.3. MAC分类1.4. 冲突域1.5. 广播域1.6. 交换机的原理1.7. 交换机的3种转发行为 二. 初识ARP2.1. ARP概述2.2. ARP报文格式2.3. ARP的分类2.4. 免费ARP的作用 三. 实验专题3.1. 实验1&#xff1a;交换机的基本原…

海外云手机为什么吸引用户?

近年来&#xff0c;随着全球化的飞速发展&#xff0c;海外云手机逐渐成为各行各业关注的焦点。那么&#xff0c;究竟是什么让海外云手机如此吸引用户呢&#xff1f;本文将深入探讨海外云手机的三大吸引力&#xff0c;揭示海外云手机的优势所在。 1. 高效的社交媒体运营 海外云…

IDEA安装MyBatisX插件

IDEA工具在开发人员中经常使用&#xff0c;从dao层到xml文件对应的查看很费劲&#xff0c;这时候就有相应的插件工具出现了MyBatisX。他的好处如下&#xff1a; mapper and xml can jump back and forth mybatis.xml,mapper.xml prompt mapper and xml support auto prompt lik…

MATLAB知识点:创建MATLAB的脚本

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第2章 在实际应用中&#xff0c;直接在命令行窗口中输…

PaddleNLP的简单使用

1 介绍 PaddleNLP是一个基于PaddlePaddle深度学习平台的自然语言处理&#xff08;NLP&#xff09;工具库。 它提供了一系列用于文本处理、文本分类、情感分析、文本生成等任务的预训练模型、模型组件和工具函数。 PaddleNLP有统一的应用范式&#xff1a;通过 paddlenlp.Task…

JavaWeb后端登录校验功能(JWT令牌技术,Cookie技术,Session,拦截技术,过滤器)

目录 一.登录校验功能&#xff08;解决直接通过路径访问&#xff09; 1.实现思路 二.会话技术 ​编辑 1.Cookie技术 2.Session 3.令牌技术 1.简介 2.如何生成和解析 3.令牌的使用 三.Filter过滤器 1.什么是过滤器 2.实现步骤&#xff1a; 3.过滤器执行流程 4.拦截路径 5.过…

Microsoft Edge 浏览器报错 提示不安全

网站提示不安全 是因为 Microsoft Edge 开了安全过滤 我们需要把这个关掉 打开浏览器的设置&#xff0c;然后 找到隐私选项 找到下边的Microsoft Defender Smartscreen 关掉 Microsoft Edge 支持 Microsoft Defender SmartScreen | Microsoft Learn win10系统下打开网页提示…

[ESXi 8]安装centos7

文章目录 创建虚拟机创建虚拟机选择centos7选择存储选择镜像文件上传ios镜像文件 安装即将完成 启动虚拟机自动获取ip设置root密码安装成功 创建虚拟机 创建虚拟机 选择centos7 选择存储 选择镜像文件 上传ios镜像文件 如图显示上传进度&#xff0c;上传完毕之后&#xff0c;将…