前言

JBPM是目前市场上主流开源工作引擎之一,在创建者Tom Baeyens离开JBoss后,JBPM的下一个版本jBPM5完全放弃了jBPM4的基础代码,基于Drools Flow重头来过,目前官网已经推出了JBPM7的beta版本;Tom Baeyens加入Alfresco后很快推出了新的基于jBPM4的开源工作流系统Activiti。由此可以推测JBoss内部对jBPM未来版本的架构实现产生了严重的意见分歧。

搭建

花了半天的时间对比了下JBPM 和 Activit,以及两个工作流的不同版本,最终选择了 Activiti6 来实现,理由如下:

  • JBPM 网上集成的资料甚少,且新版本相对比较笨重。
  • Activiti 相对丰富的资料,并且高度与 SpringBoot 集成,之所以选择 Activiti6 版本,是由于目前只有版本6的集成 starter。

创建 pom.xml:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.itstyle.bpm</groupId>
  5. <artifactId>spring-boot-activiti</artifactId>
  6. <packaging>jar</packaging>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>spring-boot-activiti</name>
  9. <url>http://maven.apache.org</url>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. </properties>
  13. <!-- 截止2019年2月1日 spring-boot 2.0 没有相关 activiti 的 starter-basic-->
  14. <parent>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-parent</artifactId>
  17. <version>1.5.10.RELEASE</version>
  18. <relativePath/>
  19. </parent>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-web</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.activiti</groupId>
  27. <artifactId>activiti-spring-boot-starter-basic</artifactId>
  28. <version>6.0.0</version>
  29. </dependency>
  30. </dependencies>
  31. <build>
  32. <finalName>spring-boot-activiti</finalName>
  33. </build>
  34. </project>

配置 application.properties:

  1. server.context-path=/
  2. server.port=8080
  3. server.session-timeout=60
  4. server.tomcat.max-threads=100
  5. server.tomcat.uri-encoding=UTF-8
  6. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  7. spring.datasource.url=jdbc:mysql://localhost:3306/spring-boot-activiti?characterEncoding=utf-8&useSSL=false
  8. spring.datasource.username=root
  9. spring.datasource.password=123456
  10. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  11. # Specify the DBMS
  12. spring.jpa.database = MYSQL
  13. # Show or not log for each sql query
  14. spring.jpa.show-sql = true
  15. # DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto" property. Default to "create-drop" when using an embedded database, "none" otherwise.
  16. spring.jpa.hibernate.ddl-auto = update
  17. # Hibernate 4 naming strategy fully qualified name. Not supported with Hibernate 5.
  18. spring.jpa.hibernate.naming.strategy = org.hibernate.cfg.ImprovedNamingStrategy
  19. # stripped before adding them to the entity manager)
  20. spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
  21. #每次应用启动不检查Activiti数据表是否存在及版本号是否匹配,提升应用启动速度
  22. spring.activiti.database-schema-update=false
  23. #保存历史数据级别设置为full最高级别,便于历史数据的追溯
  24. spring.activiti.history-level=full

声名为配置类 ActivitiConfig:

  1. @Configuration//声名为配置类,继承Activiti抽象配置类
  2. public class ActivitiConfig extends AbstractProcessEngineAutoConfiguration {
  3. @Bean
  4. @Primary
  5. @ConfigurationProperties(prefix = "spring.datasource")
  6. public DataSource activitiDataSource() {
  7. return DataSourceBuilder.create().build();
  8. }
  9. @Bean
  10. public SpringProcessEngineConfiguration springProcessEngineConfiguration(
  11. PlatformTransactionManager transactionManager,
  12. SpringAsyncExecutor springAsyncExecutor) throws IOException {
  13. return baseSpringProcessEngineConfiguration(
  14. activitiDataSource(),
  15. transactionManager,
  16. springAsyncExecutor);
  17. }
  18. }

启动项目,会自动生成28张表:

  • act_ge_ 通用数据表,ge是general的缩写

  • act_hi_ 历史数据表,hi是history的缩写,对应HistoryService接口

  • act_id_ 身份数据表,id是identity的缩写,对应IdentityService接口

  • act_re_ 流程存储表,re是repository的缩写,对应RepositoryService接口,存储流程部署和流程定义等静态数据

  • act_ru_ 运行时数据表,ru是runtime的缩写,对应RuntimeService接口和TaskService接口,存储流程实例和用户任务等动态数据

演示

一个简单的请假流程演示:

说明

其实开源社区有不少工作流的案例,但都不是自己想要的类型。由于工作需要,会逐步分享开发中所遇到的疑难问题和小细节,后面会开源一个简单的工作流完整实例,敬请关注。

