什么是 Activity 工作流引擎 ?
什么是工作流,比如说,我们在公司请假,可能要走审批的流程,从你自己到 Leader,然后从 Leader 到部门经理,然后部门经理再到人事部门,这一系列的流程实际上就相当于是一个工作流程,而这个就是一个工作流的最容易理解的模型。
这肯定官方解读肯定不是这样,不然也太接地气了点,那么什么是 Activity 工作流呢?
工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。在计算机中,工作流属于计算机支持的协同工作(CSCW)的一部分。后者是普遍地研究一个群体如何在计算机的帮助下实现协同工作的。
工作流主要解决的主要问题是:为了实现某个业务目标,利用计算机在多个参与者之间按某种预定规则自动传递文档、信息或者任务。
其实看到百度百科给我们的提示,我们就知道了,实际上工作流就是为了让多个业务目标之间,按照某种规则传递信息。
上面的图是一个请假的流程图,网上的图,不是手动画的,但是表示的意思还是很清晰的。
接下来我们就整一个关于 Activity 的项目来搞一搞吧。
准备工作
我们先再 IDEA 中装个插件 actiBPM ,直接装就好。
从 GitHub 上下载源代码 https://github.com/Activiti/Activiti 或者我们直接从官网上下载,https://www.activiti.org/get-started,下载版本的话,新版本也可以,老版本也凑活,我们下载了个比较古老的版本,5.22.
因为网速原因,数据包阿粉已经给大家准备好了,大家回复 Activity 就可以获取下载连接,
数据库在文件中,大家要注意,文件中的数据库是有对应的,mysql,oracle,这些都是不一样的,别直接打开就导入,结果导入半天,报了一大堆错误,还不知道为啥出错。
使用这几个 SQL 的脚本建立完数据库之后,就是上图的这些了,我们来看看都是有哪些表。
ACT_HI_*: 这些表包含历史数据,比如历史流程实例, 变量,任务等等
ACT_ID_*: 这些表包含身份信息,比如用户,组等等。
ACT_RE_*: 表包含了流程定义和流程静态资源 (图片,规则,等等)
ACT_RU_*: 包含流程实例,任务,变量,异步任务等运行中的数据
下面的这些表示通过下载的源码包然后进行导入进来的,我们下面在使用 Activity 的时候,我们会直接使用 Activity 设计好流程图,然后我们直接让它帮我们去生成表。
表 | 说明 | |
---|---|---|
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 创建关于 Activity 的项目的时候,会给你自动创建表,就类似 Hibernate 一样。
使用 IDEA 创建 Activity 项目
使用 IDEA 创建一个项目,然后再 POM 文件中加入依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--- Activiti依赖导入 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>5.18.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.18.0</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>jackson-core-asl</artifactId>
<groupId>org.codehaus.jackson</groupId>
</exclusion>
<exclusion>
<artifactId>commons-lang3</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
<exclusion>
<artifactId>commons-lang3</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
工作流就是工作流,那是不是得有流程图,就像某些 OA 系统中,要先进行定义流程图,然后自动给你开始搞事情,我们画个流程图来试试。
在src/main/resources下面新建一个BPMN文件
流程图建立完成之后,就出现了在 IDEA 中从来没有见过的画面,
大家看上图的右半部分,是不是有很多的类似按钮的标志,我们来解释一下他们都是些什么。
StartEvent:启动事件元素,启动事件元素就是启动流程实例的,也就是发起一个流程的,是流程的起点。它可以配置的很简单,也可以很复杂。
EndEvent:结束事件元素,Activity工作流始于开始任务,止于结束任务
UserTask:用户操作的任务
ScriptTask: 脚本任务
ServiceTask:服务任务
MailTask: 邮件任务
ManualTask: 手工任务
ReceiveTask: 接收任务
BusinessRuleTask:规则任务
CallActivityTask:调用其他流程任务
SubProcess: 子流程
Pool: Pool池
Lane: Lane小巷 (注意:Lane小巷是放在Pool池里面的)
ParallelGateWay: 并行网关
ExclusiveGateWay: 排他网关
InclusiveGateWay: 包容网关
EventGateWay: 事件网关
BoundaryEvent: 边界事件
IntermediateCatchingEvent: 中间事件
IntermediateThrowingEvent:边界补偿事件
Annotation: 注释
我们先画一个简单的流程图,然后生成我们需要的表。
图我们换完了,接下来我们就来整个 Activity 的配置文件,然后使用配置文件去生成表。
activity.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/managementactivity?useUnicode=true&characterEncoding=utf8"></property>
<property name="jdbcUsername" value="root"></property>
<property name="jdbcPassword" value="123456"></property>
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
</beans>
接下来我们就是用这个配置,去生成我们的数据表,
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 脚本是多了一个流程定义信息表,这么看来,这个表对使用 Activity 来说意义不大,没他还是可以运行的。
我们已经创建好表之后,接下来我们就来直接进行部署我们画的流程图,然后看看数据库的表中是一些什么样子的数据。
/**
* 部署请假流程
*/
@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
,先给大家放上图,大家有兴趣的可以下载。
毕竟开源不易,大家对这个有兴趣的可以下载一下看看,阿粉之后再继续给大家了解一下关于 Activity 的里面的一些画 bpmn 图的那些流程上的所有内容。
文章浏览阅读1.2w次,点赞23次,收藏104次。文章目录前言从传统学习引出元学习对比机器学习和元学习如何实现元学习参考链接前言元学习Meta Learning,含义为学会学习,即learn to learn,带着对人类的“学习能力”的期望诞生的。Meta Learning希望使得模型获取一种 “学会学习” 的能力,使其可以在获取已有“知识”的基础上快速学习新的任务。从传统学习引出元学习传统的机器学习方法是针对一个特定的,一般是有大量数据的数据集 ,试图学习出一个预测模型 ,使得模型对于测试集上的数据的预测有最小的误差。这个思路在数据集 D_meta learning
文章浏览阅读362次。一、类型相关操作1.type函数理解:type(数据)获取指定数据类型例如:type(100) #直接输入是不会打印,需要printprint(type(100)) #整型(int) #得出结果:100print(type(1.25)) #浮点型(float) #得出结果:1.25print(type('陈某某')) #字符串(str) #得出结果:陈某某print(type(10>20)) #布尔(bool) _type({100})
文章浏览阅读798次。在运行idea时常常提示端口被占用,在cmd查询该端口,但显示端口没有被占用怎么办?_unable to open debugger port 12208
文章浏览阅读312次。docker不容置疑,目前最为成熟最广泛的虚拟容器产品,虽然k8s在docker编排基础上,基于战略原因,协同google,ibm推出了CRI标准,兼容一切符合CRI标准的容器厂商,而带动了podman等其他容器产品的百花齐放,但是docker依然在诸多的容器产品里鹤立鸡群,强就是强,无惧大厂商的霸权,今天这里谈谈docker使用里查看容器启动命令的一个工具。runcommandruncommand是一款使用golang实现的基于容器管理的工具,市面上也有一些同类产品的实现,比如笔者我,在没有开发runco_docker joinsunsoft
文章浏览阅读9.9k次,点赞115次,收藏108次。ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口。_arrylist
文章浏览阅读1.2k次,点赞12次,收藏73次。一、分布式知识点:分布式基础、缓存机制、消息机制、搜索机制、分布式ID、分布式锁、分布式SESSION、分布式事务、分布式分页、分布式部署、二、分布式基础知识 软件架构设计的六大原则:https://blog.csdn.net/u012562943/article/details/76110761 软件架构需要考虑的基本原则:https://blog.csdn.net/zyhl..._分布式、缓存、消息等机制;
文章浏览阅读802次。前言之前在网易和CSDN上零零散散写了一些博客,后来因为觉得写博客不方便。首先,是博客的编辑器功能不够强大;另外,我一般习惯在word上写文档,但从word文档转到博客时经常发生格式混乱的情况。由于当时觉得写博客费时、麻烦,就没有着手寻找相关的解决方法。但是,随着本地word文档越来越多,散步在硬盘的不同文件夹,对于自己管理博客和查看博客都造成了不便。首先,无法让自己清楚的从整体上查看_新浪博客 wlw
文章浏览阅读513次,点赞18次,收藏8次。• 在这种开发技术模式下,系统的开发流程主要是前端专注于使用Vue.js构建动态和响应式的用户界面,同时通过Ajax技术与后端进行数据交换,实现了前后端的逻辑分离。传统的停车场管理方式已经无法满足现代社会的需求,因此,研究并开发一种智能化的停车场管理系统显得尤为重要。同时,系统还可以根据停车场的实际情况,自动调整收费标准,实现公平合理的收费。其次,智能化停车场管理系统可以提高停车场的管理效率。通过这种系统,可以实现车辆的自动识别、自动收费、自动导航等功能,大大提高了停车场的管理效率和服务质量。
文章浏览阅读48次。多人認為遠距離關係(異地戀)幾乎都會無疾而終。家人不支持,甚至朋友也勸你不要全身心投入,以免未來傷心透頂。的確,維持一段異地戀並不容易——遙遠的距離令很多事變得難以實現。一切變得複雜起來,偶爾難過萬分,偶爾孤獨無助。不過,距離的遙遠卻也讓最簡單的小事做起來甜甜蜜蜜。例如,挽著對方的手,一起同桌吃飯,感受彼此的觸碰,一起散步,聞著彼此的發香...... 在異地戀中,如此渺小的願望瞬間顯得彌足珍貴。雖然異地戀很艱難,但也會帶來很多驚喜。如果真的不能避免異地戀,那我們也只能花心思去維持這段戀情了。
文章浏览阅读541次。题目大意:对一个数组排序,但基本操作是翻转(使倒序)前k个元素(k可以是0到n-1(n为数组元素个数))。#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include #include #include #inc_煎饼 stacks of flapjacks
文章浏览阅读4.6k次,点赞2次,收藏12次。首先讲下搬运作品上热门,很多朋友傻傻的以为把别人的视频去掉水印或者修改一下MD5值然后发出去就可以热门了,那么简单的话全世界都是热门了!拜托,先搞懂短视频的检测原理,MD5检测都是多少年前的技术了?你确定快手火山抖音这种大平台会用这么low的检测技术?我来告诉你们他们是怎么检测的!抽取你的作品,某个时间段的某一帧。和其他作品的某一帧,进行点对点之间的对比重合。然后再上下浮动若干秒进行对比..._快手如何检测视频是否原创
文章浏览阅读2k次。Cesium 实战 - 点对象(point)、广告牌(billboard)、文字标签(label)贴地问题以及总结。_cesium point