工作流之Activiti7 和BPMN讲解

news/2024/11/15 13:29:07/文章来源:https://www.cnblogs.com/jingzh/p/18393744

目录
  • 1 Activiti
    • 1.1 简介
    • 1.2 BPMN
      • 1.2.1 简介
      • 1.2.2 符号
    • 1.3 准备工作
      • 1.3.1 安装插件
        • 1.3.1.1 插件
        • 1.3.1.2 本地网页
      • 1.3.2 pom依赖
      • 1.3.3 添加配置
      • 1.3.4 表介绍
      • 1.3.5 常用Service服务介绍
    • 1.4 无校验操作流程
      • 1.4.1 部署&查看文件
        • 1.4.1.1 单个文件部署方式
        • 1.4.1.2 静态类部署
        • 1.4.1.3 压缩包部署方式
        • 1.4.1.4 查看文件
      • 1.4.2 启动流程实例和查询
      • 1.4.3 查询任务和历史
      • 1.4.4 处理当前任务
      • 1.4.5 流程定义
    • 1.5 新版校验操作
      • 1.5.1 配置Security用户
      • 1.5.2 操作
      • 1.5.3 报错 Process definition with the given id:xxx belongs to a different application version
    • 1.6 Activiti 7.1.0.M6之后

1 Activiti

1.1 简介

Activiti 是一个开源的工作流和业务流程管理 (BPM) 平台,旨在帮助开发者和企业自动化业务流程。它提供了一整套工具,用于定义、执行、监控和优化业务流程。Activiti 支持 BPMN 2.0 标准,具有强大的扩展能力和易用性,适用于各种规模的组织和复杂的业务需求。
官方网站:https://www.activiti.org
https://mp.weixin.qq.com/s/Xa3yIp1FRYpQF87lmf91OA

1.2 BPMN

1.2.1 简介

BPM(Business Process Management) 即业务流程管理,是一种规范化的构造端到端的业务流程,以持续提高组织业务效率

BPMN(Business Process Model AndNotation) 即业务流程模型和符号,是一套标准的业务流程建模符号,使用 BPMN 提供的符号可以创建业务流程。Activit 就是使用 BPMN 进行流程建模、流程执行管理的
BPMN2.0 是业务流程建模符号 2.0 的缩写,它由 Business Process Management Initiative 这个非营利协会创建并不断发展。BPMN2.0 是使用一些符号来明确业务流程设计流程图的一套符号规范,能增进业务建模时的沟通效率。

1.2.2 符号

