工作流Activiti初体验【一】

2024-06-24 13:32
文章标签 初体验 activiti 工作

本文主要是介绍工作流Activiti初体验【一】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里记录一下我的Activiti历程:(以下示例不涉及真实业务,所有逻辑均建立在学习的基础上)

bpmn图
bpmn

发起任务我设置了一个权限组user1,只要是这个权限的用户都可以发起任务
权限组
分发任务我设置了一个用户组,用户组中每个用户都可以处理这步流程,只要有一个人处理这步任务,分发的流程就算结束了
分发任务
分发任务这一环节还有个判断,允许任务下发和不允许任务下发
判断
任务分发完成则来到子流程,每个被分到任务的人需要执行任务,所以需要派生出多个实例。子流程里面用户集users包含着每一个user
子流程
子流程里面开始的事件需要接收用户参数生产每个实例
执行任务
后面的步骤跟前面差不多,就不细说了


代码部分

配置文件xml

<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"><!-- 配置流程引擎配置对象 --><bean id="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"><property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver" /><property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/activiti?characterEncoding=utf8&amp;useSSL=false&amp;nullCatalogMeansCurrent=true" /><property name="jdbcUsername" value="root" /><property name="jdbcPassword" value="MySQLadmin1!" /><!-- 建表策略:若没有工作流表则创建,若存在工作流表则更新 --><property name="databaseSchemaUpdate" value="true" /></bean><!-- 配置一个流程引擎工厂bean,用于创建流程引擎对象 --><bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"><!-- 通过set方法注入流程引擎配置对象 --><property name="processEngineConfiguration" ref="processEngineConfiguration" /></bean>
</beans>

ActivitiConfig.java

package com.avanty.activiti;import org.activiti.engine.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ActivitiConfig {/*** 配合xml配置文件使用*/@Beanpublic ProcessEngine processEngine() {String resource = "activiti/activitiConfig.xml";String beanName = "processEngineConfiguration";ProcessEngineConfiguration conf = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource, beanName);return conf.buildProcessEngine();}/*** @Bean可以用xml配置,也可以代码配置* @Bean public ProcessEngine processEngine() { //创建Activiti配置对象实例*       ProcessEngineConfiguration configuration =*       ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();*       configuration.setJdbcDriver("com.mysql.cj.jdbc.Driver");*       configuration.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/activiti?characterEncoding=utf8&useSSL=false&nullCatalogMeansCurrent=true");*       configuration.setJdbcUsername("root");*       configuration.setJdbcPassword("MySQLadmin1!"); //设置建表策略*       configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);*       //得到引擎实例 return configuration.buildProcessEngine(); }*/@Beanpublic RepositoryService repositoryService(ProcessEngine processEngine) {return processEngine.getRepositoryService();}@Beanpublic RuntimeService runtimeService(ProcessEngine processEngine) {return processEngine.getRuntimeService();}@Beanpublic TaskService taskService(ProcessEngine processEngine) {return processEngine.getTaskService();}@Beanpublic HistoryService historyService(ProcessEngine processEngine) {return processEngine.getHistoryService();}@Beanpublic ManagementService managementService(ProcessEngine processEngine) {return processEngine.getManagementService();}@Beanpublic IdentityService identityService(ProcessEngine processEngine) {return processEngine.getIdentityService();}}

用来测试的DeployActiviti.java

