springCloud集成activiti5.22.0流程引擎

springCloud集成activiti5.22.0流程引擎

   点关注不迷路,欢迎再访!	

精简博客内容,尽量已行业术语来分享。
努力做到对每一位认可自己的读者负责。
帮助别人的同时更是丰富自己的良机。

小编最近工作需要涉及到流程,由于网络上5.22版本资料最多,所以选用了5.22版本作为项目集成。

文章目录

    • springCloud集成activiti5.22.0流程引擎
      • 一.Activiti表介绍
        • 1 .表前缀说明
      • 二.Spring boot2.x与Activiti 5.22.0整合
        • 1.POM文件中添加依赖
        • 2.启动类配置
        • 3.ActivitiConfiguration 配置
        • 4.封装activiti工具类
      • 三.制作bpmn流程文件
        • 1.安装actiBPM插件
        • 2.创建bpmn文件
        • 3.生成png文件
      • 四.流程演示
        • 1.流程定义
        • 2.启动流程
        • 3.查询我的待办
        • 4.完成任务

一.Activiti表介绍

不同版本的activiti自带表是不一样的,其实我们也不用去关心不同版本的activiti需要那些表,只要配置好数据源,系统启动的时候,会去检查数据库是否包含这些数据库表,如果没有会自动去创建这些表。下面先介绍简单介绍一下,这些表的含义。

表关系图介博客(引用):https://blog.csdn.net/claram/article/details/73277358

1 .表前缀说明
ACT_RE RE表示Repository资源库,保存流程定义,模型等设计阶段的数据。
ACT_RU RU表示Runtime运行时,保存流程实例,任务,变量等运行阶段的数据。
ACT_HI 表示History历史,保存历史实例,历史任务等流程历史数据。
ACT_ID ID表示Identity身份,保存用户,群组,关系等组织机构相关数据(Activiti中的组织机构过于简单,仅用于演示。) 。
ACT_GE GE表示General通用,属于一些通用配置。
其他 ACT_EVT_LOGACT_PROCDEF_INFO没有按照规则来,两者分别属于HIRE

二.Spring boot2.x与Activiti 5.22.0整合

1.POM文件中添加依赖
<dependency>
		<groupId>org.activiti</groupId>
			<artifactId>activiti-spring-boot-starter-basic</artifactId>
		<version>5.22.0</version>
		<exclusions>
		<!-- 排除activiti的mybatis,避免和外面的mybatis-plus冲突 -->
			<exclusion>
				<artifactId>mybatis</artifactId>
				<groupId>org.mybatis</groupId>
			</exclusion>
		</exclusions>
</dependency>
2.启动类配置

注意:SecurityAutoConfiguration.class导入的包是activiti的

/**
*因为GlobalAuthenticationConfigurerAdapter  是spring-boot-starter-security 依赖中的属于安全配置类,  而 引入的activiti-spring-boot-starter-basic 依赖中存在了一个自动安全配置类,  两个安全配置,  所以排除掉 activiti-spring-boot-starter-basic中的安全配置类  SecurityAutoConfiguration
*/
@EnableAutoConfiguration(exclude={org.activiti.spring.boot.SecurityAutoConfiguration.class})
@SpringCloudApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}
3.ActivitiConfiguration 配置
@Configuration
public class ActivitiConfiguration {

    @Autowired
    private DataSource dataSource;
    @Autowired
    private PlatformTransactionManager platformTransactionManager;

    public ActivitiConfiguration() {
    }

    //通过@Bean注解将SpringProcessEngineConfiguration实例声明为Spring Bean,使其可供其他组件注入和使用
    @Bean
    public SpringProcessEngineConfiguration springProcessEngineConfiguration() {
        SpringProcessEngineConfiguration spec = new SpringProcessEngineConfiguration();
        //设置数据源,将注入的数据源设置到SpringProcessEngineConfiguration实例中
        spec.setDataSource(this.dataSource);
        //设置事务管理器将注入的事务管理器设置到SpringProcessEngineConfiguration实例中
        spec.setTransactionManager(this.platformTransactionManager);
        //设置数据库模式更新策略 true表示在启动时自动创建或更新Activiti引擎所需的数据库表结构
        spec.setDatabaseSchemaUpdate("true");
        Resource[] resources = null;
        //配置流程部署资源
        //使用PathMatchingResourcePatternResolver从classpath中的bpmn目录下加载所有以.bpmn为扩展名的文件作为流程定义资源,
        // 并将它们设置到SpringProcessEngineConfiguration实例中。
        try {
            resources = (new PathMatchingResourcePatternResolver()).getResources("processes/*.bpmn");
        } catch (IOException var4) {
            var4.printStackTrace();
        }

        spec.setDeploymentResources(resources);
        return spec;
    }
}