BPMN2.0 的基本符号主要包含

  • 事件 Event
    开始:表示一个流程的开始
    中间:发生的开始和结束事件之间,影响处理的流程
    结束:表示该过程结束
    在这里插入图片描述

  • 活动 Activities
    活动是工作或任务的一个通用术语。一个活动可以是一个任务,还可以是一个当前流程的子处理流程;其次,还可以为活动指定不同的类型。常见活动如下:
    在这里插入图片描述

  • 网关 GateWay
    用于表示流程的分支与合并,有几种常用网关需要了解:
    在这里插入图片描述
    排他网关:只有一条路径会被选择,基于条件选择单一路径
    并行网关:无条件并行执行所有路径
    包容网关:可以同时执行多条线路,也可以在网关上设置条件,基于条件可以选择多个路径同时执行
    事件网关:基于外部事件的发生来决定路径选择,即专门为中间捕获事件设置的,允许设置多个输出流指向多个不同的中间捕获事件。当流程执行到事件网关后,流程处于等待状态,需要等待抛出事件才能将等待状态转换为活动状态

  • 流向 Flow
    流是连接两个流程节点的连线,常见的流向包含以下几种:
    顺序流:用一个带实心箭头的实心线表示,用于指定活动执行的顺序
    信息流:用一条带箭头的虚线表示,用于描述两个独立的业务参与者(业务实体/业务角色)之间发送和接受的消息流动
    关联:用一根带有线箭头的点线表示,用于将相关的数据、文本和其他人工信息与流对象联系起来。用于展示活动的输入和输出
    在这里插入图片描述

  • 边界事件(Boundary Events
    边界事件是一种特殊的事件,它附加在流程元素(如任务、子流程等)上,用于捕捉特定事件并对其进行处理。边界事件通常用于中断或处理任务的异常情况,或者处理流程中某些特定的事件场景。

    • 中断任务: 当绑定在某个任务上的边界事件被触发时,任务可以被中断,流程将根据边界事件的定义跳转到其他节点或执行特定的操作。这通常用于处理异常情况,如错误、超时等。
    • 捕获事件: 边界事件可以用来捕捉在任务执行过程中发生的特定事件,例如错误事件(Error Event)、定时事件(Timer Event)、消息事件(Message Event)等。当这些事件发生时,流程会从当前任务转移到处理该事件的流程路径。
    • 处理子流程: 在嵌套子流程中,边界事件可以用于在子流程内某个特定事件发生时触发相应的处理逻辑。

1.3 准备工作

1.3.1 安装插件

1.3.1.1 插件

IDEA版本小于等于2019,可使用Activiti插件actiBPM,如果获取不到插件市场获取:https://plugins.jetbrains.com/plugin/7429-actibpm
否则使用Activiti BPMN visualizer
在这里插入图片描述
假如要画一个请假的 activiti 流程图,使用 Idea 安装 actiBPM 插件,创建该流程图,文件命名apply.mpmn,实现请假流程的二级审批能力,右键点击view bpmn diagram 才会有图示出来
在这里插入图片描述

1.3.1.2 本地网页

如果觉得插件画图麻烦,可以用 Activiti ModelerActiviti Modeler 是 Activiti 官方提供的一款在线流程设计的前端插件,开发人员可以方便在线进行流程设计,保存流程模型,部署至流程定义等等

下载activiti-explorer,官网下载:Get started | Activiti
解压activiti-5.22.0.zip,在activiti-5.22.0\wars目录下获取activiti-explorer.war
启动路径:双击startup.bat
在这里插入图片描述

访问activiti-explorer:http://localhost:8080/activiti-explorer
默认登录账号:kermit kermit

1.3.2 pom依赖

<!--引入activiti的springboot启动器 -->
<dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId><version>7.1.0.M6</version><exclusions><exclusion><artifactId>mybatis</artifactId><groupId>org.mybatis</groupId></exclusion></exclusions><!-- 不加如下依赖报错:'org.springframework.security.core.userdetails.UserDetailsService' that could not be found. --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
<!-- 不加可能报错:Consider defining a bean of type 'javax.sql.DataSource' in your configuration --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><!-- 或者使用druid-spring-boot-starter --></dependency>
</dependency>

说明:Activiti7SpringBoot整合后,默认集成了SpringSecurity安全框架,当前项目已经集成过了SpringSecurity,后续案例设置审批人时都必须是系统用户,Activiti框架会检查用户是否存在,否则会出现异常

1.3.3 添加配置

数据源项目已经添加,只需要如下配置即可

spring:datasource:url: jdbc:mysql://localhost:3316/activiti?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghaiusername: xxxxpassword: xxxxdriver-class-name: com.mysql.cj.jdbc.Driveractiviti:#    false:默认,数据库表不变,但是如果版本不对或者缺失表会抛出异常(生产使用)#    true:表不存在,自动创建(开发使用)#    create_drop: 启动时创建,关闭时删除表(测试使用)#    drop_create: 启动时删除表,在创建表 (不需要手动关闭引擎)database-schema-update: true#监测历史表是否存在,activities7默认不开启历史表db-history-used: true#none:不保存任何历史数据,流程中这是最高效的#activity:只保存流程实例和流程行为#audit:除了activity,还保存全部的流程任务以及其属性,audit为history默认值#full:除了audit、还保存其他全部流程相关的细节数据,包括一些流程参数history-level: full#校验流程文件,默认校验resources下的process 文件夹的流程文件check-process-definitions: false# 定义.bpmn文件的位置process-definition-location-prefix: classpath:/process/

1.3.4 表介绍

启动项目,即可生成项目数据库表
在这里插入图片描述
Activiti 的运行支持必须要有这 25 张表的支持,主要是在业务流程运行过程中,记录参与流程的用户主体,用户组信息,以及流程的定义,流程执行时的信息,和流程的历史信息等等

表的命名规则和作用:

  • Activiti 的表都以 act_ 开头,紧接着是表示表的用途的两个字母标识,也和 Activiti 所提供的服务的 API 对应:
    • ACT_RE:RE 表示 repository,这个前缀的表包含了流程定义和流程静态资源 (图片、规则、等等)
    • ACT_RU:RU 表示 runtime,这些表运行时,会包含流程实例、任务、变量、异步任务等流程业务进行中的数据。Activiti 只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。这样表就可以一直保持很小的体积,并且速度很快
    • ACT_HI:HI 表示 history,这些表包含一些历史数据,比如历史流程实例、变量、任务等等
    • ACT_GE:GE 表示 general,通用数据

Activiti 数据表介绍

表分类 表名 解释
一般数据
[ACT_GE_BYTEARRAY] 通用的流程定义和流程资源
[ACT_GE_PROPERTY] 系统相关属性
流程历史记录
[ACT_HI_ACTINST] 历史的流程实例
[ACT_HI_ATTACHMENT] 历史的流程附件
[ACT_HI_COMMENT] 历史的说明性信息
[ACT_HI_DETAIL] 历史的流程运行中的细节信息
[ACT_HI_IDENTITYLINK] 历史的流程运行过程中用户关系
[ACT_HI_PROCINST] 历史的流程实例
[ACT_HI_TASKINST] 历史的任务实例
[ACT_HI_VARINST] 历史的流程运行中的变量信息
流程定义表
[ACT_RE_DEPLOYMENT] 部署单元信息
[ACT_RE_MODEL] 模型信息
[ACT_RE_PROCDEF] 已部署的流程定义
运行实例表
[ACT_RU_EVENT_SUBSCR] 运行时事件
[ACT_RU_EXECUTION] 运行时流程执行实例
[ACT_RU_IDENTITYLINK] 运行时用户关系信息,存储任务节点与参与者的相关信息
[ACT_RU_JOB] 运行时作业
[ACT_RU_TASK] 运行时任务
[ACT_RU_VARIABLE] 运行时变量表

1.3.5 常用Service服务介绍

各个 Service 的实现类,这些服务是 Activiti 的底层核心 API,提供了对工作流引擎内部的细粒度控制。它们是 Activiti 5 和 6 中主要使用的服务,提供了更低级别的操作接口:

  • RepositoryService
    Activiti 的资源管理类,该服务负责部署流程定义,管理流程资源。在使用 Activiti 时,一开始需要先完成流程部署,即将使用建模工具设计的业务流程图通过 RepositoryService 进行部署
  • RuntimeService
    Activiti 的流程运行管理类,用于开始一个新的流程实例,获取关于流程执行的相关信息。流程定义用于确定一个流程中的结构和各个节点间行为,而流程实例则是对应的流程定义的一个执行,可以理解为 Java 中类和对象的关系
  • TaskService
    Activiti 的任务管理类,用于处理业务运行中的各种任务,例如查询分给用户或组的任务、创建新的任务、分配任务、确定和完成一个任务
  • HistoryService
    Activiti 的历史管理类,可以查询历史信息。执行流程时,引擎会保存很多数据,比如流程实例启动时间、任务的参与者、完成任务的时间、每个流程实例的执行路径等等。这个服务主要通过查询功能来获得这些数据
  • ManagementService
    Activiti 的引擎管理类,提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护

Activiti7后新增服务:

  • TaskRuntime:这个服务主要用于管理用户任务。通过它,可以查询任务、完成任务、分配任务、认领任务等。这些操作是围绕任务管理的高层次抽象,开发人员可以更加方便地与任务进行交互,而无需直接处理底层的 API 调用。
  • ProcessRuntime:这个服务用于管理流程实例。可以通过它启动流程、查询流程实例、暂停和恢复流程等。ProcessRuntime 提供了一个更简单的方式来处理流程的生命周期管理。

1.4 无校验操作流程

将画好的流程图部署到activiti数据库中,就是流程定义部署。通过调用activiti的api将流程定义的bpmn和png两个文件一个一个添加部署到activiti中,也可以将两个文件打成zip包进行部署。

1.4.1 部署&查看文件

流程定义部署后操作activiti的3张表如下:

  • act_re_deployment:流程定义部署表,每部署一次增加一条记录
  • act_re_procdef:流程定义表,部署每个新的流程定义都会在这张表中增加一条记录
  • act_ge_bytearray:流程资源表

1.4.1.1 单个文件部署方式


@SpringBootTest
public class ProcessTest {//注入RepositoryService@Autowiredprivate RepositoryService repositoryService;/*** 单个文件部署方式*/@Testpublic void deployProcess() {//流程部署Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/qingjia.bpmn20.xml")// 如果报错找不到图片在pom里面添加: <include>**/*.png</include>.addClasspathResource("process/qingjia.png").name("请假申请流程").deploy();System.out.println(deploy.getId());System.out.println(deploy.getName());}
}

1.4.1.2 静态类部署

	@Testpublic void testDeployment(){
//        1、创建ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、得到RepositoryService实例RepositoryService repositoryService = processEngine.getRepositoryService();
//        3、使用RepositoryService进行部署Deployment deployment = repositoryService.createDeployment().addClasspathResource("process/qingjia.bpmn") // 添加bpmn资源 .name("请假申请流程").deploy();
//        4、输出部署信息System.out.println("流程部署id:" + deployment.getId());System.out.println("流程部署名称:" + deployment.getName());}

1.4.1.3 压缩包部署方式

@Autowired
private RepositoryService repositoryService;
@Test
public void deployProcessByZip() {// 定义zip输入流InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("process/qingjia.zip");ZipInputStream zipInputStream = new ZipInputStream(inputStream);// 流程部署Deployment deployment = repositoryService.createDeployment().addZipInputStream(zipInputStream).name("请假申请流程").deploy();System.out.println("流程部署id:" + deployment.getId());System.out.println("流程部署名称:" + deployment.getName());
}

1.4.1.4 查看文件

@Test
public void  queryBpmnFile() throws IOException {
//得到查询器:ProcessDefinitionQuery,设置查询条件,得到想要的流程定义ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("qingjia").singleResult();
//通过流程定义信息,得到部署IDString deploymentId = processDefinition.getDeploymentId();
//  通过repositoryService的方法,实现读取图片信息和bpmn信息
//        png图片的流InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
//        bpmn文件的流InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
//  构造OutputStream流File file_png = new File("d:/qingjia.png");File file_bpmn = new File("d:/qingjia.bpmn");FileOutputStream bpmnOut = new FileOutputStream(file_bpmn);FileOutputStream pngOut = new FileOutputStream(file_png);
//        7、输入流,输出流的转换IOUtils.copy(pngInput,pngOut);IOUtils.copy(bpmnInput,bpmnOut);
//        8、关闭流pngOut.close();bpmnOut.close();pngInput.close();bpmnInput.close();
}

1.4.2 启动流程实例和查询

将bpmn文件放到activiti的三张表中,好比是java中的一个类 流程实例:好比是java中的一个实例对象(一个流程定义可以对应多个流程实例),张三可以启动一个请假流程实例,李四也可以启动一个请假流程实例,他们互不影响

@Autowired
private RuntimeService runtimeService;@Test
public void startUpProcess() {//创建流程实例,我们需要知道流程定义的keyProcessInstance processInstance = runtimeService.startProcessInstanceByKey("qingjia");//输出实例的相关信息System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());System.out.println("流程实例id:" + processInstance.getId());System.out.println("当前活动Id:" + processInstance.getActivityId());
}

注意:使用startProcessInstanceByKey的方式不用在部署了,springboot会自动部署bpmn文件
操作数据表:

  • act_hi_actinst 流程实例执行历史
  • act_hi_identitylink 流程的参与用户历史信息
  • act_hi_procinst 流程实例历史信息
  • act_hi_taskinst 流程任务历史信息
  • act_ru_execution 流程执行信息
  • act_ru_identitylink 流程的参与用户信息
  • act_ru_task 任务信息
/*** 查询流程实例*/
@Test
public void queryProcessInstance() {List<ProcessInstance> list = runtimeService.createProcessInstanceQuery("qingjia").processDefinitionKey()//.list();for (ProcessInstance processInstance : list) {System.out.println("----------------------------");System.out.println("流程实例id:"+ processInstance.getProcessInstanceId());System.out.println("所属流程定义id:"+ processInstance.getProcessDefinitionId());System.out.println("是否执行完成:" + processInstance.isEnded());System.out.println("是否暂停:" + processInstance.isSuspended());System.out.println("当前活动标识:" + processInstance.getActivityId());System.out.println("业务关键字:"+processInstance.getBusinessKey());}
}

查看流程实例历史

/*** 查看历史信息*/
@Test
public void findHistoryInfo(){
//        获取 actinst表的查询对象HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
//        查询 actinst表,条件:根据 InstanceId 查询,查询一个流程的所有历史信息instanceQuery.processInstanceId("25001");
//        查询 actinst表,条件:根据 DefinitionId 查询,查询一种流程的所有历史信息
//        instanceQuery.processDefinitionId("myLeave:1:22504");
//        增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序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("<==========================>");}
}

1.4.3 查询任务和历史

每个节点都配置了Assignee,流程启动后,任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。

@Autowired
private TaskService taskService;
​
/*** 查询当前个人待执行的任务*/
@Test
public void findPendingTaskList() {//任务负责人String assignee = "zhangsan";List<Task> list = taskService.createTaskQuery().processDefinitionKey("qingjia") //流程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());}
}@Autowired
private HistoryService historyService;
​
/*** 查询已处理历史任务*/
@Test
public void findProcessedTaskList() {//张三已处理过的历史任务List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().processDefinitionKey("qingjia") //流程Key.taskAssignee("zhangsan").finished().list();for (HistoricTaskInstance historicTaskInstance : list) {System.out.println("流程实例id:" + historicTaskInstance.getProcessInstanceId());System.out.println("任务id:" + historicTaskInstance.getId());System.out.println("任务负责人:" + historicTaskInstance.getAssignee());System.out.println("任务名称:" + historicTaskInstance.getName());}
}

说明:

  • 流程实例id:一个流程只有一个,标识这个流程
  • 任务id:流程每进行到某个节点,就会给这个节点分配一个任务id

1.4.4 处理当前任务

任务负责人查询待办任务,选择任务进行处理,完成任务。

@Test
public void completTask(){Task task = taskService.createTaskQuery().processDefinitionKey("qingjia") //流程Key.taskAssignee("zhangsan")  //要查询的负责人.singleResult();//返回一条
​//完成任务,参数:任务idtaskService.complete(task.getId());
}

完成任务后,任务自动到下一个节点

1.4.5 流程定义

/*** 查询流程定义*/
@Test
public void findProcessDefinitionList(){List<ProcessDefinition> definitionList = repositoryService.createProcessDefinitionQuery().processDefinitionKey("qingjia").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());}
}
​
/*** 删除流程定义*/
public void deleteDeployment() {//部署idString deploymentId = "82e3bc6b-81da-11ed-8e03-7c57581a7819";//删除流程定义,如果该流程定义已有流程实例启动则删除时出错repositoryService.deleteDeployment(deploymentId);//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式//repositoryService.deleteDeployment(deploymentId, true);
}