package com.avanty.activiti;import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Component
public class DeployActiviti implements ApplicationRunner {/*** 流程部署相关表 `ACT_RE_DEPLOYMENT` `ACT_RE_MODEL` `ACT_GE_BYTEARRAY`* `ACT_GE_PROPERTY` `ACT_RE_PROCDEF`*//*** 流程运行相关表 `ACT_RU_EXECUTION` `ACT_RU_IDENTITYLINK` `ACT_RU_JOB` `ACT_RU_TASK`* `ACT_RU_VARIABLE`*//*** 流程历史相关表 `ACT_HI_IDENTITYLINK` `ACT_HI_VARINST` `ACT_HI_ACTINST`* `ACT_HI_TASKINST`*//*** TaskQuery taskQuery = taskService.createTaskQuery();* taskQuery.taskCandidateGroupIn(roleList);* taskQuery.taskCandidateOrAssigned(usrnames);* taskQuery.includeProcessVariables(); taskList = taskQuery.list();*/@AutowiredProcessEngine processEngine;@AutowiredRuntimeService runtimeService;@AutowiredTaskService taskService;@Overridepublic void run(ApplicationArguments args) {finish();}private void deployProcess() {RepositoryService service = processEngine.getRepositoryService();InputStream bpmn = this.getClass().getResourceAsStream("/activiti/Process.bpmn");Deployment deployment = service.createDeployment().name("任务流程").addInputStream("Process.bpmn", bpmn).deploy();System.out.println(deployment.getName());System.out.println(deployment.getId());}/*** 发起任务*/private void step1() {String processInstanceByKey = "Process";ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processInstanceByKey);System.out.println(processInstance.getId());}/*** 查看发起任务*/private void findStep1() {TaskQuery taskQuery = taskService.createTaskQuery();List<String> roleCodeList = new ArrayList<>();roleCodeList.add("user1");taskQuery.taskCandidateGroupIn(roleCodeList);taskQuery.includeProcessVariables();List<Task> tasks = taskQuery.list();for (Task task : tasks) {System.out.println(task.getId());System.out.println(task.getProcessInstanceId());System.out.println(task.getName());System.out.println(task.getAssignee());}}/*** 分发任务*/private void step2() {TaskQuery taskQuery = taskService.createTaskQuery();List<String> roleCodeList = new ArrayList<>();roleCodeList.add("user1");taskQuery.taskCandidateGroupIn(roleCodeList);taskQuery.includeProcessVariables();Task task = taskQuery.singleResult();Map<String, Object> variables = new HashMap<>();List<String> users = new ArrayList<>();users.add("Michael");users.add("Zhan");variables.put("users", users);taskService.complete(task.getId(), variables);System.out.println("finish");}/*** 查看分发任务*/private void findStep2() {String assignee = "Zhan";// String assignee = "Michael";List<Task> tasks1 = taskService.createTaskQuery().taskCandidateUser(assignee).list();for (Task task1 : tasks1) {System.out.println(task1.getId());System.out.println(task1.getName());}}/*** 子流程-执行任务*/private void step3() {TaskQuery taskQuery = taskService.createTaskQuery();taskQuery.taskCandidateOrAssigned("Michael");taskQuery.includeProcessVariables();Task task = taskQuery.singleResult();System.out.println(task.getId());Map<String, Object> variables = new HashMap<>();List<String> users = new ArrayList<>();users.add("admin");users.add("root");variables.put("users", users);variables.put("isPass", 1);taskService.complete(task.getId(), variables);System.out.println("finish");}/*** 子流程-查看执行任务*/private void findStep3() {String assignee = "admin";
//		String assignee = "root";List<Task> tasks = taskService.createTaskQuery().taskCandidateOrAssigned(assignee).list();for (Task task : tasks) {System.out.println(task.getId());System.out.println(task.getProcessInstanceId());System.out.println(task.getName());}}/*** 子流程-验收任务*/private void step4() {String assignee = "admin";Task task = taskService.createTaskQuery().taskCandidateOrAssigned(assignee).singleResult();System.out.println(task.getId());Map<String, Object> variables = new HashMap<>();List<String> users = new ArrayList<>();if (assignee.equals("root")) {users.add("administrator");users.add("su");}else if(assignee.equals("admin")) {users.add("alex");users.add("sudo");}variables.put("users", users);taskService.complete(task.getId(), variables);System.out.println("finish");}/*** 子流程-查看验收任务*/private void findStep4() {
//		 String assignee = "administrator";
//		String assignee = "su";
//		String assignee = "alex";String assignee = "sudo";List<Task> tasks = taskService.createTaskQuery().taskCandidateOrAssigned(assignee).list();for (Task task : tasks) {System.out.println(task.getId());System.out.println(task.getProcessInstanceId());System.out.println(task.getName());}}/*** 子流程-完成*/private void finish() {String assignee = "alex";Task task = taskService.createTaskQuery().taskCandidateOrAssigned(assignee).singleResult();Map<String, Object> variables = new HashMap<>();variables.put("isPass", 1);taskService.complete(task.getId(), variables);System.out.println("finish");}}

最后,附上项目地址 Activiti-Test
项目是用Eclipse写的,不用IDEA的原因是Eclipse的Activiti插件比IDEA的好,有自动对齐功能,强迫症的福音呐!

这篇关于工作流Activiti初体验【一】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090286

相关文章

找完工作该补充的东西

首先: 锻炼身体,包括乒乓球,羽毛球,都必须练习,学习,锻炼身体等是一个很重要的与人交际沟通的方式; 打牌,娱乐:会玩是一个人很重要的交际沟通的法宝; 摄影:这个是一个兴趣爱好,也是提高自己的审美,生活品质,当然也是与人沟通的重要途径; 做饭:这个的话就是对自己,对朋友非常有益的一件事情;

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

工作流Activiti初体验—流程撤回【二】

已经玩工作流了,打算还是研究一下撤回的功能。但是流程图里面并不带撤回的组件,所以需要自己动态改造一下,还是延续上一个流程继续试验撤回功能。《工作流Activiti初体验【一】》 完整流程图 我们研究一下分发任务撤回到发起任务,其他环节的撤回类似 撤回的原理大概如下: 将分发任务后面的方向清空,把发起任务拼接到原来的判断网关,然后结束分发任务,这样流程就到发起任务了 此时的流程如上图,

HashMap 的工作原理及其在 Java 中的应用?

在Java的数据结构中,HashMap是最常见且最重要的一个数据结构之一。HashMap是Java集合框架中的一部分,它存储的是键值对(Key-value)映射,也就是说,你可以通过键(Key)找到对应的值(Value)。让我们来详细地看一下HashMap的工作原理。 HashMap的工作原理 HashMap内部有一个数组,数组中的每个元素又是一个链表。当我们将一个键值对存入HashM

Ajax及其工作原理

Ajax及其工作原理 AJAX 是一种与服务器交换数据无需刷新网页的技术,最早由Google公司在谷歌地图里使用,并迅速风靡。 AJAX是不能跨域的,如需跨域,可以使用document.domain='a.com';或者使用服务器代理,代理XMLHttpRequest文件 AJAX是基于现有的Internet标准,并且联合使用它们: XMLHttpRequest 对象 (异步的与服

SpringCloud Hystrix初体验

文章目录 简介实验步骤bookstore应用初始化应用主程序应用配置访问应用 reading应用初始化应用主程序BookService应用配置运行应用 参考资料 简介 Hystrix是SpringCloud Netflix下的一个库,实现了Circuit Breaker(电路熔断器)模式。关于Circuit Breaker模式的原理,可以参考:Circuit Breaker(电

SpringCloud Zuul初体验

文章目录 简介Zuul服务搭建后端服务book搭建创建一个web应用主程序配置application.properties访问book服务 Zuul服务搭建创建应用添加一个pre过滤器主程序配置application.properties通过Zuul服务网关访问book服务 参考资料 简介 Zuul在SpringCloud微服务架构中扮演服务网关的角色,对外部应用访问后端服务进

SpringCloud Eureka初体验

文章目录 Eureka Server创建Eureka Server项目配置application.properties增加@EnableEurekaServer注解访问Eureka Server Eureka Client创建Eureka Client项目配置bootstrap.properties编写EurekaclientApplication.java访问Eureka Client在E

TCP 可靠传输的工作原理

转载地址:https://my.oschina.net/xinxingegeya/blog/485233 感谢原作者 TCP 可靠传输的工作原理 ARQ(Automatic Repeat-reQuest)(自动重传请求) 停止等待ARQ协议 连续ARQ协议   停止等待ARQ协议 全双工通信的双发既是发送方也是接收方。下面为了讨论问题的方便,我们仅考虑A发送数据而B接受数据

某大厂程序员吐槽:离职交接时,新人被工作量吓退,领导却污蔑我故意劝退新人,我怒晒工作短信反击证明,新人看了后也决定走人了!

一位知名大公司的程序员分享了他离职时的遭遇:在交接工作时,新进的同事因工作量过大而感到压力,但出乎意料的是,他们的领导却指责我故意吓唬新人。为了证明自己的清白,我晒出了工作短信作为反击,结果连新人也决定离开。 在任何组织里,团队文化的优劣都是决定工作效率和质量的关键。一个和谐相处的团队不仅能提升工作效率,还能使工作氛围变得轻松愉快。 然而,一旦团队内部出现权力斗争或领导偏爱小团体、