【activiti】activiti入门

article/2025/11/9 16:58:50

activiti入门

在本章内容中,我们来创建一个Activiti工作流,并启动这个流程。

创建Activiti工作流主要包含以下几步:

1、定义流程,按照BPMN的规范,使用流程定义工具,用流程符号把整个流程描述出来

2、部署流程,把画好的流程定义文件,加载到数据库中,生成表的数据

3、启动流程,使用java代码来操作数据库表中的内容

1.流程符号

BPMN2.0就是使用一些符号来明确业务流程设计流程图的一整套符号规范。

基本流程符号:

事件Event

image-20211129205405044

活动Activity

活动是一个工作或任务的通用术语。一个活动可以是一个任务,也可以是一个当前流程的子处理流程。

常见的活动如下:

image-20211129205431842

网关Getway

网关用来处理决策,常用的网关如下:

  • 排他网关

只有一条路径会被选择。流程执行到该网关时,按照输出流的顺序逐个计算,当条件的计算结果为true时,继续执行当前网关的输出流。如果多条线路计算结果都是true,则会执行第一个值为true的线路。如果所有网关计算结果没有true,则引擎会抛出异常。

排他网关需要和条件顺序流结合使用,default属性指定默认顺序流,当所有的条件不满足时会执行默认顺序流。

  • 并行网关

所有路径都会被同时选择。

拆分:并行执行所有输出顺序流,为每一条顺序流创建一个并行执行线路。

合并:所有从并行网关拆分并执行完成的线路均在此等候,直到所有的线路都执行完成才可以继续向下执行。

  • 包容网关

可以同时执行多条线路,也可以在网关上设置条件。

拆分:计算每条线路上的表达式,当表达式计算结果为true时,创建一个并行线路并执行。

合并:所有从并行网关拆分并执行完成的线路均在此等候,直到所有的线路都执行完成才可以挤继续向下执行。

  • 事件网关

专门为中间捕获事件设置的,运行设置多个输出流指向多个不同的中间捕获事件。当流程执行到事件网关后,流程处于等待状态,需要等待抛出事件才能将等待状态转换为活动状态。

流向Flow

流是连接两个流程节点的连线。常见的流向包含:

image-20211129213009002

2.流程设计器使用

在idea中已经安装好bpmn插件,安装好的插件面板(可以自行百度,我这里装的是activiti bpmn visualizer):

image-20211129214204957

2.1新建流程

在resource目录下新建bpmn目录,然后点击右键菜单新建:

image-20211129214456485

文件名随意,默认生成一个xml文件,右键文件:

image-20211129214745629

弹出绘图层

image-20211129214825235

2.2绘制流程

在面板右键,选择Activities > User Task,创建一个用户任务,并定义属性值:该节点为zhangsan创建出差申请单

image-20211129215332783

再次选择Activities > User Task,创建下一个任务,并定义属性值:部门经理审批人为lisi

image-20211129215537750

再创建一个任务,定义属性值:总经理审批人为wangwu

image-20211129215758090

再创建一个任务。定义属性值:财务审批为zhaoliu

image-20211129215918818

最后创建一个结束事件:

image-20211129220142790

然后将所有的流程符号连接起来,如下:

image-20211129220237723

image-20211129220505009

image-20211129220553110

3.流程操作

流程定义是线下按照bpmn2.0标准去描述 业务流程,通常使用idea中的插件对业务流程进行建模。

上面步骤,创建的流程文件是.xml文件,我们需要改成bpmn文件,然后还需要该流程的png文件

png文件,直接右键导出保存到resource/bpmn路径下

image-20211129221438934

bnmn文件直接将上面创建的xml文件改后缀名即可

image-20211129221624544

最后在resource/bpmn路径下有两个文件,evection.png,evection.bpmn

4.流程部署

将上面的流程部署到activiti数据库中,就是流程定义部署。

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