1.5 新版校验操作

1.5.1 配置Security用户

@Configuration
@EnableWebSecurity
public class MyWebSecurityConfiguration {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeRequests(authorize -> authorize.anyRequest().authenticated()).formLogin(Customizer.withDefaults());return http.build();}@Beanpublic WebSecurityCustomizer webSecurityCustomizer() {return (web) -> web.ignoring().requestMatchers()// Spring Security should completely ignore URLs starting with /resources/.antMatchers("/**");}@Beanpublic UserDetailsService userDetailsService() {UserDetails admin = User.withUsername("tom").password("$2a$10$tk29HhXGXCZDOSvn.VZlFeBsLmtJrKE2Uv6zLrRpTyvZMu3ipQLgC").roles("ACTIVITI_USER", "ACTIVITI_ADMIN", "APPLICATION_MANAGER").build();UserDetails user = User.withUsername("jerry").password("$2a$10$tk29HhXGXCZDOSvn.VZlFeBsLmtJrKE2Uv6zLrRpTyvZMu3ipQLgC").roles("ACTIVITI_USER", "GROUP_BUSINESS_MANAGER").build();UserDetails zhangsan = User.withUsername("zhangsan").password("$2a$10$tk29HhXGXCZDOSvn.VZlFeBsLmtJrKE2Uv6zLrRpTyvZMu3ipQLgC").roles("ACTIVITI_USER").build();UserDetails lisi = User.withUsername("lisi").password("$2a$10$tk29HhXGXCZDOSvn.VZlFeBsLmtJrKE2Uv6zLrRpTyvZMu3ipQLgC").roles("ACTIVITI_USER").build();return new InMemoryUserDetailsManager(admin, user, zhangsan, lisi);}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}public static void main(String[] args) {System.out.println(new BCryptPasswordEncoder().encode("123456"));}
}

