Activiti工作流入门
前段时间,公司说要做技术分享,于是每周都会安排同事进行技术方面的分享,虽然有时候大部分的人在玩手机,有些同事也在专心致志的在学习,毕竟程序员永远都是保持在学习写代码的路上,JDK都出到16了,尽管你可能现在还是在使用 JDK8 但是还是要继续学习呀。于是阿粉就准备研究一些公司目前没有用到的关系,就学习了一下 Activiti 工作流的相关知识,在这里阿粉也分享给大家。
什么是 Activiti 工作流引擎 ?什么是工作流,比如说,我们在公司请假,可能要走审批的流程,从你自己到 Leader,然后从 Leader 到部门经理,然后部门经理再到人事部门,这一系列的流程实际上就相当于是一个工作流程,而这个就是一个工作流的最容易理解的模型。
这官方解读肯定不是这样,不然也太接地气了点,那么什么是 Activiti 工作流呢?
工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。在计算机中,工作流属于计算机支持的协同工作(CSCW)的一部分。后者是普遍地研究一个群体如何在计算机的帮助下实现协同工作的。
工作流主要解决的主要问题是:为了实现某个业务目标,利用计算机在多个参与者之间按某种预定规则自动传递文档、信息或者任务。
其实看到百度百科给我们的提示,我们就知道了,实际上工作流程就是为了让多个业务目标之间,按照某种规则传递信息。
上面的图是一个请假的流程图,网上的图,不是手动画的,但是表示的意思还是很清晰的。
接下来我们就整一个关于 Activiti 的项目来搞一搞吧。
准备工作我们先在 IDEA 中装个插件 actiBPM ,直接装就好。
从 GitHub 上下载源代码 就可以获取下载连接,
数据库在文件中,大家要注意,文件中的数据库是有对应的,mysql,oracle,这些都是不一样的,别直接打开就导入,结果导入半天,报了一大堆错误,还不知道为啥出错。
使用这几个 SQL 的脚本建立完数据库之后,就是上图的这些了,我们来看看都是有哪些表。
ACT_HI_*: 这些表包含历史数据,比如历史流程实例, 变量,任务等等ACT_ID_*: 这些表包含身份信息,比如用户,组织等等。ACT_RE_*: 包含了流程定义和流程静态资源 (图片,规则,等等)ACT_RU_*: 包含流程实例,任务,变量,异步任务等运行中的数据下面的这些表示通过下载的源码包然后进行导入进来的,我们下面在使用 Activiti 的时候,我们会直接使用 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_id_group用户信息组
act_id_info用户信息详情
act_id_membership组和对应信息关联表
act_id_user用户信息表
act_procdef_info流程定义信息
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流程变量数据
我们了解了这些数据都是干啥用的之后,接下来就直接从使用开始吧,毕竟要先看看这用起来是啥样子,才能知道他到底为什么这么香。
这些表如果你自己不拿出来用的话,使用 IDEA 创建关于 Activiti 的项目的时候,会给你自动创建表,就类似 Hibernate 一样。
使用 IDEA 创建 Activiti 项目使用 IDEA 创建一个项目,然后再 POM 文件中加入依赖 dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.12/version /dependency !--- Activiti依赖导入 -- dependency groupIdorg.activiti/groupId artifactIdactiviti-spring/artifactId version5.18.0/version /dependency dependency groupIdorg.activiti/groupId artifactIdactiviti-engine/artifactId version5.18.0/version exclusions exclusion artifactIdslf4j-api/artifactId groupIdorg.slf4j/groupId /exclusion exclusion artifactIdspring-beans/artifactId groupIdorg.springframework/groupId /exclusion exclusion artifactIdjackson-core-asl/artifactId groupIdorg.codehaus.jackson/groupId /exclusion exclusion artifactIdcommons-lang3/artifactId groupIdorg.apache.commons/groupId /exclusion exclusion artifactIdcommons-lang3/artifactId groupIdorg.apache.commons/groupId /exclusion /exclusions /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version5.1.35/version /dependency工作流就是工作流,那是不是得有流程图,就像某些 OA 系统中,要先进行定义流程图,然后自动给你开始搞事情,我们画个流程图来试试。
在src/main/resources下面新建一个BPMN文件流程图建立完成之后,就出现了在 IDEA 从来没有见过的画面,
大家看上图的右半部分,是不是有很多的类似按钮的标志,我们来解释一下他们都是些什么。
StartEvent:启动事件元素,启动事件元素就是启动流程实例的,也就是发起一个流程的,是流程的起点。它可以配置得很简单,也可以很复杂。EndEvent:结束事件元素,Activiti工作流始于开始任务,止于结束任务UserTask:用户操作的任务ScriptTask: 脚本任务ServiceTask:服务任务MailTask: 邮件任务ManualTask: 手工任务ReceiveTask: 接收任务BusinessRuleTask:规则任务CallActivityTask:调用其他流程任务SubProcess: 的流程Pool: Pool池Lane: Lane小巷 (注意:Lane小巷是放在Pool池里面的)ParallelGateWay: 并行网关ExclusiveGateWay: 排他网关InclusiveGateWay: 包容网关EventGateWay: 事件网关BoundaryEvent: 边界事件IntermediateCatchingEvent: 中间事件IntermediateThrowingEvent:边界补偿事件Annotation: 注释我们先画一个简单的流程图,然后生成我们需要的表。
图我们换完了,接下来我们就来整个 Activiti 的配置文件,然后使用配置文件去生成表。
activity.cfg.xml
?xml version="1.0" encoding="UTF-8"?beans xmlns="接下来我们就是用这个配置,去生成我们的数据表,
package com.activity.zhiyikeji.management;import org.activiti.engine.ProcessEngine;import org.activiti.engine.ProcessEngineConfiguration;import org.junit.Test;/** * @ClassName LeaveFlow * @Author * @Date 2021/6/11 14:06 * @Description LeaveFlow */public class LeaveFlow { @Test public void creatTable{ ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activity.cfg.xml").buildProcessEngine; }}执行的时候,我们看一下控制台打印了什么内容,
然后去看看你的数据库,是不是生成成功了,看一看表的数量,一般是24,
从数据包中取出来的 SQL 脚本是多了一个流程定义信息表,这么看来,这个表对使用 Activiti 来说意义不大,没他还是可以运行的。
我们已经创建好表之后,接下来我们就来直接进行部署我们画的流程图,然后看看数据库的表中是一些什么样子的数据。
/** * 部署请假流程 */ @Test public void deployLeaveFlow{ ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activity.cfg.xml").buildProcessEngine; RepositoryService repositoryService = processEngine.getRepositoryService; DeploymentBuilder builder = repositoryService.createDeployment; builder.addClasspathResource("zhiyikeji.BPMN");//bpmn文件的名称 builder.deploy; }嘿,提示完成了,一次过,没出错,
14:32:50.747 [main] DEBUG org.activiti.engine.impl.interceptor.LogInterceptor - --- DeployCmd finished --------------------------------------------------------14:32:50.747 [main] DEBUG org.activiti.engine.impl.interceptor.LogInterceptor -
当我看到这个的时候,我就放心了,我知道,看来,进去了,没啥问题了,那我们就来试试启动一下这个流程。
/** * 启动请假流程 */ @Test public void startProcess { ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activity.cfg.xml").buildProcessEngine; RuntimeService runtimeService = processEngine.getRuntimeService; runtimeService.startProcessInstanceByKey("leaveProcess");//流程的名称,也可以使用ByID来启动流程 }在我们执行完启动请假流程的时候,在 act_ru_task 运行时任务节点表中,就有了我们的一条任务,这样我们就能看到这个任务是什么了。
是不是这么看有点太基础了,这东西看起来也没有我们想象的这么高大上,那我们就找个开源项目,然后把工作流所有的东西都跑起来,然后再去一个个的分析工作流的内容。
阿粉找到了一个开源的项目,项目还是不错的,尤其是得感谢开源出来的大佬shenzhanwang ,先给大家放上图,大家有兴趣的可以下载。
毕竟开源不易,大家对这个有兴趣的可以下载一下看看,阿粉之后再继续给大家了解一下关于 Activiti 的里面的一些画 bpmn 图的那些流程上的所有内容。