使用 Activiti 实现的工作流程管理
一、activiti介绍
Activiti5
是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图。
- 官网: http://www.activiti.org/
- 下载: http://www.activiti.org/download.html
目前,Activiti5中的5.22版本
是用的最多的一个版本,本次教程也是使用这个版本进行讲解,最新版本到了7.0版本
。
在开始教程之前,我们需要先明确下面的一些概念和知识,可以帮助我们更好的理解工作流的开发。
二、工作流引擎
ProcessEngine
对象,这是Activiti工作的核心
。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。
用百度更为通俗的话来说就是:就是一辆汽车的发动机,就好比一辆汽车,外表做得再漂亮,如果发动机有问题就只是一个摆设。应用系统的弹性就好比引擎转速方面的性能,加速到100 公里需要1 个小时(业务流程发生变动需要进行半年的程序修改)还能叫好车吗?引擎动不动就熄火(程序因为逻辑的问题陷入死循环)的车还敢开吗?
三、BPMN
在Activiti工作流中用到了一个BPMN的文件,主要是用来描述业务流程的基本的符号,利用各个组件能够组成一个业务流程图,整个业务也是根据这个图来走的,其实用xml格式打开,就是一个xml文件
。
下面就是bpmn组件的示意图
图片.png
四、数据库
在我们进行业务流程开发的时候,是会产生很多的数据的,那么这些数据都是放在哪里呢?
是的,其实就是存放在数据库的。
在Activiti工作流的后台是有数据库的支持的,所有的表都以ACT_开头
,利用这些数据库的表,就能够把整个业务流程的数据保存下来,然后利用这些数据进行不同的业务的开发。
数据库表示意图
图片.png
下面对这些表做一些基本的解释,这些可以先不看,等看完后面的教程后再回过头来看,你会发现其实很简单的
。
- 资源库流程规则表
1)act_re_deployment 部署信息表 2)act_re_model 流程设计模型部署表 3)act_re_procdef 流程定义数据表
- 运行时数据库表
1)act_ru_execution 运行时流程执行实例表 2)act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息 3)act_ru_task 运行时任务节点表 4)act_ru_variable 运行时流程变量数据表
- 历史数据库表
1)act_hi_actinst 历史节点表 2)act_hi_attachment 历史附件表 3)act_hi_comment 历史意见表 4)act_hi_identitylink 历史流程人员表 5)act_hi_detail 历史详情表,提供历史变量的查询 6)act_hi_procinst 历史流程实例表 7)act_hi_taskinst 历史任务实例表 8)act_hi_varinst 历史变量表
- 组织机构表
1)act_id_group 用户组信息表 2)act_id_info 用户扩展信息表 3)act_id_membership 用户与用户组对应信息表 4)act_id_user 用户信息表
这些表用的很少,因为我们一般会自己做一个权限管理,所以不会用activiti自身所带的表。
- 通用数据表
1)act_ge_bytearray 二进制数据表 2)act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录。
这两张表的数据是不能够随意删除的,删除可能会出问题。
五、总结
工作流的概念就先介绍这么多了,更多的去官网查看,下一节将用一个入门的实例
来对工作流进行讲解。
一、前言
在上一节中我们对activiti进行了基本的介绍activiti进行了基本的介绍,同时介绍了基本的概念。
这一节,我将用一个入门程序,介绍如何使用activiti。
二、环境准备
2.1、编译器选择
这里我们使用Idea
进行工作流开发,虽然Idea对于工作流的友好度不是很好,因为会有一些小的bug,但是,Idea对于Java的开发还是非常的好的。
在用Idea开发之前,我们需要在idea中安装bpmn开发的插件。方法如下
打开设置
图片.png
选择plugins
图片.png
搜索actiBPM
图片.png
重启idea,新建文件
如果能够找到下面的创建方法,就代表成功了。
图片.png
新建后出现下面的编辑页面
图片.png
到现在,bpmn编辑插件就准备好了。
2.2、其他环境准备
- JDK:1.8
- 数据库:mysql5.7
- activiti jar包:使用maven依赖
三、入门程序
3.1、新建maven项目
新建的maven项目目录如下
图片.png
3.2、添加pom依赖
这里需要的pom依赖有以下几个:junit、druid、mysql、lombok(日志)、activiti
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sihai</groupId>
<artifactId>acitvitiDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.12</version>
</dependency>
<!-- logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.1.8</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.8</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.22</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.22.0</version>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
3.3、日志配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<!--<appender name="permission" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!--<file>${catalina.home}/logs/permission.log</file>-->
<!--<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!--<FileNamePattern>${catalina.home}/logs/permission.%d{yyyy-MM-dd}.log.gz</FileNamePattern>-->
<!--</rollingPolicy>-->
<!--<layout class="ch.qos.logback.classic.PatternLayout">-->
<!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>-->
<!--</layout>-->
<!--</appender>-->
<!---->
<!--<logger name="xxx" level="INFO">-->
<!--<appender-ref ref="permission"/>-->
<!--</logger>-->
<!-- TRACE < DEBUG < INFO < WARN < ERROR -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
3.4、测试实例
下面是添加一个junit测试实例,通过测试生成activiti底层需要的数据库表,总共有25张,如果数据库生成了25张表结构,则说明成功!
/**
* @Author ouyangsihai
* @Description 生成activiti底层数据库表结构
* @Date 16:24 2019/1/26
* @Param
* @return
**/
public class Activiti_01 {
/**
* @return void
* @Author ouyangsihai
* @Description //生成数据库表结构
* @Date 20:57 2018/12/5
* @Param []
**/
@Test
public void test_createDatabase() {
// 创建流程引擎配置信息对象
ProcessEngineConfiguration pec = ProcessEngineConfiguration
.createStandaloneProcessEngineConfiguration();
// 设置数据库的类型
pec.setDatabaseType("mysql");
// 设置创建数据库的方式
// ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE(true);//如果没有数据库表就会创建数据库表,有的话就修改表结构.
// ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE(false): 不会创建数据库表
// ProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP(create-drop): 先创建、再删除.
pec.setDatabaseSchemaUpdate("true");
// 设置数据库驱动
pec.setJdbcDriver("com.mysql.jdbc.Driver");
// 设置jdbcURL
pec.setJdbcUrl("jdbc:mysql://localhost:3306/activitiTest?useUnicode=true&characterEncoding=UTF-8");
// 设置用户名
pec.setJdbcUsername("root");
// 设置密码
pec.setJdbcPassword("root");
pec.setJdbcPassword("XXXX");
// 构建流程引擎对象
ProcessEngine pe = pec.buildProcessEngine(); // 调用访方法才会创建数据表
// 调用close方法时,才会删除
pe.close();
}
}
3.5、运行测试实例
运行上面的测试实例后,将会生成下面的25张表结构。
日志信息
图片.png
表结构
图片.png
四、总结
通过上面是入门实例,就将activiti的环境准备好了!
一、前言
在上一节中,通过一个入门程序,把activiti的环境准备好了,这一节,将整合spring,并且部署一个最简单的bpmn流程图。
二、环境准备
这一节的内容在上一节入门程序的基础上进行环境配置,如果需要完整的配置文件,请到上一节查看。
2.1 spring配置
首先,需要添加spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="locations">
<list>
<value>classpath:settings.properties</value>
</list>
</property>
</bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="driverClassName" value="${db.driverClassName}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
<property name="initialSize" value="3"/>
<property name="minIdle" value="3"/>
<property name="maxActive" value="20"/>
<property name="maxWait" value="60000"/>
<property name="filters" value="stat,wall"/>
</bean>
<!-- tx -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- druid -->
<bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
<property name="slowSqlMillis" value="3000"/>
<property name="logSlowSql" value="true"/>
<property name="mergeSql" value="true"/>
</bean>
<bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter">
<property name="dbType" value="mysql"/>
</bean>
</beans>
2.2 数据库等环境配置文件
然后,添加数据库等环境配置文件
db.driverClassName=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/activitiTest?useUnicode=true&characterEncoding=UTF-8
db.username=root
db.password=root
到目前为止,就把spring的配置环境搭建好了,接下来,我们需要加入activiti的整合环境的配置了。
2.3 spring整合activiti
这一步,我们加入spring整合activiti环境的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置流程引擎配置信息对象 -->
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"
p:dataSource-ref="dataSource"
p:transactionManager-ref="transactionManager"
p:databaseSchemaUpdate="true"
p:jobExecutorActivate="false"
p:databaseType="mysql"
p:activityFontName="宋体"
p:labelFontName="黑体"
p:xmlEncoding="utf-8"/>
<!-- 配置流程引擎 -->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"
p:processEngineConfiguration-ref="processEngineConfiguration"/>
<!-- 配置六个服务Bean -->
<bean id="repositoryService" factory-bean="processEngine"
factory-method="getRepositoryService"/>
<bean id="runtimeService" factory-bean="processEngine"
factory-method="getRuntimeService"/>
<bean id="taskService" factory-bean="processEngine"
factory-method="getTaskService"/>
<bean id="historyService" factory-bean="processEngine"
factory-method="getHistoryService"/>
<bean id="formService" factory-bean="processEngine"
factory-method="getFormService"/>
<bean id="identityService" factory-bean="processEngine"
factory-method="getIdentityService"/>
</beans>
到2.3这一步,spring整合activiti的环境就配置好了,接下来,我们创建一个简单的bpmn文件,然后,做一个简单的测试,部署bpmn文件。
三、部署实例
3.1 绘制
打开idea的bpmn编辑器,绘制一个简单的bpmn文件,如下
图片.png
注意: 用idea编辑的时候,是不会和eclipse一样会自动的生成png文件
的,这里有两种方式解决。
方式一
用eclipse打开编辑,会自动生成,这个简单,这里就不多说了。
方式二
将bpmn
后缀改为xml
图片.png
右键xml文件,找到下面的按键
图片.png
出现下面的界面
图片.png
右键,选择export to file
图片.png
生成如下
图片.png
最后将xml
后缀改为bpmn
3.2 测试
通过上面的介绍,绘制了bpmn文件
和png图片
,下面写一个测试实例,部署流程。
/**
* @Author 欧阳思海
* @Description 部署
* @Date 16:24 2019/1/26
* @Param
* @return
**/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"classpath:applicationContext-core.xml",
"classpath:applicationContext-activiti.xml"
})
@Slf4j
public class test02_spring {
@Autowired
private ProcessEngine processEngine;
@Autowired
private TaskService taskService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private HistoryService historyService;
/**
* @return void
* @Author 欧阳思海
* @Description 部署流程实例
* @Date 16:17 2018/12/19
* @Param []
**/
@Test
public void testTask() throws Exception {
// 1 发布流程
InputStream inputStreamBpmn = this.getClass().getResourceAsStream("/bpmn/test_01.xml");
InputStream inputStreamPng = this.getClass().getResourceAsStream("/bpmn/test_01.png");
processEngine.getRepositoryService()
.createDeployment()
.addInputStream("test_01.xml", inputStreamBpmn)
.addInputStream("test_01.png", inputStreamPng)
.deploy();
ProcessInstance pi = processEngine.getRuntimeService()//
.startProcessInstanceByKey("test_01");
System.out.println("pid:" + pi.getId());
}
}
注意上面的test_01
是你的bpmn文件的id
。
3.3 测试结果
图片.png
上一篇: MLFlow入门指南:探索机器学习工作流程框架(第一篇)
下一篇: 比较几种常用的工作流引擎框架图解
推荐阅读
-
Gitflow:基于 Git 的分支管理工作流程模型
-
深入了解 Java 中的 ThreadLocal 机制,了解其工作原理、优缺点分析、数据库连接管理的应用、使用注意事项
-
Java 8新特性探究(十三)JavaFX 8新特性以及开发2048游戏-JavaFX历史## 跟java在服务器端和web端成绩相比,桌面一直是java的软肋,于是Sun公司在2008年推出JavaFX,弥补桌面软件的缺陷,请看下图JavaFX一路走过来的改进 从上图看出,一开始推出时候,开发者需使用一种名为JavaFX Script的静态的、声明式的编程语言来开发JavaFX应用程序。因为JavaFX Script将会被编译为Java bytecode,程序员可以使用Java代码代替。 JavaFX 2.0之后的版本摒弃了JavaFX Script语言,而作为一个Java API来使用。因此使用JavaFX平台实现的应用程序将直接通过标准Java代码来实现。 JavaFX 2.0 包含非常丰富的 UI 控件、图形和多媒体特性用于简化可视化应用的开发,WebView可直接在应用中嵌入网页;另外 2.0 版本允许使用 FXML 进行 UI 定义,这是一个脚本化基于 XML 的标识语言。 从JDK 7u6开始,JavaFx就与JDK捆绑在一起了,JavaFX团队称,下一个版本将是8.0,目前所有的工作都已经围绕8.0库进行。这是因为JavaFX将捆绑在Java 8中,因此该团队决定跳过几个版本号,迎头赶上Java 8。 ##JavaFx8的新特性 ## ###全新现代主题:Modena 新的Modena主题来替换原来的Caspian主题。不过在Application的start方法中,可以通过setUserAgentStylesheet(STYLESHEET_CASPIAN)来继续使用Caspian主题。 参考http://fxexperience.com/2013/03/modena-theme-update/ ###JavaFX 3D 在JavaFX8中提供了3D图像处理API,包括Shape3D (Box, Cylinder, MeshView, Sphere子类),SubScene, Material, PickResult, LightBase (AmbientLight 和PointLight子类),SceneAntialiasing等。Camera类也得到了更新。从JavaDoc中可以找到更多信息。 ###富文本 强化了富文本的支持 ###TreeTableView ###日期控件DatePicker 增加日期控件 ###用于 CSS 结构的公共 API
-
详述如何使用Activiti7通过编码实时生成工作流程
-
使用Vue和SpringBoot搭建超市商品管理系统的第四步:系统实际操作与实现
-
如何使用 Git 进行工作流程管理
-
Oracle使用expdp/impdp实现全库导入导出的整体流程
-
使用 SpringBoot 和 JWT 实现简单易用的用户注册、登录及身份验证流程
-
如何使用Spring Security实现JWT的身份验证与权限管理
-
使用SpringSecurity实现Jwt的身份验证与权限管理