Security工具类

@Component
public class SecurityUtil {@Autowiredprivate UserDetailsService userDetailsService;public void logInAs(String username) {UserDetails user = userDetailsService.loadUserByUsername(username);if (null == user) {throw new IllegalStateException(String.format("用户【%s】不存在", username));}SecurityContextHolder.setContext(new SecurityContextImpl(new Authentication() {@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return user.getAuthorities();}@Overridepublic Object getCredentials() {return user.getPassword();}@Overridepublic Object getDetails() {return user;}@Overridepublic Object getPrincipal() {return user;}@Overridepublic boolean isAuthenticated() {return true;}@Overridepublic void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {}@Overridepublic String getName() {return user.getUsername();}}));org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username);}
}

1.5.2 操作

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestSecurityActiviti {@Autowiredprivate ProcessRuntime processRuntime;@Autowiredprivate TaskRuntime taskRuntime;@Autowiredprivate SecurityUtil securityUtil;@Testpublic void findProcess(){securityUtil.logInAs("jack");final ProcessDefinition processDefinition = processRuntime.processDefinition("apply");log.info("流程定义内容:{}",processDefinition);final Page<ProcessDefinition> processDefinitionPage = processRuntime.processDefinitions(Pageable.of(0, 10));for (ProcessDefinition definition : processDefinitionPage.getContent()) {log.info("2- 流程定义内容:  {}",definition);}}/*** 启动流程*/@Testpublic void startProcess(){
//        设置登录用户securityUtil.logInAs("system");ProcessInstance processInstance = processRuntime.start(ProcessPayloadBuilder.start().withProcessDefinitionKey("apply").build());log.info("流程实例的内容,{}",processInstance);}/*** 执行任务*/@Testpublic void doTask(){
//        设置登录用户securityUtil.logInAs("jerry");
//        查询任务Page<Task> taskPage = taskRuntime.tasks(Pageable.of(0, 10));if(taskPage != null && taskPage.getTotalItems()>0){for (Task task : taskPage.getContent()) {//        拾取任务taskRuntime.claim(TaskPayloadBuilder.claim().withTaskId(task.getId()).build());log.info("任务内容,{}",task);//        完成任务taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId()).build());}}}
}

1.5.3 报错 Process definition with the given id:xxx belongs to a different application version

报错参考:https://blog.csdn.net/u011410254/article/details/117368489
在resources目录下添加文件default-project.json内容:

{"createdBy": "superadminuser","creationDate": "2019-08-16T15:58:46.056+0000","lastModifiedBy": "qa-modeler-1","lastModifiedDate": "2019-08-16T16:03:41.941+0000","id": "c519a458-539f-4385-a937-2edfb4045eb9","name": "projectA","description": "","version": "1"
}

application配置文件:


# project manifest path
project.manifest.file.path=classpath:/default-project.json

1.6 Activiti 7.1.0.M6之后

activiti-spring-boot-starter最大是支持到7.1.0.M6,在大版本就需要 如下处理
pom.xml

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.5</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.activiti</groupId><artifactId>activiti-dependencies</artifactId><version>7.6.1</version><scope>import</scope><type>pom</type></dependency></dependencies></dependencyManagement><repositories><repository><id>activiti-releases</id><url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases</url></repository></repositories>

修改 mirror 镜像

  <mirrors><mirror><id>nexus-aliyun</id><mirrorOf>*,!activiti-releases</mirrorOf><url>https://maven.aliyun.com/repository/public</url>	</mirror></mirrors>

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

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

相关文章

Python用CNN+LSTM+Attention对新闻文本分类、锂离子电池健康、寿命数据预测

全文链接:https://tecdat.cn/?p=37561 原文出处:拓端数据部落公众号分析师:Weiqiao Jue 在当今的数字化时代,数据的爆炸式增长既带来了机遇,也带来了挑战。如何从海量的数据中高效地提取有价值的信息,并进行准确的分类和预测,成为了众多领域亟待解决的关键问题。 本研究…

【专题】2024年企业数字化人才实践研究报告合集PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p=37556 在当今时代,数字化转型已然成为不可逆转的变革趋势。经过多年的持续发展,中国企业的数字化转型已然迈进了 “深水区”。对于众多企业来说,当下在数字化转型过程中最为迫切需要解决的问题,便是如何在已有的数字化成果基础上进行再度创…

博客内容规范

之前虽然用GitHub Pages建立了个静态博客,但是由于访问速度的问题,我便把内容迁移到了Gitee Pages上,谁能想它直接跑路了,至今还没有发一个字的公告。一波操作,我又迁回了GitHub,但是又想到一个人孤独写博客,还把内容放到GitHub上,访问慢、没人看,更没法和别人交流,感…

platformIO安装过程中速度慢、卡住的解决方法

资源管理器定位到 C:\Users\VSCode安装用户名\.platformio\penv打开pip.conf文件添加如下内容# 超时时间,可自行调整timeout = 6000# 源地址,这里使用阿里云镜像index-url = http://mirrors.aliyun.com/pypi/simple/# 添加源主机为可信主机trusted-host = mirrors.aliyun.com…

C#自定义控件—流动管道

C#用户控件之流动管道 如何绘制一个动态的流动管道(FlowPipe)?分两步绘制定义属性; 画布重绘;主要技能:管道的绘制(渐变色矩形)/// <summary>/// 画渐变色矩形的方法/// </summary>/// <param name="g">画布</param>/// <param n…

swing

数学教材推荐: 中学PDF课本介绍和下载:https://www.zhihu.com/question/517213170/answer/3430923272 swing swing基础 1、容器与控件 1.1)、类介绍JFrame 表示一个窗口JPanel ,表示一个容器,也称为面板JButton,表示一个按钮控件JLabel ,标签控件,用于显示文本1.2)、 使…

2分钟搞懂如何计算uart速率

一、前言 1960年代,DEC(Digital Equipment Corp)公司的Gordon Bell采用大约50个分离元件设计了一个电路板,发明了UART。时至今日,已经60多年,虽然在个人消费类电子产品中,UART已近乎绝迹;但在工业、科研、国防、航空/航天等领域,UART却无处不在。 很多从事多年嵌入式开…

JVM/垃圾回收

Java的垃圾回收模型 一、介绍分为栈、堆、本地方法栈、程序计数器、方法区栈区:主要用来存储局部变量和对象地址栈区不仅存储局部变量和对象地址,还存储方法调用的上下文信息。堆区:分为很多个区域,可以存储对象的具体数据等Java 虚拟机中内存最大的一块,是被所有线程共享的…

NetSarang Xshell 8.0 beta

一、概述NetSarang Xshell 8.0 beta发布啦! 二、新功能 2.1 身份验证配置文件 2.2 触发器2.3 快速命令 2.4 RDP支持 2.5 快速启动 2.6 自定义会话图标 ◀.zstitle { width: 280px; text-align: center; font-size: 26px } .zsimgweixin { width: 280px } .zsimgali { width…

【Spring Boot配置数据源问题】Spring Boot配置数据源时遇到错误:jdbcUrl is required with driverClassName​

报错如图,需要修改数据源连接配置:修改前配置如图:将spring.datasource.url修改为spring.datasource.jdbc-url即可:寻找了网上其他解释: spring.datasource.url 数据库的 JDBC URL。 spring.datasource.jdbc-url 用来创建连接的 JDBC URL。

mssql windows 账户登录不了 要登录sa创建出来 才可以本地登录

SQL SERVER 登陆错误:18456SQL Windows身份登录失败,错误码:18456 先用sa进入 EXEC xp_instance_regread NHKEY_LOCAL_MACHINE, NSOFTWARE\Microsoft\Microsoft SQL Server\MSSQLServer, NLoginMode -- 启用TCP/IP协议EXEC xp_instance_regwrite NHKEY_LOCAL_MACHINE, NSOFTWA…

2024软件工程(第一次作业)

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13243这个作业的目标 适应后续使用博客园完成任务,初步体会AIGC的方便学号 1022014251.个人logo文生图任务设计理念:天上的白云体现…