注意:启动项目后,如果并未自动创建表
在使用mysql-connect 8.+以上版本的时候需要添加nullCatalogMeansCurrent=true参数,否则在使用mybatis-generator生成表对应的xml等时会扫描整个服务器里面的全部数据库中的表,而不是扫描对应数据库的表

4.封装activiti工具类
/**
 * 载入 BPMN 文件并部署流程定义
 */
@Slf4j
@Component
public class QuestWorkFlowUtils {

	@Autowired
	private RepositoryService repositoryService;
	@Autowired
	private RuntimeService runtimeService;

	/**
	 * 声明定义流程
	 * @return
	 */
	public String createProcessDefinition() throws FileNotFoundException {
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		Deployment deployment = processEngine.getRepositoryService()
				.createDeployment()
				.addClasspathResource("processes/quest_flow.bpmn")
				.addClasspathResource("processes/quest_flow.png")
				.deploy();
		return deployment.getId();
	}

	/**
	 * 启动流程
	 * @param userId  用户ID
	 * @return
	 */
	public ProcessInstance createProcessInstance(String userId){
		//启动流程时传递的参数列表 这里根据实际情况 也可以选择不传
		Map<String, Object> variables = new HashMap<String, Object>();
		variables.put("userId", userId);
		// 根据流程定义ID查询流程定义  process_test:1:10004部署的流程定义的id
		ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
				.processDefinitionId("quest_flow:1:10004")     //act_re_procdef主键ID
				.singleResult();

		// 获取流程定义的Key
		String processDefinitionKey = processDefinition.getKey();
		//定义businessKey  businessKey一般为流程实例key与实际业务数据的结合
		String businessKey = processDefinitionKey + ":" + "001";
		//设置启动流程的人
		Authentication.setAuthenticatedUserId("sysadmin");
		ProcessInstance processInstance = this.runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
		System.out.println("流程启动成功:" + processInstance);
		return processInstance;
	}

	/**
	 * 我的待办
	 * @param userId  用户ID
	 * @param processDefinitionKey  定义流程key
	 * @return
	 */
	public List<Task> getProcessEngineList(String userId,String processDefinitionKey){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		TaskService taskService = processEngine.getTaskService();
		List<Task> list = taskService.createTaskQuery()
				.processDefinitionKey(processDefinitionKey)
				.taskAssignee(userId)
				.list();
		for (Task task : list) {
			System.out.println("流程实例id = " + task.getProcessInstanceId());
			System.out.println("任务id = " + task.getId());
			System.out.println("任务负责人id = " + task.getAssignee());
			System.out.println("任务名称 = " + task.getName());
		}
		return list;
	}

	/**
	 * 通过taskId办理任务
	 * @param taskId  流程任务ID
	 */
	public void getProcessEngine(String taskId,Map<String, Object> variables){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		processEngine.getTaskService().complete(taskId,variables);
	}

	/**
	 * 完成任务
	 * @return
	 */
	public void finishProcessTask(){
		// 1.获取流程引擎
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		// 2.获取taskService
		TaskService taskService = processEngine.getTaskService();
		Task task = taskService.createTaskQuery()
				.processDefinitionKey("quest_work")
				.taskAssignee("sysadmin")
				.singleResult();
		taskService.complete(task.getId());
	}

	/**
	 * 查看流程图附件
	 * @param deploymentId  流程定义ID
	 */
	public void get(String deploymentId){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
		List<String> resourceNames = processEngine.getRepositoryService()
				.getDeploymentResourceNames(deploymentId);
		resourceNames.forEach(resourceName -> {
			System.err.println(resourceName);
			File file = new File("e:/" + resourceName);
			InputStream inputStream = processEngine.getRepositoryService()
					.getResourceAsStream(deploymentId, resourceName);
			try {
				FileOutputStream fileOutputStream = new FileOutputStream(file);
				byte[] bytes = new byte[1024];
				while (inputStream.read(bytes) > 0) {
					fileOutputStream.write(bytes);
				}
				fileOutputStream.flush();
				inputStream.close();
				fileOutputStream.close();
			} catch (Exception e) {

			}
		});
	}

