本文介绍了Activiti的工作流引擎及其开发环境配置,详细讲解了Activiti的核心概念和流程设计基础,并通过实战案例演示了请假流程的实现。此外,文章还提供了Activiti调试技巧和常见问题解决方案。
Activiti简介与环境搭建 Activiti介绍Activiti是一个开源的工作流引擎,基于云原生架构,采用Java语言开发,遵循BPMN2.0标准。它能够嵌入到您的应用程序中,实现复杂的业务流程自动化。Activiti支持动态流程定义变更,简化了工作流模型的开发和维护。它能够与其他系统集成,如Spring、MyBatis等,提供了强大的API接口,能够方便地执行流程、查询流程状态、管理流程实例。
开发环境配置-
下载安装JDK
确保已安装JDK。可以从Oracle官网或OpenJDK下载安装包,配置环境变量以设置JDK的安装路径。 -
下载安装Eclipse或IntelliJ IDEA
推荐使用Eclipse或IntelliJ IDEA作为开发工具,安装完成后配置相应的IDE。 -
安装Maven
从Maven官网下载安装包,并配置环境变量,在IDE中配置Maven。 -
创建Activiti项目
在Eclipse或IntelliJ IDEA中创建一个新的Maven项目,在pom.xml
文件中添加Activiti依赖。<dependencies> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>5.22.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency> </dependencies>
-
数据库配置
使用MySQL作为数据库存储Activiti的数据。创建数据库,并配置数据库连接信息。<properties> <driverClassName>com.mysql.jdbc.Driver</driverClassName> <url>jdbc:mysql://localhost:3306/activiti?useSSL=false&serverTimezone=UTC</url> <username>root</username> <password>password</password> </properties>
下面将通过一个简单的例子来展示如何创建和运行一个Activiti流程实例。
-
创建流程定义文件
创建一个名为hello.bpmn20.xml
的文件,内容如下:<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100301/BPMN20.xsd" id="Definitions_1" targetNamespace="http://bpmndi.org"> <process id="HelloProcess" isExecutable="true"> <startEvent id="StartEvent_1"></startEvent> <sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="EndEvent_1"></sequenceFlow> <endEvent id="EndEvent_1"></endEvent> </process> </definitions>
-
创建启动流程的Java类
编写一个Java类来启动并查询流程实例。import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; public class HelloActiviti { public static void main(String[] args) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); Deployment deployment = repositoryService.createDeployment() .addClasspathResource("hello.bpmn20.xml") .deploy(); RuntimeService runtimeService = processEngine.getRuntimeService(); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("HelloProcess"); TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery() .processInstanceId(processInstance.getId()) .singleResult(); System.out.println("任务ID: " + task.getId()); System.out.println("任务名称: " + task.getName()); taskService.complete(task.getId()); } }
- 运行程序
运行HelloActiviti
类中的main
方法,即可看到输出的流程实例信息。
流程定义是流程的蓝图,通常以XML文件的形式存储。流程定义中包含流程中需要执行的各个元素,如任务、网关、事件等。流程实例是基于流程定义创建的实例,可以被具体执行。流程实例的生命周期包括启动、执行、暂停、结束等状态。
任务与用户任务是用户需要完成的操作,例如审批、填写表单等。任务由流程定义中的task
元素表示,任务通常与用户关联。例如,在startProcessInstanceByForm
方法中,可以指定任务的负责人。
<userTask id="Task_1" name="审批" />
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(
"ApprovalProcess",
variables.put("assignee", "alice")
);
事件与监听器
事件是流程中的一个触发点,触发时会执行相应的动作。事件可以分为启动事件、结束事件、中间事件等。中间事件可以分为定时器事件、信号事件等。
<interruptingEventThrowEvent id="ThrowEvent_1" name="信号事件" signalEventDefinition="signal" />
监听器是在特定事件上执行的代码。例如,当流程实例启动或结束时,可以注册监听器进行相应的操作。
processEngine.getTaskService().addEventListener(new TaskListener() {
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("任务创建监听器: " + delegateTask.getId());
}
});
Activiti流程设计基础
BPMN 2.0流程图简介
BPMN(Business Process Model and Notation)是一种建模语言,用于描述业务流程。BPMN 2.0提供了对流程建模、流程执行和流程监控的支持。
BPMN 2.0图由一系列元素组成,包括流程定义、任务、网关、事件、数据对象、消息等。这些元素通过连接线连接起来,形成一个完整的流程图。
流程图绘制工具流程图的绘制工具有多种选择,包括:
- Eclipse BPMN2 Modeler
Eclipse BPMN2 Modeler是一个基于Eclipse的插件,支持BPMN 2.0流程图的绘制和编辑。 - Camunda Modeler
Camunda Modeler是一个开源的流程图绘制工具,支持BPMN 2.0。 - BPMN.io
BPMN.io是一个在线流程图绘制工具,支持BPMN 2.0。
使用这些工具,您可以绘制流程图并将其导出为XML文件。
常见流程设计模式常见的流程设计模式包括:
-
审批流程
审批流程通常包含多个任务节点,每个任务节点代表一个审批步骤。例如,审批一个请假申请,需要经过多个管理层审批。 -
并行分支
并行分支是指流程在某些节点处可以同时执行多个任务。例如,一个订单处理流程可以同时执行发货和计费。 -
串行分支
串行分支是指流程在某些节点处根据条件选择执行不同的分支。例如,一个申请流程可以根据申请人的身份选择不同的审批路径。 - 循环
循环是指流程在某些节点处可以重复执行某些任务。例如,一个报销流程可以多次提交报销单直到所有报销单都处理完毕。
Activiti提供了丰富的API用于管理流程定义。常用的流程定义管理操作包括部署流程定义、查询流程定义、删除流程定义等。
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("process.bpmn20.xml")
.deploy();
List<Deployment> deployments = repositoryService.createDeploymentQuery()
.list();
repositoryService.deleteDeployment(deployment.getId(), true);
任务查询与操作
任务是流程中的一个可执行元素,可以查询和操作任务的状态。
List<Task> tasks = taskService.createTaskQuery()
.taskAssignee("alice")
.list();
taskService.complete(task.getId());
流程实例的启动、查询与结束
流程实例是基于流程定义创建的实例,可以启动、查询和结束。
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("MyProcess");
ProcessInstance pi = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstance.getId())
.singleResult();
runtimeService.deleteProcessInstance(pi.getId(), "流程结束");
实战案例:请假流程实现
需求分析
请假流程的需求分析包括以下几个环节:
- 员工发起请假请求。
- 请假请求提交给部门经理审批。
- 部门经理审批通过后,提交给人事部门审核。
- 人事部门审核通过后,流程结束。
请假流程可以设计为包含多个任务节点的流程。流程图如下:
<process id="LeaveProcess" isExecutable="true">
<startEvent id="StartEvent_1"></startEvent>
<sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="RequestTask_1"></sequenceFlow>
<userTask id="RequestTask_1" name="请假申请" />
<sequenceFlow id="Flow_2" sourceRef="RequestTask_1" targetRef="ManagerApprovalTask_1"></sequenceFlow>
<userTask id="ManagerApprovalTask_1" name="部门经理审批" />
<sequenceFlow id="Flow_3" sourceRef="ManagerApprovalTask_1" targetRef="HRApprovalTask_1"></sequenceFlow>
<userTask id="HRApprovalTask_1" name="人事部门审批" />
<sequenceFlow id="Flow_4" sourceRef="HRApprovalTask_1" targetRef="EndEvent_1"></sequenceFlow>
<endEvent id="EndEvent_1"></endEvent>
</process>
代码实现
实现流程的Java代码如下:
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
public class LeaveProcessExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("leave.bpmn20.xml")
.deploy();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("LeaveProcess");
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.processInstanceId(processInstance.getId())
.singleResult();
System.out.println("任务ID: " + task.getId());
System.out.println("任务名称: " + task.getName());
taskService.complete(task.getId());
}
}
Activiti调试与常见问题解决
调试技巧
-
使用Activiti Explorer
Activiti Explorer是一个Web应用,提供了一个图形化界面来查看和调试流程实例。可以通过浏览器访问Activiti Explorer,查看流程定义和实例,以及任务和事件。 -
使用日志
Activiti支持通过日志来查看流程实例的状态。可以配置日志级别,以便在运行时查看详细的日志信息。 - 使用调试工具
在IDE中启用调试模式,可以在流程执行时打断点进行调试。可以通过调试工具查看流程实例的状态和变量的值。
-
流程定义未找到
确认流程定义文件已正确部署,确认流程定义的key名称正确。 -
任务未找到
确认任务的assignee正确,确认任务的ID正确。 - 流程实例未找到
确认流程实例的ID正确,检查流程实例的状态,确认是否已结束或暂停。
-
数据库优化
使用索引优化查询性能,定期清理过期的数据。 -
流程实例的批量操作
使用批量操作API来减少数据库访问次数。 - 使用缓存
使用缓存技术来减少数据库访问次数。
通过以上的介绍和示例,您应该已经掌握了Activiti的基本使用方法和一些常见问题的解决技巧。希望这些内容能帮助您更好地使用Activiti来实现复杂的业务流程自动化。