深入了解Activiti工作流引擎:从基础到实战
引言
在现代软件开发中,业务流程自动化变得越来越重要。无论是企业内部的审批流程、订单处理,还是客户服务请求管理,都能通过工作流引擎来实现高效的自动化处理。Activiti 是一个轻量级的工作流和业务流程管理 (BPM) 平台,它提供了强大的功能来支持各种复杂的工作流需求。本文旨在向之前没有接触过 Activiti 的 Java 开发者介绍其基本概念、安装配置以及通过一个简单的案例来展示如何使用 Activiti 进行工作流开发。
一、什么是 Activiti?
Activiti 是一款开源的工作流引擎,由 Alfresco 公司开发并维护。它基于 BPMN 2.0 标准设计,提供了一套完整的工具集来创建、部署和运行工作流应用。Activiti 可以很容易地集成到现有的 Java 应用程序中,并且拥有丰富的 API 来满足不同场景下的需求。
主要特点
- 轻量级:体积小,易于部署。
- 灵活性高:支持多种数据库;可扩展性强。
- 社区活跃:有大量开发者贡献代码和支持。
- 易用性好:提供了图形化的设计工具(如 Activiti Modeler)。
二、开始前的准备
环境搭建
- JDK 1.8 或更高版本
- Maven 3.x
- 数据库(例如 MySQL)
- IDE(推荐 IntelliJ IDEA 或 Eclipse)
创建项目
- 打开你的 IDE,创建一个新的 Maven 项目。
- 在
pom.xml
文件中添加以下依赖项:
<dependencies> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>7.1.0.M6</version> </dependency> <!-- 添加其他必要的依赖 --> </dependencies>
注意:请根据实际情况调整 Activiti 版本号。
三、定义第一个流程
使用 BPMN 设计器
你可以使用 Activiti 提供的在线设计器 Activiti Modeler 来可视化地创建流程图。这里我们将创建一个非常简单的请假申请流程。
步骤说明
- 登录到 Activiti Modeler。
- 选择“新建” -> “BPMN Diagram”。
- 在画布上拖拽出“开始事件”、“用户任务”、“结束事件”等元素,并连接起来形成逻辑路径。
- 保存文件为
.bpmn20.xml
格式,并下载至本地。
部署流程
接下来,我们需要将这个 .bpmn20.xml
文件加载到我们的 Java 应用程序中去。
@Autowired private RepositoryService repositoryService; public void deployProcessDefinition() { InputStream bpmnStream = getClass().getResourceAsStream("/leaveRequest.bpmn20.xml"); ZipInputStream zipInputStream = new ZipInputStream(bpmnStream); repositoryService.createDeployment() .addZipInputStream(zipInputStream) .deploy(); }
这段代码的作用是从类路径下读取 .bpmn20.xml
文件,并将其作为新的流程定义部署到 Activiti 中。
四、启动流程实例 & 完成任务
启动新流程
为了触发我们刚刚部署的流程,可以调用 RuntimeService
的 startProcessInstanceByKey()
方法。
java
Copy code
@Autowired private RuntimeService runtimeService; public void startLeaveRequest(String employeeName) { Map<String, Object> variables = new HashMap<>(); variables.put("employee", employeeName); runtimeService.startProcessInstanceByKey("leaveRequest", variables); }
处理用户任务
当流程到达某个用户任务节点时,需要有人手动完成该任务。这可以通过 TaskService
实现。
@Autowired private TaskService taskService; public List<Task> findTasksForUser(String userId) { return taskService.createTaskQuery().taskAssignee(userId).list(); } public void completeTask(String taskId, Map<String, Object> variables) { taskService.complete(taskId, variables); }
结论
通过上述步骤,你已经成功地创建了一个基于 Activiti 的简单请假申请系统。当然,实际生产环境中可能会遇到更复杂的业务逻辑和需求,但掌握了基础知识后,相信你能轻松应对更多挑战!