本文详细介绍了Activiti实战中的新手入门与初级应用指南,涵盖了环境搭建、核心概念、API基础使用及实战案例等内容。通过学习,读者可以掌握Activiti的基本使用方法,为实际项目中的应用打下坚实基础。此外,文章还介绍了Activiti的监控与管理功能,帮助用户更好地管理和监控流程实例。
Activiti简介与环境搭建Activiti是什么
Activiti是一个开源的工作流和流程管理平台。它允许开发者使用业务流程模型,以一种标准的方式,定义和管理业务流程。Activiti为开发者提供了Java API,以便在应用程序中集成和使用流程功能。Activiti的主要目标是提供一个轻量级、可扩展的流程引擎,并且易于使用和集成。
Activiti的主要特点
- 轻量级:Activiti引擎是轻量级的,对应用的性能影响小。
- 易用性:Activiti使用简单,易于集成到各种应用中。
- 标准支持:Activiti支持BPMN 2.0标准,使得流程定义更加直观和易读。
- 扩展性:Activiti提供了丰富的API,便于开发者扩展其功能。
- 灵活性:Activiti支持动态流程定义,允许在运行时修改流程。
- 监控:Activiti提供了强大的监控功能,可以监控流程实例的状态、执行时间等信息。
开发环境搭建
要开始使用Activiti,你需要搭建一个开发环境。以下是搭建步骤:
-
环境准备
- 安装Java环境:Activiti需要Java环境,建议使用Java 8及以上版本。
- 安装数据库:Activiti需要一个数据库来存储流程定义和流程实例信息。推荐使用MySQL、PostgreSQL等关系型数据库。
- 下载Activiti依赖库:从Maven仓库中下载Activiti依赖库,或者直接在项目中添加Maven依赖。
-
配置数据库
- 在数据库中创建一个数据库实例,用于存储Activiti的数据。例如使用MySQL:
CREATE DATABASE activiti; USE activiti;
-
在数据库中创建表结构:
CREATE TABLE ACT_GE_PROPERTY ( NAME_ VARCHAR(255) NOT NULL, VALUE_ VARCHAR(255), REV_ INT, PRIMARY KEY (NAME_) ); CREATE TABLE ACT_RE_DEPLOYMENT ( ID_ VARCHAR(64) NOT NULL, NAME_ VARCHAR(255), TENANT_ID_ VARCHAR(255) DEFAULT '', DEPLOY_TIME_ TIMESTAMP, ENGINE_VERSION_ VARCHAR(255), PRIMARY KEY (ID_) ); -- 其他表的创建语句
- 在数据库中创建一个数据库实例,用于存储Activiti的数据。例如使用MySQL:
-
搭建Maven项目
- 创建一个新的Maven项目。
- 在
pom.xml
文件中添加Activiti依赖:<dependencies> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>6.0.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.27</version> </dependency> </dependencies>
- 配置数据库连接
- 在
src/main/resources
目录下创建activiti.cfg.xml
文件,配置数据库连接信息:<?xml version="1.0" encoding="UTF-8"?> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration"> <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti"/> <property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"/> <property name="jdbcUsername" value="root"/> <property name="jdbcPassword" value="password"/> <property name="databaseSchemaUpdate" value="true"/> </bean>
- 在
快速上手:第一个Activiti项目
要编写第一个Activiti项目,你需要创建一个简单的流程定义,并启动流程实例。下面是一个简单的示例:
-
创建流程定义
- 创建一个新的BPMN文件(例如
leave.bpmn
),并定义一个简单的请假流程。 - 使用BPMN工具(例如Activiti Modeler)定义流程,可以包含开始、用户任务、结束等元素。
- 保存流程定义文件到项目中。
- 创建一个新的BPMN文件(例如
- 启动流程实例
- 编写Java代码启动流程实例。
- 使用Activiti引擎查询流程实例的状态。
下面是一个简单的启动流程实例的代码示例:
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 ActivitiDemo {
public static void main(String[] args) {
// 创建Activiti引擎实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 部署流程定义
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("leave.bpmn")
.deploy();
// 获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave");
// 输出流程实例ID
System.out.println("流程实例ID: " + processInstance.getId());
}
}
Activiti核心概念详解
流程定义与流程实例
流程定义是一组定义好的流程步骤,通常以BPMN 2.0格式的XML文件表示。流程定义描述了不同的流程步骤、任务、网关等元素,每个元素都有特定的含义和行为。
流程实例是流程定义的一个具体执行实例。每个流程实例都有一个唯一的ID,可以跟踪其执行状态和历史记录。
流程图设计与BPMN规范
BPMN(Business Process Model and Notation)是一种标准的业务流程模型表示方法。Activiti支持BPMN 2.0规范。下面是一个简单的BPMN流程图设计示例:
-
流程图元素
- 开始事件:表示流程的开始。
- 用户任务:表示需要人工干预的任务,通常由用户执行。
- 流程结束:表示流程的结束。
- 网关:用于流程中的条件分支,可以是并行网关或排他网关。
- 设计流程图
- 使用BPMN工具(例如Activiti Modeler)设计流程图。
- 常见的流程图元素包括流程开始、用户任务、结束等。
- 保存流程图文件,通常为BPMN格式的XML文件。
下面是一个简单的BPMN流程图示例:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100801/BPMN21102"
xmlns:activiti="http://activiti.org/bpmn"
id="DefId"
targetNamespace="http://bpmn.io/schema/bpmn">
<process id="leave" name="请假流程" isExecutable="true">
<startEvent id="startEvent1" />
<userTask id="userTask1" name="提交请假请求" activiti:assignee="${assignee}" />
<sequenceFlow id="flow1" sourceRef="startEvent1" targetRef="userTask1" />
<userTask id="userTask2" name="审批请假请求" activiti:assignee="${approver}" />
<sequenceFlow id="flow2" sourceRef="userTask1" targetRef="userTask2" />
<endEvent id="endEvent1" />
<sequenceFlow id="flow3" sourceRef="userTask2" targetRef="endEvent1" />
</process>
</definitions>
任务与用户任务
任务是流程中的一个执行单元,可以是用户任务、服务任务、脚本任务等。用户任务表示需要人工干预的任务,通常由用户执行。
下面是一个简单的用户任务示例:
<userTask id="userTask1" name="提交请假请求" activiti:assignee="${assignee}" />
变量与流程变量
变量用于存储流程中的数据信息。流程变量是一种特殊的变量类型,可以在流程中传递和使用。变量可以定义为流程定义的一部分,也可以在运行时动态设置。
下面是一个简单的流程变量示例:
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
public class ActivitiDemo {
public static void main(String[] args) {
// 创建Activiti引擎实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 启动流程实例,设置流程变量
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave", "请假请求", "张三");
// 输出流程实例ID
System.out.println("流程实例ID: " + processInstance.getId());
}
}
Activiti API基础使用
创建流程定义
要创建一个流程定义,可以使用Activiti的RepositoryService来部署BPMN文件。下面是一个简单的创建流程定义的示例:
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
public class ActivitiDemo {
public static void main(String[] args) {
// 创建Activiti引擎实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 部署流程定义
repositoryService.createDeployment()
.addClasspathResource("leave.bpmn")
.deploy();
}
}
启动流程实例
要启动一个流程实例,可以使用Activiti的RuntimeService来启动流程实例。下面是一个简单的启动流程实例的示例:
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
public class ActivitiDemo {
public static void main(String[] args) {
// 创建Activiti引擎实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 启动流程实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave");
// 输出流程实例ID
System.out.println("流程实例ID: " + processInstance.getId());
}
}
完成任务操作
要完成一个任务,可以使用Activiti的TaskService来完成任务。下面是一个简单的完成任务的示例:
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.api.task.Task;
public class ActivitiDemo {
public static void main(String[] args) {
// 创建Activiti引擎实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取TaskService
TaskService taskService = processEngine.getTaskService();
// 查询任务
Task task = taskService.createTaskQuery()
.taskAssignee("张三")
.singleResult();
// 完成任务
taskService.complete(task.getId());
}
}
查询流程实例与历史记录
要查询流程实例和历史记录,可以使用Activiti的HistoryService和RuntimeService来查询。下面是一个简单的查询流程实例的示例:
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.HistoryService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.history.HistoricProcessInstance;
public class ActivitiDemo {
public static void main(String[] args) {
// 创建Activiti引擎实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取RuntimeService
org.activiti.engine.RuntimeService runtimeService = processEngine.getRuntimeService();
// 获取流程实例
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId("流程实例ID")
.singleResult();
// 输出流程实例信息
System.out.println("流程实例ID: " + processInstance.getId());
System.out.println("流程定义ID: " + processInstance.getProcessDefinitionId());
// 获取HistoryService
HistoryService historyService = processEngine.getHistoryService();
// 获取历史流程实例
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId("流程实例ID")
.singleResult();
// 输出历史流程实例信息
System.out.println("历史流程实例ID: " + historicProcessInstance.getId());
}
}
实战案例:请假流程自动化
需求分析
创建一个简单的请假流程自动化案例,需求如下:
- 用户提交请假请求。
- 管理员审批请假请求。
- 审批通过后,通知用户。
设计流程图
设计一个简单的请假流程图,包含以下元素:
- 开始事件
- 用户任务(提交请假请求)
- 用户任务(审批请假请求)
- 流程结束
下面是一个简单的请假流程图示例:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100801/BPMN21102"
xmlns:activiti="http://activiti.org/bpmn"
id="DefId"
targetNamespace="http://bpmn.io/schema/bpmn">
<process id="leave" name="请假流程" isExecutable="true">
<startEvent id="startEvent1" />
<userTask id="userTask1" name="提交请假请求" activiti:assignee="${assignee}" />
<sequenceFlow id="flow1" sourceRef="startEvent1" targetRef="userTask1" />
<userTask id="userTask2" name="审批请假请求" activiti:assignee="${approver}" />
<sequenceFlow id="flow2" sourceRef="userTask1" targetRef="userTask2" />
<endEvent id="endEvent1" />
<sequenceFlow id="flow3" sourceRef="userTask2" targetRef="endEvent1" />
</process>
</definitions>
编写Java代码实现
编写Java代码实现请假流程自动化,包括启动流程实例和完成任务的操作。
-
启动流程实例
- 使用Activiti的RuntimeService启动流程实例。
- 设置流程变量,例如请假请求的内容和提交人的信息。
- 启动流程实例后,等待用户任务的完成。
- 完成任务
- 使用Activiti的TaskService完成任务。
- 设置任务的完成者信息。
下面是一个简单的Java代码示例:
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.api.task.Task;
public class LeaveProcessDemo {
public static void main(String[] args) {
// 创建Activiti引擎实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 启动流程实例,设置流程变量
runtimeService.startProcessInstanceByKey("leave", "请假请求", "张三");
// 获取TaskService
TaskService taskService = processEngine.getTaskService();
// 查询任务
Task task = taskService.createTaskQuery()
.taskAssignee("张三")
.singleResult();
// 打印任务信息
System.out.println("任务ID: " + task.getId());
System.out.println("任务名称: " + task.getName());
// 完成任务
taskService.complete(task.getId());
// 查询下一个任务
Task nextTask = taskService.createTaskQuery()
.taskAssignee("管理员")
.singleResult();
System.out.println("下一个任务ID: " + nextTask.getId());
System.out.println("下一个任务名称: " + nextTask.getName());
// 完成下一个任务
taskService.complete(nextTask.getId());
}
}
测试与调试
测试和调试流程自动化案例,确保流程能够正常执行:
- 运行Java代码,启动流程实例。
- 检查任务是否正确分配给指定的用户。
- 完成任务后,检查流程是否正常结束。
监控平台介绍
Activiti提供了监控平台,用于监控流程实例的状态、执行时间等信息。监控平台可以集成到现有的应用中,也可以作为独立的监控系统使用。
监控平台提供了以下功能:
- 流程实例监控:查看流程实例的状态、执行时间等信息。
- 任务监控:查看任务的分配情况、执行时间等信息。
- 审计:查看流程的历史执行记录和日志信息。
使用监控平台查看流程实例
使用监控平台查看流程实例的状态和执行时间。监控平台提供了详细的监控信息,包括流程实例的ID、状态、开始时间、结束时间等。
使用监控平台进行任务分配
监控平台可以查看任务的分配情况,包括任务的执行者、任务的状态等信息。可以使用监控平台进行任务的重新分配。
日志与审计信息查看
监控平台提供了日志和审计信息查看功能,可以查看流程的历史执行记录和日志信息。这些信息对于调试和维护流程非常有用。
常见问题与解决方案常见错误及解决方法
- 流程定义部署失败:检查流程定义文件的格式是否正确,确保文件路径正确。
- 启动流程实例失败:检查流程定义是否正确部署,确保流程定义文件存在。
- 任务完成失败:检查任务是否正确分配,确保任务的执行者存在。
性能优化技巧
- 使用缓存:使用缓存可以提高性能,减少数据库访问次数。
- 优化查询:优化查询语句,减少查询时间。
- 使用批量操作:使用批量操作可以减少数据库访问次数。
与其他系统的集成
- 与其他系统的集成:可以使用Activiti的API与其他系统进行集成,例如使用Activiti的API启动流程实例,完成任务等。
- 使用消息队列:使用消息队列可以实现异步处理,提高系统的响应速度。
源码阅读推荐
- 源码阅读推荐:推荐阅读Activiti的源码,了解Activiti的工作原理和实现细节。可以从Activiti的GitHub仓库下载源码,开始阅读。
本文介绍了Activiti的入门知识和初级应用指南,包括Activiti的核心概念、API基础使用、实战案例、监控与管理等。通过本文的学习,读者可以掌握Activiti的基本使用方法,为实际项目中的应用打下基础。