1.activeti简介

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

2.activeti七大马车

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

3.activeti应用场景

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

4.实际应用入门

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

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

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

activiti工作流引擎入门教程 - 图2

可以简单的认为就是一个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工作流引擎入门教程 - 图3

上图已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());

5.搭建的注意点

1.activiti流程怎么和自己的业务表,如请假详细信息表,审批信息表关联起来?
2.activiti如何知道那些任务该由谁处理?
3.驳回,撤销(目前未搞撤销功能,文章还会持续更新)怎么实现?

6.解决方式

(1)问题1:

网上说的可以把流程与业务通过activiti的businesss_key关联起来。后来我发现好像这个值一次流程只能设置一次(也有可能是我操作不对),最终我选择了在业务表存储流程实例的id来进行关联。

(2)问题2:

指定任务候选人方式解决。指定候选人的时候,我一开始采用监听的方式,因为我这边设计的是某个角色下的人都会有某个流程节点的审批权限,通过监听的方式,我一开始又直接选择监听类,具体操作如下:
activiti工作流引擎入门教程 - 图4
发现这种方式不能获取到spring管理的bean。后面尝试使用expression。这种方式可以获取到bean。由于我要操作数据库查询数据,所以注入了JpaRepository。然后神奇的爆了序列化问题。最后我选择了传参的方式指定候选人。
activiti工作流引擎入门教程 - 图5

(3)问题3:

驳回:使用排他网关实现,只需要指定通过条件
activiti工作流引擎入门教程 - 图6