Activiti 5 流程引擎应用指南
Activiti 是一个开源的业务流程管理(BPM)平台,它实现了 BPMN 2.0 标准,允许用户设计、部署和执行业务流程。作为一款轻量级且高度可扩展的引擎,Activiti 被广泛应用于构建高效的 BPM 应用程序。
Activiti 强调其组件和服务接口的设计,旨在为开发者提供便捷的开发体验。下面将详细介绍 Activiti 的核心组件和服务接口,并通过示例展示如何使用它们进行工作流的创建与管理。
核心组件介绍
- 关键对象
DeployObj: 流程部署对象,在部署时创建。ProcDef: 流程定义,成功部署后自动生成。ProcInst: 流程实例,启动流程时生成。UserTask: 用户任务,指需要人工参与的任务节点。ExecPlan: 执行计划,涵盖了所有流程实例及其执行状态。
- 服务接口
EngineService: 获取所需服务的核心入口。RepoService: 管理流程定义资源的服务。RuntimeSvc: 提供流程实例生命周期管理的功能。TaskSvc: 处理用户任务相关操作的服务。IdentitySvc: 管理用户和组信息的服务。MgmtSvc: 维护和管理系统的服务。HistorySvc: 提供历史流程数据查询功能。
以下是一个简单的单元测试示例,用于验证配置文件是否正确以及流程能否被成功部署:
public class WorkflowTest {
@Test
public void testDeployment() {
ProcessEngine engine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("config.xml").buildProcessEngine();
RepositoryService repoSvc = engine.getRepositoryService();
Deployment deploy = repoSvc.createDeployment().addClasspathResource("WorkFlow.bpmn").deploy();
assertNotNull(deploy);
}
}
为了更好地集成 Spring 框架,了解基于 Spring 配置 Activiti 和事务处理的方法非常重要。
官方示例(activiti-explorer)
下载 Activiti Explorer 示例项目,并根据 MySQL 数据库修改配置文件如下:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/activiti?useSSL=false&serverTimezone=UTC
jdbc.username=root
jdbc.password=password
访问地址 http://localhost:8080/activiti-explorer 使用默认账号 kermit 登录。
IDEA 中开发 Activiti 工作流
安装 actiBPM 插件并创建 Maven 工程,添加依赖项:
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>5.22.0</version>
</dependency>
创建数据库表结构:
public class DBSetup {
public static void main(String[] args) {
ProcessEngine engine = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration().buildProcessEngine();
System.out.println(engine);
}
}
部署流程并启动:
@Test
public void deployAndStartProcess() {
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repoSvc = engine.getRepositoryService();
repoSvc.createDeployment().addClasspathResource("WorkFlow.bpmn").deploy();
RuntimeService runtimeSvc = engine.getRuntimeService();
runtimeSvc.startProcessInstanceByKey("workflowKey");
}