activiti工作流引擎入门教程

activiti简介

Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准。
Activiti是一种轻量级,可嵌入的BPM引擎,而且还设计适用于可扩展的云架构。 Activiti将提供宽松的Apache许可2.0,同时促进Activiti BPM引擎和BPMN 2.0的匹配。

activiti的7大马车

1.RepositoryService:提供一系列管理流程部署和流程定义的API。
2.RuntimeService:在流程运行时对流程实例进行管理与控制。
3.TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务等。
4.IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系。
5.ManagementService:提供对流程引擎进行管理和维护的服务。
6.HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
7.FormService:表单服务。

activiti应用场景

多人协作的(或者需要动态变动)的业务流程场景。

正文

本文将通过搭建一个简单的请假流程系统来进行讲解。

如你所知,activiti工作流引擎多运用于流程性很强的业务系统。所以运用的第一步是创建.bpmn文件(我称之为activiti认识的流程图)


activiti流程图

.bpmn文件我们可以通过编辑软件打开


,bpmn文件

可以简单的认为就是一个xml文件,activiti去解析这个文件,了解我们到底想干什么事。
画完流程图之后,就是我上面提到的activiti七架马车。它们就是activiti对外提供的接口。通过它们就可以很方便的操作到activiti生产的数据,以及操作它在适当的节点做想让它做的事。

我这边是通过springboot搭建。所以需要把那七大马车注入(也不一定要全部注入),交给spring管理。这样就可以随便用了。
以下是注入马车代码

package com.ysh.activiti.config;

import javax.sql.DataSource;

import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ActivitiConfog {
  @Autowired
  private DataSource dataSource;

  @Bean
  public StandaloneProcessEngineConfiguration processEngineConfiguration() {
      StandaloneProcessEngineConfiguration configuration = new StandaloneProcessEngineConfiguration();
      configuration.setDataSource(dataSource);
      >configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
      configuration.setAsyncExecutorActivate(false);
      return configuration;
  }

  @Bean
  public ProcessEngine processEngine() {
      return processEngineConfiguration().buildProcessEngine();
  }

  @Bean
  public RepositoryService repositoryService() {
      return processEngine().getRepositoryService();
  }

  @Bean
  public RuntimeService runtimeService() {
      return processEngine().getRuntimeService();
  }

  @Bean
  public TaskService taskService() {
      return processEngine().getTaskService();
  }
  @Bean
  public HistoryService historyService() {
      return processEngine().getHistoryService();
  }
}

当然我这边并没有注入所有的马车,用到的是时候再加都是可以的。这儿也随带对activiti做了基本的配置。
配置了数据源,自动建表,是否激活AsyncExecutor。刚刚介绍了其他马车,忘了activiti 最重要的ProcessEngine(流程引擎对象),马车都是由它管理。
配置好这些,运行代码就会产生activiti的内置表。


activiti内置表

上图已act开头的都是,总共28张。每张表含义以及表里的字段含义,我这里就不在累赘,大家网上都能找到资料。我就这点一哈我认为比较重要的表
1.act_ru_execution 执行对象表
2.act_ru_task 用户任务表
3.act_hi_actinst 活动节点历史表
4.act_hi_procinst 流程实例历史表
5.act_hi_taskinst 历史任务表
下面就说怎么去启动一个流程

Deployment deploy = >repositoryService.createDeployment().addClasspathResource("processes/leave.bpmn").deploy();
// 获取流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
              .deploymentId(deploy.getId()).singleResult();
// 启动流程定义,返回流程实例
ProcessInstance pi = runtimeService.startProcessInstanceById(processDefinition.getId());

到此,入门就算结束了。

搭建的注意点

我搭建时考虑的问题:
1.activiti流程怎么和自己的业务表,如请假详细信息表,审批信息表关联起来?
2.activiti如何知道那些任务该由谁处理?
3.驳回,撤销(目前未搞撤销功能,文章还会持续更新)怎么实现?
解决方式 :
1.问题一,网上说的可以把流程与业务通过activiti的businesss_key关联起来。后来我发现好像这个值一次流程只能设置一次(也有可能是我操作不对),最终我选择了在业务表存储流程实例的id来进行关联。
问题二:指定任务候选人方式解决。指定候选人的时候,我一开始采用监听的方式,因为我这边设计的是某个角色下的人都会有某个流程节点的审批权限,通过监听的方式,我一开始又直接选择监听类,具体操作如下:


直接选择监听类

发现这种方式不能获取到spring管理的bean。
后面尝试使用expression。这种方式可以获取到bean。由于我要操作数据库查询数据,所以注入了JpaRepository。然后神奇的爆了序列化问题。
最后我选择了传参的方式指定候选人。


变量指定候选人

3.驳回:使用排他网关实现,只需要指定通过条件
流程线指定条件

由于代码量还是有点多,后面我code review之后(现在写的还是有点糙)会放到github上。有兴趣的朋友可以持续关注。

系统展示

系统用户角色表设计


系统角色划分

用户的信息

用户与角色关系

当然大家从名字也能大致猜出对应角色。


系统登录页

普通员工登录界面

发布申请

填写之后

查看流程

通过上文流程图,可以知道请假不大于五天都是部门经理审批。
上文的黑色,表示已经提交到经理审核,但是经理还未处理。


申请6天

大于五天,总监审批

部门经理yshManager审批

部门经理YshManager2审批

同一个任务,身为部门经理的人都能进行审批。说明传参的方式制定审核人事没有问题的。
部门经理yshManager2审批之后的流程

我这边审核任务设置的是一个人审批过后,就算审批通过,不需要所有人审批通过。当时一个部门经理审批过后,其他部门经理就不能审核这个任务,同时我这边也设计的是无法再进行查看这个请假任务具体情况。
人事审核同理。
人事顺利审批

一次性走完流程的流程进度

审批拒绝

我就不挨着截图了,直接展示一个多次遭拒绝的情况截图。
image.png

这儿就是多次审批遭拒,然后重新申请的情况。这儿就会有一个问题,我开始申请请假是6天。被总监拒绝。我改为5天,被人力资源拒绝。后面改3天,审批通过。由于我申请审批一直是操作的同一条申请请假数据。导致前面的数据记录丢失。(bug后续更新解决)

结语

我对activiti也是刚接触的小白。如有不正确之处,请不吝赐教。后面还会持续更新。有兴趣的朋友可以持续关注。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,360评论 5 461
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,195评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,543评论 0 323
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,420评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,242评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,224评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,626评论 3 384
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,301评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,589评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,660评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,423评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,286评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,662评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,951评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,237评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,613评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,804评论 2 335