Activiti是一个开源的工作流程和流程引擎,基于BPMN 2.0标准,提供了一套完整的工具来设计、执行和管理工作流程。它具备轻量级、灵活且易于集成的特点,适用于各种业务流程自动化、任务分配与协作场景。文章详细介绍了Activiti的安装配置、流程定义与设计、流程实例与任务管理等内容。
Activiti简介Activiti定义与基本概念
Activiti是一个开源的工作流程和流程引擎,基于BPMN 2.0标准,提供了一套完整的工具来设计、执行和管理工作流程。它可以被嵌入到任何Java应用程序中,用来管理业务流程、任务分配、工作流自动化等。Activiti的核心优势在于其轻量级、灵活且易于集成的特点,能够快速地与现有的应用结合,简化业务流程的管理。
Activiti的主要特点和优势
- 轻量级与高性能:Activiti使用轻量级的设计,旨在提供低延迟和高性能。它的内存占用小,启动和执行速度快。
- 灵活性与可扩展性:Activiti使用Java API,可以轻松地与现有应用程序集成,并且提供了服务任务、脚本任务等丰富功能,满足各种不同的业务需求。
- 易用性:Activiti提供了简单的API,便于开发人员快速上手。它可以与大多数主流的数据库和框架集成,降低了开发和维护成本。
- 强大的功能集:Activiti支持流程建模、流程模拟、流程执行、流程监控等一系列功能,可以帮助企业实现高效的业务流程管理。
Activiti的应用场景
- 业务流程自动化:通过定义业务流程,实现自动化处理,如请假申请、报销审批等。
- 任务分配与协作:通过流程引擎可以清晰地划分任务,分配给不同的用户或部门,提高协作效率。
- 流程监控与优化:通过监控工具可以实时查看流程执行状态,发现问题并及时优化改进。
- 多平台支持:Activiti支持在多种平台和环境上运行,包括Web应用、桌面应用、移动应用等。
开发环境搭建
为了开始使用Activiti,首先需要搭建一个Java开发环境。推荐使用IDE,如Eclipse、IntelliJ IDEA等。安装完成后,配置Java开发环境。
安装步骤
- 安装Java Development Kit (JDK):确保安装了Java 8及以上版本。
- 安装IDE:选择你喜欢的IDE,如Eclipse或IntelliJ IDEA,并根据IDE的文档进行安装。
配置步骤
- 配置环境变量:设置
JAVA_HOME
、PATH
等环境变量。 - 安装Maven:Activiti项目的构建可以使用Maven进行管理。下载并安装Maven,设置其环境变量。
export MAVEN_HOME=/path/to/maven
export PATH=$PATH:$MAVEN_HOME/bin
Activiti项目环境配置
-
创建一个新的Maven项目:
使用IDE创建一个新的Maven项目,设置项目名称和组ID。 - 添加依赖:
在pom.xml
文件中添加Activiti的依赖。
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.22.0</version>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.5.1</version>
</dependency>
</dependencies>
- 配置数据库:
Activiti可以与多种数据库集成,这里使用HSQLDB作为内嵌数据库。在pom.xml
中添加HSQLDB依赖,并配置application.properties
文件。
# application.properties
activiti.database=org.hsqldb.jdbcDriver
activiti.database.url=jdbc:hsqldb:mem:activiti
activiti.database.username=sa
activiti.database.password=
第一个Activiti应用程序
创建一个简单的Activiti应用程序,演示如何启动Activiti引擎并部署一个简单的流程定义。
创建流程定义
- 创建BPMN文件:创建一个名为
leaveRequest.bpmn
的BPMN文件,定义一个简单的请假流程。
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100301/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100301/MODEL http://www.omg.org/spec/BPMN/20100301/MODEL/BPMN20.xsd" id="Definitions_1">
<process id="leaveRequest" name="Leave Request Process" isExecutable="true">
<startEvent id="startEvent" />
<sequenceFlow id="flow1" sourceRef="startEvent" targetRef="task1" />
<userTask id="task1" name="Submit Leave Request" />
<sequenceFlow id="flow2" sourceRef="task1" targetRef="endEvent" />
<endEvent id="endEvent" />
</process>
</definitions>
- 启动Activiti引擎:
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineFactory;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
public class ActivitiFirstApp {
public static void main(String[] args) {
ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createStandaloneInMemory();
ProcessEngine processEngine = cfg.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("leaveRequest.bpmn")
.deploy();
System.out.println("Deployment ID: " + deployment.getId());
}
}
通过以上步骤,你已经成功搭建了开发环境并启动了Activiti引擎,部署了一个简单的请假流程定义。
流程定义与设计BPMN 2.0流程设计简介
BPMN (Business Process Model and Notation) 是一种业务流程建模语言,用于描述业务流程中的活动、流程和任务。BPMN 2.0是其最新版本,提供了更加丰富和复杂的流程模型。流程图由节点(如开始节点、结束节点、任务节点等)、流程线(连接节点的线)及属性(定义节点行为和流程控制)组成。
创建和部署流程定义
创建一个简单的请假流程定义。
创建BPMN文件
- 定义开始节点:使用
startEvent
节点表示流程的开始。 - 定义用户任务:使用
userTask
节点表示待处理的任务。 - 定义结束节点:使用
endEvent
节点表示流程的结束。 - 定义流程线:使用
sequenceFlow
节点连接各个节点,定义流程的执行顺序。
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100301/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100301/MODEL http://www.omg.org/spec/BPMN/20100301/MODEL/BPMN20.xsd" id="Definitions_1">
<process id="leaveRequest" name="Leave Request Process" isExecutable="true">
<startEvent id="startEvent" />
<sequenceFlow id="flow1" sourceRef="startEvent" targetRef="task1" />
<userTask id="task1" name="Submit Leave Request" />
<sequenceFlow id="flow2" sourceRef="task1" targetRef="endEvent" />
<endEvent id="endEvent" />
</process>
</definitions>
部署流程定义
在Java代码中部署流程定义。
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineFactory;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
public class ActivitiFirstApp {
public static void main(String[] args) {
ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createStandaloneInMemory();
ProcessEngine processEngine = cfg.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("leaveRequest.bpmn")
.deploy();
System.out.println("Deployment ID: " + deployment.getId());
}
}
流程变量与任务
流程变量在流程执行过程中用于传递数据,可以是各种类型(如字符串、整数、对象等)。任务可以由用户、服务或其他流程节点触发,用于执行特定的操作。
定义流程变量
在BPMN文件中,可以在任务节点中定义流程变量。
<userTask id="task1" name="Submit Leave Request">
<extensionElements>
<activiti:formProperty id="duration" name="Duration" type="string" required="true" />
</extensionElements>
</userTask>
通过API设置流程变量
在Java代码中设置流程变量。
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
public class SetProcessVariablesExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveRequest");
runtimeService.setVariable(processInstance.getId(), "duration", "1 week");
System.out.println("Process Instance ID: " + processInstance.getId());
}
}
任务管理
在Activiti中,可以通过API来执行任务操作。
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
public class TaskManagementExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
// 查询任务
Task task = taskService.createTaskQuery().taskName("Submit Leave Request").singleResult();
System.out.println("Task ID: " + task.getId());
// 完成任务
taskService.complete(task.getId());
}
}
流程实例与任务管理
创建流程实例
流程实例是流程定义的具体实例化形式,表示一个具体的业务流程执行过程。创建流程实例,通常需要指定流程变量。
创建流程实例
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
public class CreateProcessInstanceExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveRequest", "1001");
System.out.println("Process Instance ID: " + processInstance.getId());
}
}
任务的管理与查询
任务是流程实例中的具体操作。通过任务管理API,可以执行任务的创建、查询、更新和完成等操作。
查询任务
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
public class QueryTaskExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery().taskName("Submit Leave Request").singleResult();
System.out.println("Task ID: " + task.getId());
}
}
完成任务
public class CompleteTaskExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
String taskId = "task1";
taskService.complete(taskId);
}
}
流程实例状态管理
流程实例的状态表示流程执行的当前状态。可以通过API查询和更新流程实例的状态。
查询流程实例状态
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
public class QueryProcessInstanceStatusExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("12345").singleResult();
if (processInstance != null) {
System.out.println("Process Instance Status: " + processInstance.getProcessDefinitionId());
}
}
}
更新流程实例状态
更新流程实例状态可以参考Activiti提供的API,如runtimeService.setVariable(processInstanceId, "status", "completed")
。
查询API使用
Activiti提供了多种查询API,用于获取流程定义、流程实例、任务等信息。
查询流程定义
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;
public class QueryProcessDefinitionExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leaveRequest").singleResult();
if (processDefinition != null) {
System.out.println("Process Definition ID: " + processDefinition.getId());
}
}
}
查询流程实例
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
public class QueryProcessInstanceExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("12345").singleResult();
if (processInstance != null) {
System.out.println("Process Instance ID: " + processInstance.getId());
}
}
}
任务管理API
任务管理API用于操作任务,如创建、查询、更新和完成任务。
创建任务
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
public class CreateTaskExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTask();
task.setName("Submit Leave Request");
task.setAssignee("user1");
taskService.saveTask(task);
System.out.println("Task ID: " + task.getId());
}
}
事件监听器与服务任务
事件监听器可以监听流程中的各种事件,如启动、结束等。服务任务用于执行特定的服务,如调用外部系统。
事件监听器
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.delegate.BpmnError;
public class EventListenerExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
// 添加任务监听器
TaskListener taskListener = new TaskListener() {
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("Task assigned to: " + delegateTask.getAssignee());
}
};
taskService.setAssignee("task1", "user1");
taskService.addEventListener(taskListener);
}
}
服务任务
<userTask id="serviceTask1" name="Submit Leave Request" implementation="java">
<script>
public void execute(DelegateExecution execution) {
String userId = execution.getVariable("userId");
System.out.println("Executing service task for user: " + userId);
}
</script>
</userTask>
实战案例
简单请假流程实例
创建一个简单的请假流程实例。
BPMN文件
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100301/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100301/MODEL http://www.omg.org/spec/BPMN/20100301/MODEL/BPMN20.xsd" id="Definitions_1">
<process id="leaveRequest" name="Leave Request Process" isExecutable="true">
<startEvent id="startEvent" />
<sequenceFlow id="flow1" sourceRef="startEvent" targetRef="taskSubmitRequest" />
<userTask id="taskSubmitRequest" name="Submit Leave Request" />
<sequenceFlow id="flow2" sourceRef="taskSubmitRequest" targetRef="taskApproveRequest" />
<userTask id="taskApproveRequest" name="Approve Leave Request" />
<sequenceFlow id="flow3" sourceRef="taskApproveRequest" targetRef="endEvent" />
<endEvent id="endEvent" />
</process>
</definitions>
创建流程实例
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
public class CreateLeaveRequestExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveRequest", "1001");
System.out.println("Process Instance ID: " + processInstance.getId());
}
}
完成任务
public class CompleteLeaveRequestExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
String taskId = "task1";
taskService.complete(taskId);
}
}
复杂流程(如审批流程)实战
创建一个复杂的审批流程实例,例如报销审批流程。
BPMN文件
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100301/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100301/MODEL http://www.omg.org/spec/BPMN/20100301/MODEL/BPMN20.xsd" id="Definitions_1">
<process id="reimbursementWorkflow" name="Reimbursement Workflow" isExecutable="true">
<startEvent id="startEvent" />
<sequenceFlow id="flow1" sourceRef="startEvent" targetRef="taskSubmitRequest" />
<userTask id="taskSubmitRequest" name="Submit Reimbursement Request" />
<sequenceFlow id="flow2" sourceRef="taskSubmitRequest" targetRef="taskManagerApprove" />
<userTask id="taskManagerApprove" name="Manager Approve" />
<sequenceFlow id="flow3" sourceRef="taskManagerApprove" targetRef="taskDirectorApprove" />
<userTask id="taskDirectorApprove" name="Director Approve" />
<sequenceFlow id="flow4" sourceRef="taskDirectorApprove" targetRef="endEvent" />
<endEvent id="endEvent" />
</process>
</definitions>
创建流程实例
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
public class CreateReimbursementRequestExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("reimbursementWorkflow", "1001");
System.out.println("Process Instance ID: " + processInstance.getId());
}
}
完成任务
public class CompleteReimbursementRequestExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
String taskId = "task1";
taskService.complete(taskId);
}
}
流程监控与优化技巧
监控流程实例
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
public class MonitorProcessInstanceExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("12345").singleResult();
if (processInstance != null) {
System.out.println("Process Instance Status: " + processInstance.getProcessDefinitionId());
}
}
}
优化流程
优化流程通常涉及分析流程执行日志,找出瓶颈和效率低下的环节,然后进行调整。可以使用Activiti的管理控制台来查看流程执行的数据,从而进行优化。
示例代码
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100301/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100301/MODEL http://www.omg.org/spec/BPMN/20100301/MODEL/BPMN20.xsd" id="Definitions_1">
<process id="improvedWorkflow" name="Improved Workflow" isExecutable="true">
<startEvent id="startEvent" />
<sequenceFlow id="flow1" sourceRef="startEvent" targetRef="taskSubmitRequest" />
<userTask id="taskSubmitRequest" name="Submit Request" />
<sequenceFlow id="flow2" sourceRef="taskSubmitRequest" targetRef="taskApproveRequest" />
<userTask id="taskApproveRequest" name="Approve Request" />
<sequenceFlow id="flow3" sourceRef="taskApproveRequest" targetRef="endEvent" />
<endEvent id="endEvent" />
</process>
</definitions>
以上是Activiti入门教程,通过以上内容,你已经掌握了Activiti的基本概念、安装与配置、流程定义与设计、流程实例与任务管理、常用API与API调用,以及实际应用案例。希望这些内容能帮助你快速上手使用Activiti,并在实际项目中发挥其强大的功能。
共同学习,写下你的评论
评论加载中...
作者其他优质文章