activiti6 学习

末鹿安然 提交于 2020-03-12 21:44:05

工作流介绍

 

为什么需要工作流

工作流技术选型

 

activiti 官网

网站: https://www.activiti.org/

部署activiti 

默认登录的用户名 admin  , 密码 test

管理的 地址  http://localhost:8080/activiti-admin  , 密码和用户名都是  admin

activiti6 源码介绍

模块

 

activiti-app

流程引擎配置

ProcessEngineConfiguration

 

静态方法创建配置对象

数据库配置

<bean id="processEngineConfiguration"
        class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
    <!--<property nam  e="databaseSchemaUpdate" value="create-drop"/>-->
    <property name="databaseSchemaUpdate" value="true"/>
    <property name="dataSource" ref="dataSource"/>
    <!--<property name="dataSource" ref="dataSource"/>-->

    <!--引擎是否使用历史数据-->
    <property name="dbHistoryUsed" value="true"></property>
    <!--引擎是否需要身份数据,即引擎自己有一套身份认证的处理,比如 activiti app 或者admin 的 管理war -->
    <property name="dbIdentityUsed" value="true"></property>

    <!--表的前置,如果改动了 引擎的表前置可以 设置-->
    <!--<property name="databaseTablePrefix" value="t_"/>-->
    <!--数据库类型,默认不用配置,会通过url 判断是那种数据库类型-->
    <property name="databaseType" value="mysql"/>
  </bean>

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="url" value="jdbc:mysql://localhost:3306/activiti6unit?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false"/>
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
    <property name="initialSize" value="1"/>
    <property name="maxActive" value="10"/>
    <property name="filters" value="stat,slf4j"/>
  </bean>

日志记录配置logging

桥接方式:比如使用了 日志门面 slfj ,日志实现时 Log4j 那么桥接方式就是: slf4j-log4j  ,需要加上对应的依赖包

改变依赖是因为有时候有 日志的实现的 冲突,各种日志使用问题。可以统一日志使用类型,排除不要使用的日志实现依赖

日志记录与mdc

mdc 即 将 程序执行的上下文配置信息或者日志记录信息放入 线程的threadLocal 里面,这样可以方便打印出来,排除问题

配置流程历史记录级别

事件监听

命令拦截器配置

即 调用者 Invoker 调用的时候,最终是又 Recerver 接受者去执行 action 方法来执行命令

作业执行器Job Executor

配置

即当 阻塞队列满了,而就会开始 增加 maxPoolSize 最大线程数,当最多线程数达到设置值,就会执行拒绝策略

R5/P1DT1H 即 每隔1天又1个小时,即每 25小时,之后执行一次,共执行5次结束

R5/PT10S 执行5次,每隔10S后执行1次,一共执行5次

spring activiti 管理

核心API

RepositoryService

RuntimeService 流程运行控制服务

如果 流程只有一条流的话,那么流程实例就对应一个执行流,id 一致

流程触发信号

任务管理服务

设置权限信息

设置task附加信息

身份管理服务IdentityService

表单管理服务FormService

HistoryService 历史管理服务

其他管理服务

流程定义建议通过 修改 流程配置文件xml 去修改,而不是使用 API代码来动态定义修改

流程图属于 业务范畴

异常策略

数据库表设计

数据库建表语句 

在 activiti-engine.jar 里面 的 org.activiti.db  包里面就有:

 

通用数据库

流程定义存储表设计

身份数据表设计

<!--开启生成用户身份的一些表-->
<property name="dbIdentityUsed" value="true"/>

运行时流程数据表设计

流程实例执行表

用户任务表

用户任务表

变量信息表

参与者

事件订阅信息表

历史流程数据表

 

表结构说明

参考  https://blog.csdn.net/hj7jay/article/details/51302829

BPMN2.0 规范

流对象

可以查看  http://bpmb.de/poster

事件

开始- 中间-边界-结束

定时事件

边界事件通过 timeout task 去完成。

意思是 正常来说,是不会发生边界事件的,即 执行完commonTask 任务,然后到结束时间

但是如果一个任务执行了 超过的规定时间,比如5S就是 timeDuration 里面规定的时间,

那么就会触发边界事件执行下去,直到结束时间

错误事件

抛出错误的标识是 myError

即不符合条件,抛出错误事件,然后被捕获到触发边界事件执行

  <!--并行网关: 即对接相连的 流程都会 去执行完。且 各个方向的流程执行互相不干扰 -->
            <parallelGateway id="fork"/>

信号事件

信号中间事件

信号是可以直接发出一信号的,一般不会指定一个流程执行id  这样一个参数的  。

而消息是可以定义一个内容的,往往会指定一个流程执行id  这样一个参数的  。

这就是他们的区别

流程任务

也可以这样:

dueDate 即设置 改任务在 那个时间完成 这个任务

即可以在任务创建比如 create 的时候 设置一些任务的属性等等

脚本任务

服务任务

原理是通过反射去执行的

以上是 基于spring 创建的一个bean 对象, 传进去的, 这个是单例的,要线程安全就可以改为 多例方式

以上的方式 就会在每次流程引擎启动的时候都会使用反射的方式创建 一个 MyJavaDelegate 类

顺序流和网关

并行网关即都可以 同时执行多个流程分支

包容性网关即 包含单一网关,也包括并行网关

基于事件网关:即 流程会暂停下来,然后 有会对应的事件分支流程去处理

即比如 如果同时满足了 确认支付和确认收货的,条件,那么就会同时执行,和并行网关一样,否则就执行符合条件的,和单一网关一样

事件网关 会根据事件来决定流程的走向,会根据他连接的中间捕获事件来决定流程的走向

子流程

目前事务子流程其实还在不成熟,不建议使用

事件子流程

是通过流程的补偿机制来保证事务性的,事务子流程的事务性并没有那么强

调用式子流程

集成springboot 

条件注解说明

activiti-spring-boot-starter-basic 6.0.0 默认支持的是 spring 1.2.6

spring boot 工作流平台搭建

需求分析

技术方案

基于activiti-ui 开发会比较快

activiti6 默认对应的spring boot 版本是 1.2.6 , 

如果是 spring boot2 建议使用 activity7 。毕竟activiti6改造为支持 spring boot2看起来挺麻烦。

系统扩容

即将 不同流程的数据 放到不同数据库里面,减低数据库的压力

流程部署坑

因为序列化,反序列化效率并不高,而且当 对象的包改变,结构改变容易出现序列化失败。 可以改为 通过序列化json 格式字符串数据的方式来。

 

 

 

 

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!