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

Activiti入门指南:轻松掌握工作流管理

标签:
Java
概述

Activiti是Apache基金会的顶级项目之一,它是一个轻量级的工作流和业务流程管理平台,支持BPMN 2.0标准,能够轻松地将业务流程嵌入到应用中。Activiti具有轻量级、高性能和高可用性等特点,适用于审批流程、订单处理、人力资源管理等多种业务场景。

Activiti介绍

Activiti是什么

Activiti是Apache基金会的顶级项目之一,它是一个轻量级的工作流和业务流程管理平台。Activiti提供了强大的流程定义能力,支持BPMN 2.0标准,可以轻松地将业务流程嵌入到应用中。Activiti的核心是通过流程定义文件(通常是BPMN 2.0 XML文件)来描述流程,然后使用Java API来运行和管理这些流程。

Activiti的特点和优势

Activiti具有以下特点和优势:

  1. 轻量级:Activiti架构简单,不需要复杂的配置和依赖,非常容易集成到现有的应用中。
  2. 高性能:Activiti采用了轻量级的设计,使其更加高效,能够支持高并发的业务场景。
  3. 高可用性:Activiti支持外部数据库存储,可以方便地实现数据持久化和集群部署,从而提高系统的可用性和可靠性。
  4. 开放源代码:Activiti是一个开源项目,社区支持活跃,用户可以自由地使用、修改和分发。
  5. 易用性:Activiti提供了丰富的API和工具,使得流程定义、部署和执行都非常容易。

Activiti的应用场景

Activiti可以应用于各种业务场景中,如:

  1. 审批流程:例如请假审批、报销审批等。
  2. 订单处理流程:从订单创建到订单交付的全过程。
  3. 人力资源管理:从招聘、入职、培训到离职的全流程管理。
  4. 供应链管理:订单处理、物流配送、库存管理等。
  5. 生产流程管理:从原材料采购到成品产出的生产流程。
Activiti环境搭建

快速安装Activiti

Activiti可以运行在Java应用程序中,通常需要以下步骤进行安装:

  1. 下载Activiti:你可以从Apache官网下载最新的Activiti发行版,或者通过Maven仓库直接添加依赖。
  2. 添加依赖:如果你使用Maven或者Gradle等构建工具,可以在pom.xmlbuild.gradle文件中添加Activiti依赖。例如,在Maven中添加如下依赖:

    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-engine</artifactId>
        <version>6.0.0</version>
    </dependency>
  3. 配置数据库:Activiti可以通过多种数据库进行数据持久化,例如MySQL、Oracle等。你需要配置数据库连接信息,并创建相应的数据库表。

    准备数据库表的SQL脚本可以在activiti-standalone-6.0.0\examples\mysql\create\目录下找到。

Activiti环境配置

为了更好地使用Activiti,你需要配置一些重要的环境设置:

  1. 配置数据库连接:编辑ACTIVITI_PROPERTIES文件中的数据库连接信息,确保Activiti能够正确连接到你的数据库。

    # Database configuration
    db.url=jdbc:mysql://localhost:3306/activiti
    db.username=root
    db.password=password
    db.driver=com.mysql.jdbc.Driver
  2. 配置流程引擎:在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的流程定义文件,并且已经配置好数据库连接。

  1. 创建流程定义文件:在项目的类路径中创建一个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>
  2. 部署流程定义:在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());
        }
    }
  3. 启动流程实例:在部署流程定义后,你可以启动一个流程实例。

    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:

  1. 访问Activiti Designer:访问Activiti Designer网站,打开流程设计器。
  2. 创建流程图:在流程设计器中,你可以拖拽和放置各种流程元素,例如用户任务、服务任务、流转事件等。
  3. 保存流程定义:完成流程设计后,可以将流程定义导出为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来定义和管理这些业务流程。

业务流程设计

在本例中,我们将设计一个订单处理流程,包括以下步骤:

  1. 创建订单:用户提交订单信息。
  2. 审核订单:管理员审核订单是否符合要求。
  3. 支付订单:用户支付订单。
  4. 发货订单:仓库发货。
  5. 完成订单:订单完成,可以查询订单状态。

代码实现步骤详解

步骤一:定义流程定义文件

首先,创建一个名为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的官方文档或参与社区讨论。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消