	/**
	 * 撤销任务
	 * @param processInstanceId  流程实例ID
     * @param deleteReason  原因
	 */
	public void deleteProcessTask(String processInstanceId, String deleteReason){
		runtimeService.deleteProcessInstance(processInstanceId,deleteReason);
	}
}

三.制作bpmn流程文件

1.安装actiBPM插件

地址: https://plugins.jetbrains.com/
搜索: actiBPM
在这里插入图片描述

IDEA 插件安装 File->Settings->Plugins 安装新插件actiBPM插件
可能出现查找不到该插件的情况,则可以actiBPM下载通过插件jar文件本地安装
!](https://img-blog.csdnimg.cn/direct/25b563d7703f4d11952886d2857c4864.png)

2.创建bpmn文件

右键该文件夹New–>BPMN File 创建名为quest_flow的流程文件
在这里插入图片描述
文件名"xxx.bpmn" 更改为 “xxx.bpmn.xml”
注: 因为activiti的默认流程图格式是bpmn, 但是idea必须xml格式才能生成图片, 所以改为这样, 后面部署流程的时候才可以部署上去, 否则是存不进数据库.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1713244634324" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">
  <process id="quest_work" isClosed="false" isExecutable="true" processType="None">
    <startEvent id="STEP1" name="开始"/>
    <endEvent id="STEP3" name="结束"/>
    <userTask activiti:assignee="${userId}" activiti:exclusive="true" id="STEP2" name="问卷人员"/>
    <sequenceFlow id="_5" sourceRef="STEP1" targetRef="STEP2"/>
    <sequenceFlow id="_6" sourceRef="STEP2" targetRef="STEP3"/>
  </process>
  <bpmndi:BPMNDiagram documentation="background=#3C3F41;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram">
    <bpmndi:BPMNPlane bpmnElement="quest_work">
      <bpmndi:BPMNShape bpmnElement="STEP1" id="Shape-STEP1">
        <omgdc:Bounds height="32.0" width="32.0" x="200.0" y="40.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="STEP3" id="Shape-STEP3">
        <omgdc:Bounds height="32.0" width="32.0" x="200.0" y="340.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="STEP2" id="Shape-STEP2">
        <omgdc:Bounds height="55.0" width="85.0" x="175.0" y="170.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="_5" id="BPMNEdge__5" sourceElement="_2" targetElement="_4">
        <omgdi:waypoint x="216.0" y="72.0"/>
        <omgdi:waypoint x="216.0" y="170.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="_6" id="BPMNEdge__6" sourceElement="_4" targetElement="_3">
        <omgdi:waypoint x="216.0" y="225.0"/>
        <omgdi:waypoint x="216.0" y="340.0"/>
        <bpmndi:BPMNLabel>
          <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>
3.生成png文件

右键更改后文件 Diagrams–>Show BPMN 2.0 Designer…
在这里插入图片描述

四.流程演示

1.流程定义

自动部署:将bpmn文件放到resources下的processes下,启动时会自动部署
在这里插入图片描述
查看数据库表 act_re_procdef:
在这里插入图片描述

2.启动流程
	//启动流程时传递的参数列表 这里根据实际情况 也可以选择不传
	Map<String, Object> variables = new HashMap<String, Object>();
	variables.put("userId","sysadmin");
	// 根据流程定义ID查询流程定义  quest_work:1:47504是我们刚才部署的流程定义的id
	ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
				.processDefinitionId("quest_work:1:47504")     //act_re_procdef主键ID
				.singleResult();

	// 获取流程定义的Key
	String processDefinitionKey = processDefinition.getKey();
	//定义businessKey  businessKey一般为流程实例key与实际业务数据的结合
	String businessKey = processDefinitionKey + ":" + "001";
	//设置启动流程的人
	Authentication.setAuthenticatedUserId("sysadmin");
	ProcessInstance processInstance = this.runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
	System.out.println("流程启动成功:" + processInstance);
3.查询我的待办
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	TaskService taskService = processEngine.getTaskService();
	List<Task> list = taskService.createTaskQuery()
				.processDefinitionKey(processDefinitionKey)
				.taskAssignee("sysadmin")
				.list();
		for (Task task : list) {
			System.out.println("流程实例id = " + task.getProcessInstanceId());
			System.out.println("任务id = " + task.getId());
			System.out.println("任务负责人id = " + task.getAssignee());
			System.out.println("任务名称 = " + task.getName());
		}
4.完成任务
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	processEngine.getTaskService().complete(taskId);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CHARLS轻松发二区,只用了COX回归模型 | CHARLS CLHLS CFPS 公共数据库周报(4.3)...

零基础CHARLS发论文&#xff0c;不容错过&#xff01; 长期回放更新指导&#xff01;适合零基础&#xff0c;毕业论文&#xff0c;赠送2011-2020年CHARLS清洗后的数据全套代码&#xff01; CHARLS公共数据库 CHARLS数据库简介中国健康与养老追踪调查(China Health and Retireme…

C++初阶学习第三弹——类与对象(上)——初始类与对象

前言&#xff1a; 在前面&#xff0c;我们已经初步学习了C的一些基本语法&#xff0c;比如内敛函数、函数重载、缺省参数、引用等等&#xff0c;接下来我们就将正式步入C的神圣殿堂&#xff0c;首先&#xff0c;先给你找个对象 目录 一、类与对象是什么&#xff1f; 二、类的各…

ArtNeRF、Attention Control、Pixel is a Barrier、FilterPrompt

本文首发于公众号&#xff1a;机器感知 ArtNeRF、Attention Control、Pixel is a Barrier、FilterPrompt ArtNeRF: A Stylized Neural Field for 3D-Aware Cartoonized Face Synthesis Recent advances in generative visual models and neural radiance fields have greatly …

【笔试训练】day11

1.游游的水果大礼包 思路&#xff1a; 枚举。假设最后的答案是x个a礼包&#xff0c;y个b礼包&#xff0c;得到一个式子&#xff1a;ansa*xb*y 我们可以枚举x的数量&#xff0c;这样就能变相的把y的求出来。呃这就是鸡兔同笼问题嘛 x最大的范围是多少呢&#xff1f;也就是a礼…

【CouchDB 与 PouchDB】

CouchDB是什么 CouchDB&#xff0c;全名为Apache CouchDB&#xff0c;是一个开源的NoSQL数据库&#xff0c;由Apache软件基金会管理。CouchDB的主要特点是使用JSON作为存储格式&#xff0c;使用JavaScript作为查询语言&#xff08;通过MapReduce函数&#xff09;&#xff0c;并…

面试二十二、跳表SkipLists

跳表全称为跳跃列表&#xff0c;它允许快速查询&#xff0c;插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表&#xff0c;且每一层链表中的元素是前一层链表元素的子集&#xff08;见右边的示意图&…

day07 51单片机-18B20温度检测

18B20温度检测 1.1 需求描述 本案例讲解如何从18B20传感器获取温度信息并显示在LCD上。 1.2 硬件设计 1.2.1 硬件原理图 1.2.3 18B20工作原理 可以看到18B20有两根引脚负责供电&#xff0c;一根引脚负责数据交换。18B20就是通过数据线和单片机进行数据交换的。 1&#xf…

前端项目中使用插件prettier/jscodeshift/json-stringify-pretty-compact格式化代码或json数据

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、json代码格式化-选型二、json-stringify-pretty-compact简单试用三、prettier在前端使用四、查看prettier支持的语言和插件五、使用prettier格式化vue代码最终效果如图&#xff1a; ![在这里插入图片描述](https://im…

【ruoyi-vue】登录解析(后端)

调试登录接口 进入实现类可以有 验证码校验 登录前置校验 用户验证 验证码校验 通过uuid获取redis 中存储的验证码信息&#xff0c;获取后对用户填写的验证码数据进行校验比对 用户验证 1.进入控制器的 /login 方法 2.进入security账号鉴权功能&#xff0c;经过jar内的流…

python逆向基础流程(纯小白教程)

一&#xff0c;例题链接 NSSCTF | 在线CTF平台 二&#xff0c;文件特征 使用工具查看文件信息&#xff0c;发现是pyinsatller打包的exe文件&#xff0c;如果硬用ida分析成汇编或c语言根本摸清楚程序的逻辑&#xff0c;所以思路是反编译成py文件直接分析python代码 三&#xf…

【论文推导】基于有功阻尼的转速环PI参数整定分析

前言 在学习电机控制的路上&#xff0c;PMSM的PI电流控制是不可避免的算法之一&#xff0c;其核心在于内环电流环、外环转速环的设置&#xff0c;来保证转速可调且稳定&#xff0c;并且保证较好的动态性能。整个算法仿真在《现代永磁同步电机控制原理及matlab仿真》中已详细给出…

VUE项目使用.env配置多种环境以及如何加载环境

第一步&#xff0c;创建多个环境配置文件 Vue CLI 项目默认使用 .env 文件来定义环境变量。你可以通过创建不同的 .env 文件来为不同环境设置不同的环境变量&#xff0c;例如&#xff1a; .env —— 所有模式共用.env.local —— 所有模式共用&#xff0c;但不会被 git 提交&…

Clickhouse离线安装教程

https://blog.51cto.com/u_15060531/4174350 1. 前置 1.1 检查服务器架构 服务器&#xff1a;Centos7.X 需要确保是否x86_64处理器构架、Linux并且支持SSE 4.2指令集 grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 …

不墨迹,向媒体投稿不讲攻略,直接上方法

作为一名单位信息宣传员,我曾深陷于向媒体投稿的泥沼之中,饱尝了费时费力、审核严苛、出稿缓慢的苦涩,承受着领导急切期盼与自我压力交织的煎熬。然而,当我有幸接触到智慧软文发布系统,这一切困境如同阴霾散去,取而代之的是便捷流畅的投稿流程,以及领导满意、团队轻松的工作氛围…

Java Swing游戏开发学习24

内容来自RyiSnow视频讲解 这一节讲的是Scrolling Message, Leveling Up, Damage Calculation滚动消息&#xff0c;升级&#xff0c;伤害计算。 伤害计算 玩家与怪的战斗&#xff0c;玩家对怪的伤害值为攻击值减去怪的防御值。 int damage attack - gp.monster[i].defense; …

队列的实现(c语言实现)

队列的定义 队列&#xff08;Queue&#xff09;是一种特殊的线性数据结构&#xff0c;它遵循先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的原则。这意味着最早被添加到队列中的元素将是最先被移除的元素。队列的主要操作包括入队&#xff08;enqueue…

接口自动化测试框架建设的经验与教训

为什么选择这个话题&#xff1f; 一是发现很多“点工”在转型迷茫期都会问一些自动化测试相关的问题&#xff0c;可以说自动化测试是“点工”升级的必经之路&#xff1b;二是Google一下接口自动化测试&#xff0c;你会发现很多自动化测试框架相关的文章&#xff0c;但是大部分…

Nodejs--异步编程

异步编程 函数式编程 高阶函数 在通常的语言中&#xff0c;函数的参数只接受基本的数据类型或者是对象引用&#xff0c;返回值只能是基本数据类型和对象引用。 function foo(x) {return x }高阶函数是把函数作为参数&#xff0c;将函数作为返回值的函数 function foo(x) {…

Oceanbase体验之(二)Oceanbase集群的搭建(社区版4.2.2)

资源规划 3台observer CPU:4C及以上 内存&#xff1a;32G及以上 硬盘操作系统500G 存储盘1T及以上 虚拟机可以直接划分&#xff0c;物理机需要提前规划好资源 一、上传oceanbase安装包 登录ocp选择软件包管理 上传Oceanbase软件包&#xff08;软件包获取路径 官网免费下载社…

JavaWeb--04YApi,Vue-cli脚手架Node.js环境搭建,创建第一个Vue项目

04 1 Yapi2 Vue-cli脚手架Node.js环境搭建配置npm的全局安装路径 3 创建项目&#xff08;这个看下一篇文章吧&#xff09; 1 Yapi 前后端分离中的重要枢纽"接口文档",以下一款为Yapi的接口文档 介绍&#xff1a;YApi 是高效、易用、功能强大的 api 管理平台&#…