百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Activiti工作流入门

toyiye 2024-06-23 18:59 19 浏览 0 评论

前段时间,公司说要做技术分享,于是每周都会安排同事进行技术方面的分享,虽然有时候大部分的人在玩手机,有些同事也在专心致志的在学习,毕竟程序员永远都是保持在学习写代码的路上,JDK都出到16了,尽管你可能现在还是在使用 JDK8 但是还是要继续学习呀。于是阿粉就准备研究一些公司目前没有用到的关系,就学习了一下 Activiti 工作流的相关知识,在这里阿粉也分享给大家。


什么是 Activiti 工作流引擎 ?

什么是工作流,比如说,我们在公司请假,可能要走审批的流程,从你自己到 Leader,然后从 Leader 到部门经理,然后部门经理再到人事部门,这一系列的流程实际上就相当于是一个工作流程,而这个就是一个工作流的最容易理解的模型。

这官方解读肯定不是这样,不然也太接地气了点,那么什么是 Activiti 工作流呢?

工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。在计算机中,工作流属于计算机支持的协同工作(CSCW)的一部分。后者是普遍地研究一个群体如何在计算机的帮助下实现协同工作的。

工作流主要解决的主要问题是:为了实现某个业务目标,利用计算机在多个参与者之间按某种预定规则自动传递文档、信息或者任务。

其实看到百度百科给我们的提示,我们就知道了,实际上工作流程就是为了让多个业务目标之间,按照某种规则传递信息。

上面的图是一个请假的流程图,网上的图,不是手动画的,但是表示的意思还是很清晰的。

接下来我们就整一个关于 Activiti 的项目来搞一搞吧。

准备工作

  1. 我们先在 IDEA 中装个插件 actiBPM ,直接装就好。
  1. 从 GitHub 上下载源代码 https://github.com/Activiti/Activiti 或者我们直接从官网上下载,https://www.activiti.org/get-started,下载版本的话,新版本也可以,老版本也凑活,我们下载了个比较古老的版本,5.22.

因为网速原因,数据包阿粉已经给大家准备好了,大家回复 Activiti 就可以获取下载连接,

数据库在文件中,大家要注意,文件中的数据库是有对应的,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 项目

  1. 使用 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 系统中,要先进行定义流程图,然后自动给你开始搞事情,我们画个流程图来试试。

  1. 在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="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 脚本是多了一个流程定义信息表,这么看来,这个表对使用 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 图的那些流程上的所有内容。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码