SpringBoot开发案例之整合Activiti工作流引擎的更多相关文章

  1. SpringBoot开发案例之整合Dubbo分布式服务

    前言 在 SpringBoot 很火热的时候,阿里巴巴的分布式框架 Dubbo 不知是处于什么考虑,在停更N年之后终于进行维护了.在之前的微服务中,使用的是当当维护的版本 Dubbox,整合方式也是使 ...

  2. SpringBoot开发案例之整合Kafka实现消息队列

    前言 最近在做一款秒杀的案例,涉及到了同步锁.数据库锁.分布式锁.进程内队列以及分布式消息队列,这里对SpringBoot集成Kafka实现消息队列做一个简单的记录. Kafka简介 Kafka是由A ...

  3. 转载-SpringBoot开发案例之整合日志管理

    转载:https://cloud.tencent.com/developer/article/1097579 有一种力量无人能抵挡,它永不言败生来倔强.有一种理想照亮了迷茫,在那写满荣耀的地方. 00 ...

  4. SpringBoot 开发案例之整合FastDFS分布式文件系统

    1.pom依赖 <!--fastdfs--> <dependency> <groupId>com.github.tobato</groupId> < ...

  5. SpringBoot开发案例从0到1构建分布式秒杀系统

    前言 ​最近,被推送了不少秒杀架构的文章,忙里偷闲自己也总结了一下互联网平台秒杀架构设计,当然也借鉴了不少同学的思路.俗话说,脱离案例讲架构都是耍流氓,最终使用SpringBoot模拟实现了部分秒杀场 ...

  6. Activiti工作流引擎开发系列

    Activiti工作流引擎开发系列-01 作者:Jesai 没有伞的孩子,只能光脚奔跑! 前言: 初次接触工作流这个概念是自从2014年11月份开始,当时是由于我的毕业设计需要,还记得当时我毕业设计的 ...

  7. Spring整合Activiti工作流

    代码地址如下:http://www.demodashi.com/demo/11911.html 一. 前期准备 安装必要的开发环境 eclipse/intellij+maven 3.5.x + tom ...

  8. Activiti工作流引擎参考资料

    Activiti工作流引擎使用 工作流-Activiti核心API介绍 传智播客Activiti工作流视频教程(企业开发实例讲解) 工作流引擎Activiti演示项目 http://www.kafei ...

  9. Activiti工作流引擎简介

    Activiti工作流引擎简介 一.概述 Activiti是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活 ...

随机推荐

  1. NiftyNet 数据预处理

    NiftyNet项目介绍 使用NiftyNet时,我们需要先将图像数据和标签进行一次简单的处理,得到对应的.csv文件. 对应文件格式为: img.csv image path img_name im ...

  2. React事件杂记及源码分析

    前提 最近通过阅读React官方文档的事件模块,发现了其主要提到了以下三个点  调用方法时需要手动绑定this  React事件是一种合成事件SyntheticEvent,什么是合成事件?  事件属性 ...

  3. 关于 vue 不能 watch 数组变化 和 对象变化的解决方案

    原文地址:关于 vue 不能 watch 数组变化 和 对象变化的解决方案 vue 监听数组和对象的变化 vue 监听数组 vue 实际上可以监听数组变化,比如: data () { return { ...

  4. python之编码与解码

    编码 字符串被当作url提交时会被自动进行url编码处理,在python里也有个urllib.urlencode的方法,可以很方便的把字典形式的参数进行url编码.当url地址含有中文或者“/”的时候 ...

  5. [PHP] curl访问https与CA证书问题

    CA证书,用来在调用HTTPS资源的时候,验证对方网站是否是CA颁布的证书,而不是自己随便生成的 curl命令1.需要下载CA证书 文件地址是 http://curl.haxx.se/ca/cacer ...

  6. Java开发笔记(五十六)利用枚举类型实现高级常量

    前面介绍了联合利用final和static可实现常量的定义,该方式用于简单的常量倒还凑合,要是用于复杂的.安全性高的常量,那就力不从心了.例如以下几种情况,final结合static的方式便缺乏应对之 ...

  7. Java continue的特殊用法 继续当前循环

    前言 今天java练习的时候,遇到了一道有趣的题目,加深了我对cotinue的理解,所以我写个笔记,记录一下continue的特殊用法 continue作用说明 这里我使用个例子来简单说明一下: fo ...

  8. O(n*logn)级别的算法之二(快速排序)的三种实现方法详解及其与归并排序的对比

    一,单路快排1.测试用例: #ifndef INC_06_QUICK_SORT_DEAL_WITH_NEARLY_ORDERED_ARRAY_SORTTESTHELPER_H #define INC_ ...

  9. Access denied for user 'root'@'localhost' (using password:YES) Mysql5.7

    解决方案: (1) 打开MySQL目录下的my.ini文件,在文件的最后添加一行“skip-grant-tables”,保存并关闭文件.(my.ini在C:\ProgramData\MySQL\MyS ...

  10. Broadcast发送广播

    一.知识介绍 1.[广播分类] ①有序广播:接收者A收到广播传递给B,B传给C,有序传递.任何一个环节都可以终止广播,也可以修改广播中携带的数据. 发送的方式:sendOrderedBroadcast ...