Activiti是一个基于BPMN 2.0规范的轻量级工作流引擎,支持流程定义文件和API来启动和管理流程实例。此外,它还提供了图形化工具,使得流程设计更加直观和易于理解。Activiti资料详尽介绍了其安装、配置、核心概念、API使用以及图形化工具设计流程图的方法。
Activiti是一个开源的工作流引擎,它提供了一个简单且轻量级的BPMN 2.0流程引擎。Activiti的主要目的是让开发者能够方便地将业务流程集成到他们的应用程序中。它支持Java平台上的多种应用程序,并且设计时考虑到了动态性和可扩展性。
Activiti是一个基于BPMN 2.0规范的轻量级工作流引擎,它允许开发者通过流程定义文件(通常是BPMN 2.0格式的XML文件)定义业务流程。Activiti提供了一套API来启动和管理流程实例,以及处理流程中的各种任务和事件。此外,Activiti还提供了图形化工具,使得流程设计更加直观和易于理解。
Activiti广泛应用于需要业务流程管理的场景,例如:
通过定义明确的流程,可以提高业务的效率和一致性,减少人工错误,同时提供详细的流程跟踪和控制。
为了开始使用Activiti,首先需要搭建开发环境,并配置好Activiti工作流引擎。
示例:Maven依赖配置
<dependencies> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>6.0.0</version> </dependency> </dependencies>
示例:数据库连接配置
<!-- Maven pom.xml --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency>
Activiti通过配置文件来设置数据库连接和其他引擎配置。
示例:Activiti配置文件activiti.cfg.xml
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="databaseSchemaUpdate" value="true" /> <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti" /> <property name="jdbcUsername" value="root" /> <property name="jdbcPassword" value="password" /> </bean>
leaveProcess.bpmn20.xml
。示例:定义一个请假流程
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100301/BPMN20" xmlns:activiti="http://activiti.org/bpmn" id="leaveProcess" targetNamespace="http://bpmn.io/schema/bpmn"> <process id="leaveProcess" name="请假流程" isExecutable="true"> <startEvent id="startEvent" /> <sequenceFlow sourceRef="startEvent" targetRef="userTask" /> <userTask id="userTask" name="提交请假申请" /> <sequenceFlow sourceRef="userTask" targetRef="serviceTask" /> <serviceTask id="serviceTask" name="审批请假申请" activiti:delegateExpression="${approveLeave}" /> <sequenceFlow sourceRef="serviceTask" targetRef="endEvent" /> <endEvent id="endEvent" /> </process> </definitions>
示例:启动流程并处理任务
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.TaskService; import org.activiti.engine.task.Task; public class ActivitiExample { public static void main(String[] args) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = processEngine.getTaskService(); // 启动流程实例 String processInstanceId = processEngine.getRuntimeService().startProcessInstanceByKey("leaveProcess").getId(); // 查询任务 Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult(); System.out.println("任务ID: " + task.getId()); System.out.println("任务名称: " + task.getName()); // 完成任务 taskService.complete(task.getId()); } }
这个示例展示了如何启动一个流程实例,查询相关任务,并完成任务。通过这种方式,可以更深入地了解如何使用Activiti进行流程定义和管理。
要更好地使用Activiti,理解其核心概念是必不可少的。
流程定义: 流程定义是用BPMN 2.0格式定义的XML文件,描述了流程的各个步骤及其之间的关系。流程定义通常保存在数据库中,可以在运行时动态加载和修改。
流程实例: 流程实例是根据流程定义创建的实际运行实例。每个流程实例都有唯一的标识,并且可以跟踪其状态和历史记录。
任务(Task): 任务是流程中的基本单元,表示流程中的一个步骤。
示例:定义用户任务和服务任务
<userTask id="submitLeaveRequest" name="提交请假申请" /> <serviceTask id="approveLeave" name="审批请假申请" activiti:delegateExpression="${approveLeave}" />
事件(Event): 事件是指在流程执行过程中发生的特殊情况,如定时器事件、信号事件等。
示例:定义信号事件
<signal id="leaveApprovedSignal" name="请假审批通过信号" /> <signalEventSubscription id="signalSubscription" signalRef="leaveApprovedSignal" />
Activiti提供了丰富的API来管理和操作流程实例、任务和服务。
使用Activiti API可以启动一个新的流程实例,并获取其标识符。
示例:启动流程实例
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RuntimeService; public class StartProcessExample { public static void main(String[] args) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); String processInstanceId = runtimeService.startProcessInstanceByKey("leaveProcess").getId(); System.out.println("流程实例ID: " + processInstanceId); } }
通过API可以查询流程实例的状态,获取流程实例的信息。
示例:查询流程实例状态
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RuntimeService; public class QueryProcessExample { public static void main(String[] args) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); String processInstanceId = "12345"; String processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); System.out.println("流程实例状态: " + processInstance); } }
Activiti提供了处理任务和事件的API,可以通过这些API来完成任务、更新任务状态和触发事件。
示例:完成任务
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.TaskService; public class CompleteTaskExample { public static void main(String[] args) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = processEngine.getTaskService(); String taskId = "12345"; taskService.complete(taskId); } }
示例:触发信号事件
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RuntimeService; public class TriggerSignalExample { public static void main(String[] args) { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RuntimeService runtimeService = processEngine.getRuntimeService(); String processInstanceId = "12345"; runtimeService.signalEventReceived("leaveApprovedSignal", processInstanceId); } }
通过这些API,可以更灵活地管理和操作流程实例、任务和服务。
Activiti提供了一个图形化工具Activiti Designer,用于设计流程图。
Activiti Designer是一个基于Eclipse的图形化工具,用于设计BPMN 2.0流程图。它提供了一个直观的界面,使得流程定义更加直观和易于理解。
示例:设计一个简单的请假流程
<process id="leaveProcess" name="请假流程" isExecutable="true"> <startEvent id="startEvent" /> <sequenceFlow sourceRef="startEvent" targetRef="userTask" /> <userTask id="userTask" name="提交请假申请" /> <sequenceFlow sourceRef="userTask" targetRef="serviceTask" /> <serviceTask id="serviceTask" name="审批请假申请" activiti:delegateExpression="${approveLeave}" /> <sequenceFlow sourceRef="serviceTask" targetRef="endEvent" /> <endEvent id="endEvent" /> </process>
Activiti Designer支持流程定义文件的导入和导出。
示例:导出流程定义
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100301/BPMN20" xmlns:activiti="http://activiti.org/bpmn" id="leaveProcess" targetNamespace="http://bpmn.io/schema/bpmn"> <process id="leaveProcess" name="请假流程" isExecutable="true"> <startEvent id="startEvent" /> <sequenceFlow sourceRef="startEvent" targetRef="userTask" /> <userTask id="userTask" name="提交请假申请" /> <sequenceFlow sourceRef="userTask" targetRef="serviceTask" /> <serviceTask id="serviceTask" name="审批请假申请" activiti:delegateExpression="${approveLeave}" /> <sequenceFlow sourceRef="serviceTask" targetRef="endEvent" /> <endEvent id="endEvent" /> </process> </definitions>
通过Activiti Designer,可以更直观地设计和管理流程图,并将其导出为可执行的流程定义文件。
在使用Activiti的过程中,可能会遇到一些常见问题和性能优化需求。以下是一些常见问题及其解决方案,以及性能优化的技巧。
流程定义加载失败:
数据库连接问题:
优化数据库索引:
ACT_RU_TASK
表的ASSIGNEE_
字段。使用连接池:
减少流程实例数量:
activiti:async
属性。官方文档:
社区论坛: