为了账号安全,请及时绑定邮箱和手机立即绑定

Activiti资料入门教程:轻松掌握流程管理

标签:
杂七杂八
概述

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的主要特点和优势

  1. 轻量级:Activiti的设计非常轻巧,启动速度快,内存占用小,非常适合在云计算环境中部署。
  2. 支持BPMN 2.0:Activiti支持完整的BPMN 2.0标准,使得业务流程定义更加一致和标准化。
  3. 灵活的流程定义:通过流程定义语言(BPMN 2.0),用户可以定义复杂的流程,包括分支流程、并行任务和循环等。
  4. 高效的执行引擎:Activiti的执行引擎被设计为高度可扩展,可以处理大量的并发流程实例。
  5. 丰富的API:Activiti提供了强大的Java API和REST API,使得流程定义和执行更加灵活。
  6. 易于集成:Activiti可以很容易地集成到现有的应用程序中,支持多种消息队列和数据库。

Activiti的应用场景

Activiti适用于需要定义和执行复杂业务流程的场景。以下是一些常见的应用场景:

  1. 审批流程:部门审批、请假审批、报销审批等。
  2. 订单处理流程:订单创建、审核、发货、退款等。
  3. 人力资源管理:招聘流程、绩效评估、员工离职流程等。
  4. 项目管理:项目启动、任务分配、进度跟踪、项目结束等。
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数据库等。

  1. 创建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>
  1. 配置数据库

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>
  1. 启动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包含多种流程元素,用于定义不同的流程行为。以下是一些基本的流程元素:

  1. 开始事件(Start Event):表示流程的开始,可以是一个简单的开始或一个定时事件。
  2. 任务(Task):表示一个具体的业务任务,可以是手动任务或自动化任务。
  3. 网关(Gateway):用于流程的分支和合并。包括排他网关(Exclusive Gateway)、并行网关(Parallel Gateway)和复杂网关等。
  4. 结束事件(End Event):表示流程的结束,可以是一个简单的结束或一个错误结束。

使用Activiti Designer创建流程图

Activiti Designer是官方提供的一个图形化工具,用于创建和编辑BPMN流程图。它支持导入和导出BPMN XML文件。

  1. 安装Activiti Designer

下载并安装Activiti Designer,可以从官方网站获取安装包。

  1. 创建流程图

启动Activiti Designer,使用工具栏上的图标创建流程图。例如,创建一个简单的请假流程:

  • 添加一个开始事件
  • 添加一个任务节点,表示经理审批
  • 添加一个排他网关,表示审批通过或拒绝
  • 添加一个结束事件

完成流程图后,保存为BPMN XML文件。例如:leaveProcess.bpmn20.xml

Activiti API基础

Activiti的API提供了强大的功能,用于创建、部署和管理流程实例。本节将介绍Activiti引擎的基本用法,包括如何创建和启动流程实例。

Activiti引擎介绍

Activiti引擎是Activiti的核心组成部分,负责处理流程实例的生命周期。引擎通过一系列的API提供对流程定义、流程实例和任务的操作。

创建、部署与启动流程实例

流程定义文件(如BPMN XML文件)需要先被部署到Activiti引擎中,然后才能启动流程实例。

  1. 部署流程定义
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());
    }
}
  1. 启动流程实例
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用于查询和管理流程实例。例如,查询正在运行的流程实例、查询历史流程实例及完成任务等。

  1. 查询流程实例
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());
        }
    }
}
  1. 完成任务
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流程图,描述请假流程。假设该流程包括经理审批和人力资源审核两个步骤。

  1. 流程定义文件(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>
  1. 部署流程定义
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());
    }
}
  1. 启动流程实例
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实现自动审批

接下来,实现自动审批逻辑。假设经理和人力资源审核通过后,流程会自动结束。

  1. 完成经理审批任务
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.");
    }
}
  1. 完成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查询任务状态。

  1. 显示流程图
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");
    }
}
  1. 跟踪任务状态
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开发流程应用时,可能会遇到各种问题。本节将介绍如何排查和解决常见问题,以及调试技巧和日志解析。

常见问题及解决方法

  1. 流程定义错误

确保流程定义文件(如BPMN XML文件)正确无误。使用Activiti Designer工具打开并验证流程图。

  1. 数据库连接问题

检查数据库连接配置,确保数据库服务正常运行。

  1. 流程执行失败

查看Activiti引擎的日志,找到失败原因。可能是因为任务长时间未完成或流程定义中的错误。

调试技巧与日志解析

  1. 启用日志

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" />
  1. 查看日志文件

Activiti引擎的日志文件通常保存在activiti.log文件中。查看日志文件以找到错误信息。

  1. 使用Activiti Explorer

Activiti Explorer是一个基于Web的流程管理工具,可以用来监控和管理流程实例。访问http://localhost:8080/activiti-explorer,查看流程实例的详细信息。

案例分析:编译错误与运行时异常

  1. 编译错误

确保所有依赖库已正确配置。检查pom.xml文件中的依赖项,确保所有必要的库都已添加。

  1. 运行时异常

如果运行时抛出异常,查看异常堆栈跟踪以找到错误原因。常见的运行时异常包括数据库连接错误、流程定义错误和任务执行错误。

例如,如果遇到数据库连接错误,检查数据库连接配置和数据库服务状态。

如果流程定义错误,使用Activiti Designer工具打开流程定义文件并验证流程图。

如果任务执行错误,查看Activiti引擎的日志文件,找到失败原因并进行修复。

通过以上步骤,您可以顺利地搭建和使用Activiti环境,定义和执行业务流程。希望本文能帮助您更好地理解和使用Activiti工作流引擎。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消