一、初始化
1、依赖
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.0.0.Beta2</version>
</dependency>
2配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/activiti?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true
username: root
password: shen
driver-class-name: com.mysql.jdbc.Driver
activiti:
#1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常
#2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建
#3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)
#4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)
database-schema-update: true
#检测历史表是否存在 activiti7默认没有开启数据库历史记录 启动数据库历史记录
db-history-used: true
#记录历史等级 可配置的历史级别有none, activity, audit, full
#none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
#activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
#audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。
#full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。
history-level: full
#校验流程文件,默认校验resources下的processes文件夹里的流程文件
check-process-definitions: false
问题
URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)
3、生成acitivti需要的数据库表。
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.junit.Test;
public class TestDemo {
/**
* 生成 activiti的数据库表
*/
@Test
public void testCreateDbTable() {
//使用classpath下的activiti.cfg.xml中的配置创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
}
}
二、activiti 相关概念
1、表结构解读
1.1 前缀
ACT_RE :'RE'表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU:'RU'表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异 步任务,等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流 程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_HI:'HI'表示 history。 这些表包含历史数据,比如历史流程实例、变量,任务等等。 ACT_GE : GE 表示 general。 通用数据, 用于不同场景下
1.2 完整的数据库表作用:
表名 | 解释 | ||
一般数据 | [ACT_GE_BYTEARRAY] | 通用的流程定义和流程资源(流程存到表中) | |
[ACT_GE_PROPERTY] | 系统相关属性 | ||
流程历史记录 | [ACT_HI_ACTINST] | 历史的流程实例(读流程开始到正在运行节点的所有节点,包括开始节点,结束节点等) | |
[ACT_HI_ATTACHMENT] | 历史的流程附件 | ||
[ACT_HI_COMMENT] | 历史的说明性信息 | ||
[ACT_HI_DETAIL] | 历史的流程运行中的细节信息 | ||
[ACT_HI_IDENTITYLINK] | 历史的流程运行过程中用户关系(开始到正在审批节点的审批人) | ||
[ACT_HI_PROCINST] | 历史的流程实例 | ||
[ACT_HI_TASKINST] | 历史的任务实例(从开始到正在进行节点的用户) | ||
[ACT_HI_VARINST] | 历史的流程运行中的变量信息 | ||
流程定义表 | [ACT_RE_DEPLOYMENT] | 部署单元信息(创建流程记录) | |
[ACT_RE_MODEL] | 模型信息(不重要) | ||
[ACT_RE_PROCDEF] | 已部署的流程定义(流程key存放位置) | ||
运行实例表 | [ACT_RU_EVENT_SUBSCR] |
| |
[ACT_RU_EXECUTION] |
| ||
[ACT_RU_IDENTITYLINK] |
| ||
[ACT_RU_JOB] | 运行时作业 | ||
[ACT_RU_TASK] | 运行时任务(当前节点) | ||
[ACT_RU_VARIABLE] | 运行时变量表 |
2、主要使用接口、类
ProcessEngine: 流程引擎
ProcessEngineConfiguration: 读取流程引擎配置类
Service总览
RepositoryService |
| ||
|
| ||
TaskService |
| ||
HistoryService |
| ||
ManagerService |
|
RepositoryService
是activiti的资源管理类,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工具设计的业务流程图需要使用此service将流程定义文件的内容部署到计算机。
除了部署流程定义以外还可以:查询引擎中的发布包和流程定义。
暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。
获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。
RuntimeService
Activiti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息
TaskService
Activiti的任务管理类。可以从这个类中获取任务的信息。
HistoryService
Activiti的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实例的执行路径,等等。 这个服务主要通过查询功能来获得这些数据。
ManagementService
Activiti的引擎管理类,提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护
三、Spring boot 使用activiti
1、流程模板相关(流程定义)
1.1创建流程模板
@Autowired
private RepositoryService repositoryService;
/**
* 创建流程模板
* 最要的是加载流程定义资源,addClasspathResource/addInputStream 都可以
*
*/
public void create(){
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/evection.bpmn") // 添加bpmn资源
.name("需求预审流程")
.deploy();
}
注:
1、Deployment 中只有其中的key 重要,后面频繁用到
2、其中ACT_RE_PROCDEF 添加了流程key,ACT_RE_DEPLOYMENT记录添加记录,act_ge_bytearray 流程资源表 ,每个流程定义对应两个资源记录,bpmn 和png;
3、流程模板的key和name 在文件中设置,如果key重复会新建一个版本
1.2 删除流程模板
/**
* 删除流程模板
*/
@Test
public void delectFlow(){
repositoryService.deleteDeployment("deploymentId");
}
2、流程实例
2.1 启动流程实例
@Autowired
private RuntimeService runtimeService;
public void runtime(){
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("myProcess_1");
System.out.println(processInstance.getId());
}
同时还可以指定业务标识businessKey和variables(流程中的参数可以传null),也就是出差申请单id (存在act_ru_execution 中的BUSINESS_KEY)
ProcessInstance processInstance = runtimeService.
startProcessInstanceByKey("myEvection","1001",variables);
2.2 查询待审批
@Resource
private TaskService taskService;
/**
* 查询待审批
*/
@Test
public void selectTask(){
List<Task> list = taskService.createTaskQuery()
.taskAssignee("taskService")//只查询该任务负责人的任务
.list();
System.out.println(list);
}
2.3 完成审批
@Resource
private TaskService taskService;
/**
* 处理流程
*/
@Test
public void complete(){
Task task = taskService.createTaskQuery().processInstanceId("流程实例id").taskAssignee("审批人id").singleResult();
taskService.complete(task.getId());
}
相关问题
1、Parameter 0 of method userGroupManager in org.activiti.core.common.spring.identity.config.ActivitiSpringIdentityAutoConfiguration required a bean of type 'org.springframework.security.core.userdetails.UserDetailsService' that could not be found.
解决: 往spring 中添加UserDetailsService
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
@Configuration
public class UserDetailServiceImpl implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return null;
}
}
参考:
SpringBoot集成activiti7报错处理之UserDetailsService that could not be found-CSDN博客