4.1单文件部署方式
    /*** 流程部署*/@Testpublic void testDeployment() {//创建ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//得到RepositoryService实例,该实例是activiti的资源管理类RepositoryService repositoryService = processEngine.getRepositoryService();//使用repositoryService进行部署Deployment deployment = repositoryService.createDeployment()//添加bpmn资源.addClasspathResource("bpmn/evection.bpmn")//添加png.addClasspathResource("bpmn/evection.png").name("出差申请流程").deploy();//输出部署信息System.out.println("流程id:" + deployment.getId());System.out.println("流程部署名:" + deployment.getName());}

执行上面代码后activiti会将上边代码中指定的bpm文件和图片文件保存在activiti数据库。

act_re_deployment 流程定义部署表,每部署一次增加一条记录

image-20211129225014798

act_re_procdef 流程定义表,部署每个新的流程定义都会在这张表中增加一条记录

image-20211129225028847

act_ge_bytearray 流程资源表

image-20211129225042243

注意:act_re_deployment和act_re_procdef是一对多的关系,一次部署在流程部署表生成一条记录,但一次部署可部署多个流程定义,每个流程定义在流程定义表生成一条记录。每个流程定义在act_ge_bytearray表会存在两个资源记录,bpmn和png。

建议:一次部署一个流程,这样部署表和流程定义表是一对一的关系,方便读取流程部署及流程定义信息。

4.2压缩包部署方式
    /*** 压缩包方式部署*/@Testpublic void testDeploymentByZip() {//定义zip流InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("bpmn/evection.zip");ZipInputStream zipInputStream = new ZipInputStream(inputStream);//创建ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取RepositoryServiceRepositoryService repositoryService = processEngine.getRepositoryService();//使用repositoryService进行部署Deployment deployment = repositoryService.createDeployment()//添加zip.addZipInputStream(zipInputStream).name("出差申请流程").deploy();//输出部署信息System.out.println("流程id:" + deployment.getId());System.out.println("流程部署名:" + deployment.getName());}

5.启动流程

流程定义部署在activiti后就可以通过工作流管理业务流程了。

针对该流程,启动一个流程表示发起一个新的出差申请单。张三发起一个出差申请单需要启动一个流程实例,出差申请单发起一个出差单也需要启动一个流程实例。

    /*** 启动流程实例*/@Testpublic void startProcess() {//创建ProcessEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取runtimeServiceRuntimeService runtimeService = processEngine.getRuntimeService();//根据流程key启动流程ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("evection");//输出内容System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());System.out.println("流程实例id:" + processInstance.getId());System.out.println("当前活动id:" + processInstance.getActivityId());}
流程定义id:evection:1:7504
流程实例id:15001
当前活动id:null

这里根据的key查询:就是act_re_procdef的key字段值,也是evection.bpmn20.xmlprocess标签的id值,后续的查询key同样

image-20211129233746154

操作数据表

act_hi_actinst 流程实例执行历史

act_hi_identitylink 流程的参与用户历史信息

act_hi_procinst 流程实例历史信息

act_hi_taskinst 流程任务历史信息

act_ru_execution 流程执行信息

act_ru_identitylink 流程的参与用户信息

act_ru_task 任务信息

6.任务查询

流程启动后,任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是当前用户的待办任务。

    /*** 查询当前个人待执行任务*/@Testpublic void queryTask() {//任务负责人String assignee = "zhagnsan";//创建processEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//创建taskServiceTaskService taskService = processEngine.getTaskService();//根据流程任务key和任务负责人查询任务List<Task> taskList = taskService.createTaskQuery().processDefinitionKey("evection") //流程key.taskAssignee(assignee) //只查询该任务负责人的任务.list();taskList.forEach(task -> {System.out.println("流程实例id:" + task.getProcessInstanceId());System.out.println("任务id:" + task.getId());System.out.println("任务负责人:" + task.getAssignee());System.out.println("任务名称:" + task.getName());});}
流程实例id:15001
任务id:15005
任务负责人:zhagnsan
任务名称:创建出差申请单

7.流程任务处理

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

    /*** 完成任务*/@Testpublic void completeTask() {//获取processEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取taskServiceTaskService taskService = processEngine.getTaskService();//根据流程key和任务负责人查询任务List<Task> taskList = taskService.createTaskQuery().processDefinitionKey("evection") //流程key.taskAssignee("zhagnsan") //要查询的负责人.list();//完成任务,参数任务idtaskList.forEach(task -> {taskService.complete(task.getId());});}

8.流程定义信息查询

查询流程相关信息,包含流程定义、流程部署、流程定义版本等

    /*** 查询流程定义*/@Testpublic void queryProcessDefinition() {//获取processEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取RepositoryServiceRepositoryService repositoryService = processEngine.getRepositoryService();//获取ProcessDefinitionQueryProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();/*** 查询到当前流程的所有定义* 条件:processDefinitionKey = evection*      orderByProcessDefinitionVersion desc 按照版本倒序* 返回list集合*/List<ProcessDefinition> definitionList = processDefinitionQuery.processDefinitionKey("evection").orderByProcessDefinitionVersion().desc().list();//输出流程定义信息definitionList.forEach(processDefinition -> {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());});}
流程定义id:evection:1:7504
流程定义name:evection
流程定义key:evection
流程定义version:1
流程部署id:7501

9.流程删除

    /*** 流程删除*/@Testpublic void deleteProcess() {//流程部署idString deploymentId = "20001";//获取processEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取RepositoryServiceRepositoryService repositoryService = processEngine.getRepositoryService();//删除流程定义,如果该流程定义已有流程实例启动,则删除报错repositoryService.deleteDeployment(deploymentId);//级联删除,即时流程已有流程实例启动也可以删除//repositoryService.deleteDeployment(deploymentId, true); //true为级联删除}

说明:

  1. 使用repositoryService删除流程定义,历史表信息不会被删除

  2. 如果流程定义下没有流程实例启动,使用普通删除,只传流程id即可

  3. 如果流程定义下有流程实例启动,使用普通删除会报错,需要使用级联删除且级联删除会将相关记录全部删除

    项目开发中级联删除操作一般只开放给超级管理员使用

10.流程资源下载

上面流程部署的时候,已经将流程资源文件bpmn和png文件上传到数据库中,如果需要查看这些资源文件的话,可以从数据库将资源文件下载到本地。

解决方案有:

  1. act_ge_bytearray表中可以看到资源文件是以BLOB的格式存储的,可以通过jdbc操作进行读取再存储到本地
  2. 直接使用activiti的api来实现

使用commons-io.jar 解决IO的操作

引入commons-io依赖包

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>

使用api的方式实现:

    /*** 下载流程资源文件 bpmn png*/@Testpublic void downloadFile() throws Exception {//得到processEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//得到repositoryServiceRepositoryService repositoryService = processEngine.getRepositoryService();//得到流程定义查询器,设置查询条件查询想要的流程定义ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("evection").singleResult();//获取到流程部署idString deploymentId = processDefinition.getDeploymentId();//通过deploymentId获取到png和bpmnInputStream pngInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());//构建outputStreamFile pngFile = new File("d:/data/evection.png");File bpmnFile = new File("d:/data/evection.bpmn");FileOutputStream pngOutput = new FileOutputStream(pngFile);FileOutputStream bpmnOutput = new FileOutputStream(bpmnFile);//输入流输出流转换IOUtils.copy(pngInput, pngOutput);IOUtils.copy(bpmnInput, bpmnOutput);//关闭流pngOutput.close();bpmnOutput.close();pngInput.close();bpmnInput.close();}

说明:

  1. deploymentId是流程部署id
  2. resource_name是act_ge_bytearray表中的NAME_列的值
  3. 使用repositoryService的getDeploymentResourceNames方法可以获取指定部署下的所有文件的名称
  4. 使用repositoryService的getResourceAsStream方法传入部署id和资源文件名称可以获取指定文件的输入流
  5. 最后将资源文件的输入流输出到本地

11.流程历史信息查询

即时流程定义已经删除,流程执行的历史信息还是可以在act_hi_*相关的表中查询到。级联删除的不可以。

    /*** 历史信息查询*/@Testpublic void queryHistory() {//获取processEngineProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();//获取historyServiceHistoryService historyService = processEngine.getHistoryService();//获取actinst表的查询对象HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();//排序,根据开始时间排序instanceQuery.orderByHistoricActivityInstanceStartTime().asc();//查询actinst表,条件:根据instanceId查询//instanceQuery.processInstanceId("25001");//查询 actinst表,条件:根据 DefinitionId 查询instanceQuery.processDefinitionId("evection:1:22504");List<HistoricActivityInstance> instanceList = instanceQuery.list();instanceList.forEach(instance -> {System.out.println(instance.getId());System.out.println("流程活动id:" + instance.getActivityId());System.out.println("流程活动名称:" + instance.getActivityName());System.out.println("流程实例id:" + instance.getProcessInstanceId());System.out.println("流程定义id:" + instance.getProcessDefinitionId());System.out.println("===================================");});}
25003
流程活动id:sid-07bae378-ef8d-4dab-83a7-ea0943ba27f3
流程活动名称:开始出差申请单任务
流程实例id:25001
流程定义id:evection:1:22504
===================================
25004
流程活动id:sid-60d04e4f-b36f-4e69-ad4f-4a51be3d1c3c
流程活动名称:创建出差申请单
流程实例id:25001
流程定义id:evection:1:22504
===================================
27501
流程活动id:sid-cc56cae5-1d4f-48a1-9df1-c7987b1e3ce6
流程活动名称:部门经理审批
流程实例id:25001
流程定义id:evection:1:22504
===================================

http://chatgpt.dhexx.cn/article/SSDWRjAV.shtml

相关文章

Activiti 介绍

一、工作流 1.工作流 工作流(Workflow)&#xff0c;就是“业务过程的部分或整体在计算机应用环境下的自动化”&#xff0c;它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行&#xff0c;从而实现某个预期的业务目标&#xff0c;或…

Vuetify组件中常见的v-slot:activator=“{ on, attrs }“是什么意思?

在使用Vuetify组件时&#xff0c;常看到v-slot:activator"{ on, attrs }"以及插槽中的v-bind"attrs" v-on"on" 例如&#xff1a; 由于之前写代码时少有这种写法而且是第一次遇见&#xff0c;用久了难免想知道是什么意思。因为国内没有相关的问…

Tedddby Activator V5.1,免费绕过iOS 14.7Beta,支持iCloud登录

Tedddby Activator 是一款Windows下绕激活的工具&#xff0c;目前来说也是最好用的一款软件&#xff01; Tedddby Activator官网&#xff1a;https://tedddby.com 支持的功能 GSM两网绕过可以打电话/4G/短信/iCloud登陆/完美重启/消息推送 MEID三网游戏机绕过可以登陆iClou…

Spring Boot Actuator详解与深入应用(一):Actuator 1.x

《Spring Boot Actuator详解与深入应用》预计包括三篇&#xff0c;第一篇重点讲Spring Boot Actuator 1.x的应用与定制端点&#xff1b;第二篇将会对比Spring Boot Actuator 2.x 与1.x的区别&#xff0c;以及应用和定制2.x的端点&#xff1b;第三篇将会介绍Actuator metric指标…

springboot 集成 actuator

简介 spring-actuator做度量统计收集&#xff0c;使用Prometheus&#xff08;普罗米修斯&#xff09;进行数据收集&#xff0c;Grafana&#xff08;增强ui&#xff09;进行数据展示&#xff0c;用于监控生成环境机器的性能指标和业务数据指标。一般&#xff0c;我们叫这样的操作…

Activiti应用

1.介绍 Activiti是一个工作流引擎&#xff0c; activiti可以将业务系统中复杂的业务流程抽取出来&#xff0c;使用专门的建模语言 BPMN2.0进行定义&#xff0c;业务流程按照预先定义的流程进行执行&#xff0c;实现了系统的流程由activiti进行管理&#xff0c;减 少业务系统由…

springboot之Actuator

1、Actuator 介绍 Actuator是Springboot提供的用来对应用系统进行自省和监控的功能模块&#xff0c;借助于Actuator开发者可以很方便地对应用系统某些监控指标进行查看、统计等。 Actuator 的核心是端点 Endpoint&#xff0c;它用来监视应用程序及交互&#xff0c;spring-boo…

ActivitiListener

ActivitiListener 目录概述需求&#xff1a; 设计思路实现思路分析1.ActivitiListener2.Activity3.Gateway5.FieldExtension IOSpecification 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;sk…

SolidWorks2016软件,SW2010-2016.Activator.GUI.SSQ激活闪退解决办法:

SolidWorks2016软件&#xff0c;SW2010-2016.Activator.GUI.SSQ激活闪退解决办法&#xff1a; 解决方案&#xff1a; 原贴&#xff1a; https://xcshare.cn/other/1033.html

Actuator

1&#xff0c;简介 Actuator’ ktʃʊˌeɪtə是 Spring Boot 提供的对应用系统的自省和监控的 集成功能&#xff0c;可以对应用系统进行配置查看、相关功能统计等。在 Spring Cloud 中主要是完成 微服务的监控&#xff0c;完成监控治理。可以查看微服务间的数据处理和调用&…

Spring boot——Actuator 详解

一、什么是 Actuator Spring Boot Actuator 模块提供了生产级别的功能&#xff0c;比如健康检查&#xff0c;审计&#xff0c;指标收集&#xff0c;HTTP 跟踪等&#xff0c;帮助我们监控和管理Spring Boot 应用。 这个模块是一个采集应用内部信息暴露给外部的模块&#xff0c…

Spring Boot Actuator详解

Actuator简介 什么是Spring Boot Actuator&#xff1f; Spring Boot Actuator 模块提供了生产级别的功能&#xff0c;比如健康检查&#xff0c;审计&#xff0c;指标收集&#xff0c;HTTP跟踪等&#xff0c;帮助我们监控和管理Spring Boot应用。这个模块是一个采集应用内部信…

C# 反射之Activator用法举例

概述 程序运行时&#xff0c;通过反射可以得到其它程序集或者自己程序集代码的各种信息&#xff0c;包括类、函数、变量等来实例化它们&#xff0c;执行它们&#xff0c;操作它们&#xff0c;实际上就是获取程序在内存中的映像&#xff0c;然后基于这个映像进行各种操作。 Acti…

将IPA放到服务器提供下载

2015年12月15日 09:45:16 LC_畅 阅读数&#xff1a;3696 &#xff0a; 上传到服务器我们需要两个文件&#xff0c;一个ipa和一个 plist文件 &#xff0a; 注意plist文件和ipa包的名字必须要相同&#xff08;最好取名英文&#xff09; 第一步&#xff1a;把ipa文件放到你们服务…

ipa文件包获取服务器地址,iOS获取App ipa包以及资源文件

要获得线上APP的ipa文件&#xff0c;现在有以下几种方案 1.通过PP助手下载安装到手机的应用 2.通过iTools助手下载安装到手机的应用 3.通过Apple Configurator 2(Mac商店)获取 前两种方案网上的教程很多&#xff0c;这里只介绍第三种方案 首先 去Mac上的App Store下载Apple Con…

AppleStore 原始ipa文件提取

//TODO Apple Configurator 2提取ipa文件_饿到饱的博客-CSDN博客安装Apple Configurator 2从Mac AppStore安装Apple Configurator 2下载ipa打开后连接设备&#xff0c;选中设备点击添加&#xff0c;如果没登录就登录Apple ID&#xff0c;登录后会把你在AppStore下过的应用都列…

获取ipa文件下载链接(appstore下载链接)

获取apptore下载链接 所需工具: 一台越狱的iphone 抓包工具(fiddler或burp等) 步骤 1、ios10以下的版本,越狱之后下载插件ssl kill就可对appstore进行抓包 2、ios11以后的版本,越狱后要想访问appstore还需appstore++插件 3、打开appstore,找到要下载的软件,点击下…

Mac 电脑下载 AppStore 中的 ipa 软件包详细流程

附&#xff1a;iPhone 移除描述文件详细步骤&#xff08;Apple Configurator 2&#xff09; 1、Mac 电脑中安装 Apple Configurator 2 软件。 2、电脑连接手机&#xff0c;并信任&#xff0c;在所有设备中&#xff0c;选中设备&#xff0c;然后点击顶部的加号&#xff0c;选…

关于直接下载第三方IPA应用分发平台之蒲公英的研究

目前基于第三方应用分发的平台比较常用的就属蒲公英、fir等&#xff0c;在我们提交到平台后&#xff0c;我们可以通过扫描应用二维码来下载&#xff0c;比如蒲公英平台如下&#xff1a; 那么以上是非常普通的一个操作过程&#xff0c;问题来了&#xff1a;如何直接在电脑端下载…

ipa在线安装搭建_GBox:一款ipa签名安装下载神器

(主要功能:ipa签名安装、ipa安装包下载) 最新版使用教程点这里,并免费附送有效的企业证书: Alex.Leung:GBox免越狱签名安装IPA教程​zhuanlan.zhihu.com 一、推荐理由 让我们对市面上主流ipa安装工具作个对比: Shu: 付费应用,并且得配合捷径脚本使用JSBox:付费应用,…