Activiti是Apache基金会的顶级项目之一,它是一个轻量级的工作流和业务流程管理平台,支持BPMN 2.0标准,能够轻松地将业务流程嵌入到应用中。Activiti具有轻量级、高性能和高可用性等特点,适用于审批流程、订单处理、人力资源管理等多种业务场景。
Activiti介绍Activiti是什么
Activiti是Apache基金会的顶级项目之一,它是一个轻量级的工作流和业务流程管理平台。Activiti提供了强大的流程定义能力,支持BPMN 2.0标准,可以轻松地将业务流程嵌入到应用中。Activiti的核心是通过流程定义文件(通常是BPMN 2.0 XML文件)来描述流程,然后使用Java API来运行和管理这些流程。
Activiti的特点和优势
Activiti具有以下特点和优势:
- 轻量级:Activiti架构简单,不需要复杂的配置和依赖,非常容易集成到现有的应用中。
- 高性能:Activiti采用了轻量级的设计,使其更加高效,能够支持高并发的业务场景。
- 高可用性:Activiti支持外部数据库存储,可以方便地实现数据持久化和集群部署,从而提高系统的可用性和可靠性。
- 开放源代码:Activiti是一个开源项目,社区支持活跃,用户可以自由地使用、修改和分发。
- 易用性:Activiti提供了丰富的API和工具,使得流程定义、部署和执行都非常容易。
Activiti的应用场景
Activiti可以应用于各种业务场景中,如:
- 审批流程:例如请假审批、报销审批等。
- 订单处理流程:从订单创建到订单交付的全过程。
- 人力资源管理:从招聘、入职、培训到离职的全流程管理。
- 供应链管理:订单处理、物流配送、库存管理等。
- 生产流程管理:从原材料采购到成品产出的生产流程。
快速安装Activiti
Activiti可以运行在Java应用程序中,通常需要以下步骤进行安装:
- 下载Activiti:你可以从Apache官网下载最新的Activiti发行版,或者通过Maven仓库直接添加依赖。
-
添加依赖:如果你使用Maven或者Gradle等构建工具,可以在
pom.xml
或build.gradle
文件中添加Activiti依赖。例如,在Maven中添加如下依赖:<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>6.0.0</version> </dependency>
-
配置数据库:Activiti可以通过多种数据库进行数据持久化,例如MySQL、Oracle等。你需要配置数据库连接信息,并创建相应的数据库表。
准备数据库表的SQL脚本可以在
activiti-standalone-6.0.0\examples\mysql\create\
目录下找到。
Activiti环境配置
为了更好地使用Activiti,你需要配置一些重要的环境设置:
-
配置数据库连接:编辑
ACTIVITI_PROPERTIES
文件中的数据库连接信息,确保Activiti能够正确连接到你的数据库。# Database configuration db.url=jdbc:mysql://localhost:3306/activiti db.username=root db.password=password db.driver=com.mysql.jdbc.Driver
-
配置流程引擎:在Java代码中配置Activiti流程引擎,确保它能够正确初始化并连接到数据库。
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; public class ActivitiExample { public static void main(String[] args) { // 初始化流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); // 部署流程定义 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("process.bpmn20.xml") .deploy(); } }
第一个Activiti项目实例
为了帮助你更快地入门,下面提供一个简单的Activiti项目实例。假设你已经创建了一个名为process.bpmn20.xml
的流程定义文件,并且已经配置好数据库连接。
-
创建流程定义文件:在项目的类路径中创建一个
process.bpmn20.xml
文件,该文件定义了一个简单的审批流程。<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100301/BPMN20.xsd" xmlns:activiti="http://activiti.org/bpmn" id="Process_1" targetNamespace="http://www.activiti.org/bpmn"> <process id="Process_1" name="Simple Approval Process" isExecutable="true"> <startEvent id="startEvent"></startEvent> <userTask id="userTask" name="Approval Task"></userTask> <endEvent id="endEvent"></endEvent> <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="userTask"></sequenceFlow> <sequenceFlow id="flow2" sourceRef="userTask" targetRef="endEvent"></sequenceFlow> </process> </definitions>
-
部署流程定义:在Java代码中部署这个流程定义。
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; public class ActivitiExample { public static void main(String[] args) { // 初始化流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); // 部署流程定义 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("process.bpmn20.xml") .deploy(); System.out.println("Deployment ID: " + deployment.getId()); } }
-
启动流程实例:在部署流程定义后,你可以启动一个流程实例。
import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.runtime.ProcessInstance; public class ActivitiExample { public static void main(String[] args) { // 初始化流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); ProcessInstance processInstance = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("Process_1") .singleResult() .getProcessInstance(); // 启动流程实例 ProcessInstance startInstance = processEngine.getRuntimeService().startProcessInstanceById(deployment.getId()); System.out.println("Process Instance ID: " + startInstance.getId()); } }
通过以上步骤,你已经成功地部署了一个简单的审批流程,并启动了一个流程实例。接下来,我们将进一步深入介绍Activiti的核心概念。
Activiti核心概念讲解流程定义与流程实例
流程定义是使用BPMN 2.0 XML格式定义的一组流程步骤和控制逻辑。流程定义文件通常存储在数据库或文件系统中,可以被多个流程实例共享。
流程实例是流程定义的具体执行实例,它根据流程定义中的规则运行。每个流程实例都有唯一的ID,并且可以包含多个任务实例。
用户任务与服务任务
用户任务是流程定义中的一个节点,表示一个需要人工参与的任务。用户任务通常由用户通过界面操作来完成。例如,在一个请假流程中,管理员审批这个请假请求就是一个用户任务。
服务任务是流程定义中的另一个节点,表示一个由系统自动执行的操作。服务任务通常用于调用外部服务或执行一些业务逻辑。例如,在一个订单处理流程中,更新库存信息可以是一个服务任务。
流转事件与信号
流转事件是流程定义中的一个节点,表示在特定条件下自动流转到下一个任务。流转事件通常用于实现流程中的条件分支和循环。
信号是流程定义中的一个节点,表示一个外部事件,当信号被触发时,流程会根据定义的规则进行处理。例如,在一个订单处理流程中,当库存不足时,可以发送一个信号来触发补货操作。
Activiti流程设计入门使用Activiti Designer设计流程图
Activiti Designer是一个基于Web的工具,用于设计BPMN 2.0流程图。你可以通过以下步骤使用Activiti Designer:
- 访问Activiti Designer:访问Activiti Designer网站,打开流程设计器。
- 创建流程图:在流程设计器中,你可以拖拽和放置各种流程元素,例如用户任务、服务任务、流转事件等。
- 保存流程定义:完成流程设计后,可以将流程定义导出为XML格式的文件。
例如,创建一个简单的审批流程,包含一个开始事件、一个用户任务和一个结束事件。
流程定义文件解析
流程定义文件通常是一个XML格式的文件,遵循BPMN 2.0标准。通过解析这个文件,Activiti引擎可以创建流程实例并执行流程。
例如,一个简单的流程定义文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100301/BPMN20.xsd"
xmlns:activiti="http://activiti.org/bpmn"
id="Process_1"
targetNamespace="http://www.activiti.org/bpmn">
<process id="Process_1" name="Simple Approval Process" isExecutable="true">
<startEvent id="startEvent"></startEvent>
<userTask id="userTask" name="Approval Task"></userTask>
<endEvent id="endEvent"></endEvent>
<sequenceFlow id="flow1" sourceRef="startEvent" targetRef="userTask"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="userTask" targetRef="endEvent"></sequenceFlow>
</process>
</definitions>
创建与提交任务
在流程实例运行过程中,用户任务和流程实例的相关信息会被保存到数据库中。你可以通过Activiti API查询和操作这些任务。
例如,查询某个流程实例中的所有任务:
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
public class ActivitiExample {
public static void main(String[] args) {
// 初始化流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
RuntimeService runtimeService = processEngine.getRuntimeService();
// 启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceById("Process_1");
System.out.println("Process Instance ID: " + processInstance.getId());
// 查询任务
List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
for (Task task : tasks) {
System.out.println("Task ID: " + task.getId());
System.out.println("Task Name: " + task.getName());
}
}
}
通过以上步骤,你可以创建和提交任务,并查询相关的信息。
Activiti API基础使用获取流程定义
你可以通过Activiti API获取流程定义的信息,例如流程定义ID、名称等。
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;
public class ActivitiExample {
public static void main(String[] args) {
// 初始化流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
// 获取流程定义
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("Process_1")
.singleResult();
System.out.println("Process Definition ID: " + processDefinition.getId());
System.out.println("Process Definition Key: " + processDefinition.getKey());
System.out.println("Process Definition Name: " + processDefinition.getName());
}
}
启动流程实例
你可以通过Activiti API启动一个流程实例。
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
public class ActivitiExample {
public static void main(String[] args) {
// 初始化流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
// 部署流程定义
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("process.bpmn20.xml")
.deploy();
// 启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceById(deployment.getId());
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.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
public class ActivitiExample {
public static void main(String[] args) {
// 初始化流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
RuntimeService runtimeService = processEngine.getRuntimeService();
// 启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceById("Process_1");
System.out.println("Process Instance ID: " + processInstance.getId());
// 查询任务
List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
for (Task task : tasks) {
System.out.println("Task ID: " + task.getId());
System.out.println("Task Name: " + task.getName());
// 完成任务
taskService.complete(task.getId());
System.out.println("Task " + task.getId() + " completed.");
}
}
}
通过以上步骤,你可以获取流程定义、启动流程实例、完成任务操作。
实战:Activiti应用案例实战需求分析
假设我们正在开发一个订单管理系统,该系统需要支持订单的创建、审核、支付、发货和完成等流程。为了实现这个需求,我们可以使用Activiti来定义和管理这些业务流程。
业务流程设计
在本例中,我们将设计一个订单处理流程,包括以下步骤:
- 创建订单:用户提交订单信息。
- 审核订单:管理员审核订单是否符合要求。
- 支付订单:用户支付订单。
- 发货订单:仓库发货。
- 完成订单:订单完成,可以查询订单状态。
代码实现步骤详解
步骤一:定义流程定义文件
首先,创建一个名为order.bpmn20.xml
的流程定义文件,定义订单处理流程。流程定义文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100301/BPMN20.xsd"
xmlns:activiti="http://activiti.org/bpmn"
id="Order_Process"
targetNamespace="http://www.activiti.org/bpmn">
<process id="Order_Process" name="Order Process" isExecutable="true">
<startEvent id="startEvent"></startEvent>
<userTask id="createOrder" name="Create Order"></userTask>
<userTask id="reviewOrder" name="Review Order"></userTask>
<userTask id="payOrder" name="Pay Order"></userTask>
<userTask id="shipOrder" name="Ship Order"></userTask>
<userTask id="completeOrder" name="Complete Order"></userTask>
<endEvent id="endEvent"></endEvent>
<sequenceFlow id="flow1" sourceRef="startEvent" targetRef="createOrder"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="createOrder" targetRef="reviewOrder"></sequenceFlow>
<sequenceFlow id="flow3" sourceRef="reviewOrder" targetRef="payOrder"></sequenceFlow>
<sequenceFlow id="flow4" sourceRef="payOrder" targetRef="shipOrder"></sequenceFlow>
<sequenceFlow id="flow5" sourceRef="shipOrder" targetRef="completeOrder"></sequenceFlow>
<sequenceFlow id="flow6" sourceRef="completeOrder" targetRef="endEvent"></sequenceFlow>
</process>
</definitions>
步骤二:部署流程定义
在Java代码中部署这个流程定义文件。
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
public class ActivitiExample {
public static void main(String[] args) {
// 初始化流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
// 部署流程定义
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("order.bpmn20.xml")
.deploy();
System.out.println("Deployment ID: " + deployment.getId());
}
}
步骤三:启动流程实例
启动一个订单处理流程实例。
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
public class ActivitiExample {
public static void main(String[] args) {
// 初始化流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
// 部署流程定义
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("order.bpmn20.xml")
.deploy();
// 启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceById(deployment.getId());
System.out.println("Process Instance ID: " + processInstance.getId());
}
}
步骤四:完成任务操作
完成各个任务的操作,例如审核订单、支付订单等。
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
public class ActivitiExample {
public static void main(String[] args) {
// 初始化流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
RuntimeService runtimeService = processEngine.getRuntimeService();
// 启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceById("Order_Process");
System.out.println("Process Instance ID: " + processInstance.getId());
// 查询任务
List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
for (Task task : tasks) {
System.out.println("Task ID: " + task.getId());
System.out.println("Task Name: " + task.getName());
// 完成任务
taskService.complete(task.getId());
System.out.println("Task " + task.getId() + " completed.");
}
}
}
步骤五:查询流程实例状态
查询订单流程实例的状态,例如订单是否已完成。
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
public class ActivitiExample {
public static void main(String[] args) {
// 初始化流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
// 启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceById("Order_Process");
System.out.println("Process Instance ID: " + processInstance.getId());
// 查询流程实例状态
ProcessInstance processInstanceInfo = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstance.getId())
.singleResult();
System.out.println("Process Instance Status: " + processInstanceInfo.toString());
}
}
通过以上步骤,我们已经成功地设计并实现了订单处理流程。你可以根据实际业务需求进一步扩展和优化这个流程。
总结通过本指南,你已经学习了Activiti的基本概念、环境搭建、流程设计和API使用,以及一个实际应用案例。Activiti作为一个强大的工作流和业务流程管理平台,可以帮助你更高效地管理和执行各种业务流程。希望你能够充分利用Activiti这一工具,提升你的项目开发效率和质量。如果你有任何问题或需要进一步的帮助,可以参考Activiti的官方文档或参与社区讨论。
共同学习,写下你的评论
评论加载中...
作者其他优质文章