Activiti是一款基于BPMN 2.0标准的开源工作流引擎,它提供了灵活的流程定义和执行功能。本文将详细介绍Activiti的主要特点、应用场景、环境搭建、流程定义及API基础,并通过一个简单的请假流程示例进行实战演练。文中还将介绍如何排查和解决常见问题,以及调试技巧和日志解析。 Activiti资料涵盖了从环境搭建到流程定义的全过程。
Activiti简介Activiti是一款开源的工作流和流程管理框架,它提供了灵活的流程定义和执行功能。Activiti采用了BPMN 2.0标准,允许开发者定义复杂的业务流程,并通过Java API或REST API执行这些流程。以下是Activiti的主要特征和优势,以及它的应用场景。
Activiti是什么
Activiti是一款基于BPMN 2.0标准的工作流引擎。它可以嵌入到任何Java应用程序中,用于定义、执行和管理业务流程。Activiti的核心部分是流程引擎,它负责解析流程定义、处理流程事件和状态管理等。
Activiti的主要特点和优势
- 轻量级:Activiti的设计非常轻巧,启动速度快,内存占用小,非常适合在云计算环境中部署。
- 支持BPMN 2.0:Activiti支持完整的BPMN 2.0标准,使得业务流程定义更加一致和标准化。
- 灵活的流程定义:通过流程定义语言(BPMN 2.0),用户可以定义复杂的流程,包括分支流程、并行任务和循环等。
- 高效的执行引擎:Activiti的执行引擎被设计为高度可扩展,可以处理大量的并发流程实例。
- 丰富的API:Activiti提供了强大的Java API和REST API,使得流程定义和执行更加灵活。
- 易于集成:Activiti可以很容易地集成到现有的应用程序中,支持多种消息队列和数据库。
Activiti的应用场景
Activiti适用于需要定义和执行复杂业务流程的场景。以下是一些常见的应用场景:
- 审批流程:部门审批、请假审批、报销审批等。
- 订单处理流程:订单创建、审核、发货、退款等。
- 人力资源管理:招聘流程、绩效评估、员工离职流程等。
- 项目管理:项目启动、任务分配、进度跟踪、项目结束等。
为了开始使用Activiti,您需要搭建开发环境,安装必要的工具,并部署测试环境。以下是如何一步步完成这些步骤。
开发环境搭建
首先,需要搭建Java开发环境。Activiti是基于Java开发的,因此,您需要安装JDK和Eclipse或IntelliJ IDEA等Java IDE。
# 下载并安装最新版本的JDK(例如JDK 11)
sudo apt update
sudo apt install openjdk-11-jdk
# 配置环境变量
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
# 验证安装
java -version
安装完JDK后,安装Eclipse IDE:
# 下载Eclipse IDE
wget https://www.eclipse.org/downloads/download.php?file=/oomph/epp/2020-09/R/eclipse-jee-2020-09-R-linux-gtk-x86_64.tar.gz
# 解压并启动Eclipse
tar -xzf eclipse-jee-2020-09-R-linux-gtk-x86_64.tar.gz
cd eclipse
./eclipse
工具安装与配置
安装和配置Activiti引擎及依赖库。Activiti依赖于一些核心库,如Spring框架、MyBatis和H2数据库等。
- 创建Maven项目
使用Maven管理项目的依赖库,创建一个新的Maven项目:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>ActivitiDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
</dependencies>
</project>
- 配置数据库
Activiti支持多种数据库,这里使用H2内存数据库。在src/main/resources
目录下创建activiti.cfg.xml
文件,配置数据库连接:
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
<property name="transactionFactoryClassName" value="org.activiti.engine.impl.tx.SpringTransactionFactory" />
<property name="databaseSchemaUpdate" value="true" />
<property name="jobExecutorActivate" value="true" />
<property name="databaseType" value="h2" />
<property name="databaseSchemaUpdate" value="true" />
<property name="history" value="audit" />
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:mem:activitiDB;DB_CLOSE_DELAY=-1" />
<property name="username" value="sa" />
<property name="password" value="" />
</bean>
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
- 启动Activiti引擎
编写启动Activiti引擎的Java代码:
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ActivitiSetup {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("activiti.cfg.xml");
ProcessEngineFactoryBean factoryBean = context.getBean(ProcessEngineFactoryBean.class);
ProcessEngine processEngine = factoryBean.getObject();
System.out.println("Process Engine Initialized: " + processEngine);
}
}
测试环境部署与验证
启动应用程序并验证Activiti引擎是否成功初始化。
# 编译并运行
mvn clean install
java -cp target/ActivitiDemo-1.0-SNAPSHOT.jar com.example.ActivitiSetup
如果输出显示“Process Engine Initialized”,则表示Activiti引擎已成功启动。
Activiti流程定义流程定义是Activiti的核心部分,它使用BPMN 2.0标准来定义业务流程。本节将介绍如何定义流程,包括使用Activiti Designer工具创建流程图。
流程定义语言BPMN介绍
BPMN(Business Process Model and Notation)是业务流程建模与表示的国际标准,它提供了一套丰富的图示符号来定义业务流程。Activiti支持完整的BPMN 2.0标准,可以创建复杂的流程图。
基本流程元素和概念
BPMN包含多种流程元素,用于定义不同的流程行为。以下是一些基本的流程元素:
- 开始事件(Start Event):表示流程的开始,可以是一个简单的开始或一个定时事件。
- 任务(Task):表示一个具体的业务任务,可以是手动任务或自动化任务。
- 网关(Gateway):用于流程的分支和合并。包括排他网关(Exclusive Gateway)、并行网关(Parallel Gateway)和复杂网关等。
- 结束事件(End Event):表示流程的结束,可以是一个简单的结束或一个错误结束。
使用Activiti Designer创建流程图
Activiti Designer是官方提供的一个图形化工具,用于创建和编辑BPMN流程图。它支持导入和导出BPMN XML文件。
- 安装Activiti Designer
下载并安装Activiti Designer,可以从官方网站获取安装包。
- 创建流程图
启动Activiti Designer,使用工具栏上的图标创建流程图。例如,创建一个简单的请假流程:
- 添加一个开始事件
- 添加一个任务节点,表示经理审批
- 添加一个排他网关,表示审批通过或拒绝
- 添加一个结束事件
完成流程图后,保存为BPMN XML文件。例如:leaveProcess.bpmn20.xml
。
Activiti的API提供了强大的功能,用于创建、部署和管理流程实例。本节将介绍Activiti引擎的基本用法,包括如何创建和启动流程实例。
Activiti引擎介绍
Activiti引擎是Activiti的核心组成部分,负责处理流程实例的生命周期。引擎通过一系列的API提供对流程定义、流程实例和任务的操作。
创建、部署与启动流程实例
流程定义文件(如BPMN XML文件)需要先被部署到Activiti引擎中,然后才能启动流程实例。
- 部署流程定义
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
public class DeploymentExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngineFactoryBean.getObject();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("leaveProcess.bpmn20.xml")
.deploy();
System.out.println("Deployment ID: " + deployment.getId());
}
}
- 启动流程实例
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
public class StartProcessInstanceExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngineFactoryBean.getObject();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess");
System.out.println("Process Instance ID: " + processInstance.getId());
}
}
查询和管理流程实例
Activiti提供了丰富的API用于查询和管理流程实例。例如,查询正在运行的流程实例、查询历史流程实例及完成任务等。
- 查询流程实例
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
public class QueryProcessInstanceExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngineFactoryBean.getObject();
RuntimeService runtimeService = processEngine.getRuntimeService();
List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery()
.list();
for (ProcessInstance processInstance : processInstances) {
System.out.println("Process Instance ID: " + processInstance.getId());
}
}
}
- 完成任务
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
public class CompleteTaskExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngineFactoryBean.getObject();
TaskService taskService = processEngine.getTaskService();
String taskId = "12345"; // 假设任务ID为12345
taskService.complete(taskId);
System.out.println("Task " + taskId + " completed.");
}
}
实战案例:简单请假流程
本节通过一个简单的请假流程示例,介绍如何使用Activiti定义流程、启动流程实例并跟踪任务状态。
定义请假流程
首先,定义一个简单的BPMN流程图,描述请假流程。假设该流程包括经理审批和人力资源审核两个步骤。
- 流程定义文件(leaveProcess.bpmn20.xml)
<definitions xmlns="http://www.omg.org/spec/BPMN/20100801/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100801/MODEL BPMN20.xsd" id="leaveProcess" targetNamespace="http://bpmn.io/schema/bpmn">
<process id="leaveProcess" isExecutable="true">
<startEvent id="startEvent"></startEvent>
<sequenceFlow id="flow1" sourceRef="startEvent" targetRef="managerTask"></sequenceFlow>
<userTask id="managerTask" name="Manager Approval"></userTask>
<sequenceFlow id="flow2" sourceRef="managerTask" targetRef="hrTask"></sequenceFlow>
<userTask id="hrTask" name="HR Approval"></userTask>
<sequenceFlow id="flow3" sourceRef="hrTask" targetRef="endEvent"></sequenceFlow>
<endEvent id="endEvent"></endEvent>
</process>
</definitions>
- 部署流程定义
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
public class DeploymentExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngineFactoryBean.getObject();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("leaveProcess.bpmn20.xml")
.deploy();
System.out.println("Deployment ID: " + deployment.getId());
}
}
- 启动流程实例
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
public class StartProcessInstanceExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngineFactoryBean.getObject();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess");
System.out.println("Process Instance ID: " + processInstance.getId());
}
}
使用Activiti API实现自动审批
接下来,实现自动审批逻辑。假设经理和人力资源审核通过后,流程会自动结束。
- 完成经理审批任务
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
public class CompleteManagerTaskExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngineFactoryBean.getObject();
TaskService taskService = processEngine.getTaskService();
String taskId = "managerTaskId"; // 假设任务ID为managerTaskId
taskService.complete(taskId);
System.out.println("Manager Task " + taskId + " completed.");
}
}
- 完成HR审批任务
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
public class CompleteHRTaskExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngineFactoryBean.getObject();
TaskService taskService = processEngine.getTaskService();
String taskId = "hrTaskId"; // 假设任务ID为hrTaskId
taskService.complete(taskId);
System.out.println("HR Task " + taskId + " completed.");
}
}
显示流程图并跟踪任务状态
最后,实现功能以显示流程图并跟踪任务状态。这部分可以通过UI界面实现,也可以通过Activiti提供的API查询任务状态。
- 显示流程图
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;
public class DisplayProcessDiagramExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngineFactoryBean.getObject();
RepositoryService repositoryService = processEngine.getRepositoryService();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("leaveProcess")
.latestVersion()
.singleResult();
byte[] diagramBytes = repositoryService.getProcessDiagram(processDefinition.getId());
// 将字节数据保存为文件
FileOutputStream fos = new FileOutputStream("leaveProcessDiagram.png");
fos.write(diagramBytes);
fos.close();
System.out.println("Process diagram saved to leaveProcessDiagram.png");
}
}
- 跟踪任务状态
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
public class TrackTaskStatusExample {
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngineFactoryBean.getObject();
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery()
.list();
for (Task task : tasks) {
System.out.println("Task ID: " + task.getId() + ", Task Name: " + task.getName());
}
}
}
问题排查与调试
在使用Activiti开发流程应用时,可能会遇到各种问题。本节将介绍如何排查和解决常见问题,以及调试技巧和日志解析。
常见问题及解决方法
- 流程定义错误
确保流程定义文件(如BPMN XML文件)正确无误。使用Activiti Designer工具打开并验证流程图。
- 数据库连接问题
检查数据库连接配置,确保数据库服务正常运行。
- 流程执行失败
查看Activiti引擎的日志,找到失败原因。可能是因为任务长时间未完成或流程定义中的错误。
调试技巧与日志解析
- 启用日志
在activiti.cfg.xml
文件中启用详细的日志记录:
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
<property name="transactionFactoryClassName" value="org.activiti.engine.impl.tx.SpringTransactionFactory" />
<property name="databaseSchemaUpdate" value="true" />
<property name="jobExecutorActivate" value="true" />
<property name="databaseType" value="h2" />
<property name="databaseSchemaUpdate" value="true" />
<property name="history" value="audit" />
<property name="activityInstanceRecorders">
<list>
<ref bean="newActivitiRecorder" />
</list>
</property>
<property name="taskEventDispatcher" ref="taskEventDispatcher" />
</bean>
<bean id="taskEventDispatcher" class="org.activiti.spring.TaskEventDispatcher">
<property name="eventListeners">
<list>
<bean class="org.activiti.engine.impl.bpmn.event.DefaultTaskEventListener" />
</list>
</property>
</bean>
<bean id="newActivitiRecorder" class="org.activiti.engine.impl.persistence.entity.NewActivitiRecorder" />
- 查看日志文件
Activiti引擎的日志文件通常保存在activiti.log
文件中。查看日志文件以找到错误信息。
- 使用Activiti Explorer
Activiti Explorer是一个基于Web的流程管理工具,可以用来监控和管理流程实例。访问http://localhost:8080/activiti-explorer
,查看流程实例的详细信息。
案例分析:编译错误与运行时异常
- 编译错误
确保所有依赖库已正确配置。检查pom.xml
文件中的依赖项,确保所有必要的库都已添加。
- 运行时异常
如果运行时抛出异常,查看异常堆栈跟踪以找到错误原因。常见的运行时异常包括数据库连接错误、流程定义错误和任务执行错误。
例如,如果遇到数据库连接错误,检查数据库连接配置和数据库服务状态。
如果流程定义错误,使用Activiti Designer工具打开流程定义文件并验证流程图。
如果任务执行错误,查看Activiti引擎的日志文件,找到失败原因并进行修复。
通过以上步骤,您可以顺利地搭建和使用Activiti环境,定义和执行业务流程。希望本文能帮助您更好地理解和使用Activiti工作流引擎。
共同学习,写下你的评论
评论加载中...
作者其他优质文章