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

Activiti入门教程:轻松掌握流程引擎基础

标签:
Java
概述

Activiti是一个开源的工作流程和流程引擎,基于BPMN 2.0标准,提供了一套完整的工具来设计、执行和管理工作流程。它具备轻量级、灵活且易于集成的特点,适用于各种业务流程自动化、任务分配与协作场景。文章详细介绍了Activiti的安装配置、流程定义与设计、流程实例与任务管理等内容。

Activiti简介

Activiti定义与基本概念

Activiti是一个开源的工作流程和流程引擎,基于BPMN 2.0标准,提供了一套完整的工具来设计、执行和管理工作流程。它可以被嵌入到任何Java应用程序中,用来管理业务流程、任务分配、工作流自动化等。Activiti的核心优势在于其轻量级、灵活且易于集成的特点,能够快速地与现有的应用结合,简化业务流程的管理。

Activiti的主要特点和优势

  • 轻量级与高性能:Activiti使用轻量级的设计,旨在提供低延迟和高性能。它的内存占用小,启动和执行速度快。
  • 灵活性与可扩展性:Activiti使用Java API,可以轻松地与现有应用程序集成,并且提供了服务任务、脚本任务等丰富功能,满足各种不同的业务需求。
  • 易用性:Activiti提供了简单的API,便于开发人员快速上手。它可以与大多数主流的数据库和框架集成,降低了开发和维护成本。
  • 强大的功能集:Activiti支持流程建模、流程模拟、流程执行、流程监控等一系列功能,可以帮助企业实现高效的业务流程管理。

Activiti的应用场景

  • 业务流程自动化:通过定义业务流程,实现自动化处理,如请假申请、报销审批等。
  • 任务分配与协作:通过流程引擎可以清晰地划分任务,分配给不同的用户或部门,提高协作效率。
  • 流程监控与优化:通过监控工具可以实时查看流程执行状态,发现问题并及时优化改进。
  • 多平台支持:Activiti支持在多种平台和环境上运行,包括Web应用、桌面应用、移动应用等。
安装与配置

开发环境搭建

为了开始使用Activiti,首先需要搭建一个Java开发环境。推荐使用IDE,如Eclipse、IntelliJ IDEA等。安装完成后,配置Java开发环境。

安装步骤

  1. 安装Java Development Kit (JDK):确保安装了Java 8及以上版本。
  2. 安装IDE:选择你喜欢的IDE,如Eclipse或IntelliJ IDEA,并根据IDE的文档进行安装。

配置步骤

  1. 配置环境变量:设置JAVA_HOMEPATH等环境变量。
  2. 安装Maven:Activiti项目的构建可以使用Maven进行管理。下载并安装Maven,设置其环境变量。
export MAVEN_HOME=/path/to/maven
export PATH=$PATH:$MAVEN_HOME/bin

Activiti项目环境配置

  1. 创建一个新的Maven项目
    使用IDE创建一个新的Maven项目,设置项目名称和组ID。

  2. 添加依赖
    pom.xml文件中添加Activiti的依赖。
<dependencies>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-engine</artifactId>
        <version>5.22.0</version>
    </dependency>
    <dependency>
        <groupId>org.hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <version>2.5.1</version>
    </dependency>
</dependencies>
  1. 配置数据库
    Activiti可以与多种数据库集成,这里使用HSQLDB作为内嵌数据库。在pom.xml中添加HSQLDB依赖,并配置application.properties文件。
# application.properties
activiti.database=org.hsqldb.jdbcDriver
activiti.database.url=jdbc:hsqldb:mem:activiti
activiti.database.username=sa
activiti.database.password=

第一个Activiti应用程序

创建一个简单的Activiti应用程序,演示如何启动Activiti引擎并部署一个简单的流程定义。

创建流程定义

  1. 创建BPMN文件:创建一个名为leaveRequest.bpmn的BPMN文件,定义一个简单的请假流程。
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100301/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100301/MODEL http://www.omg.org/spec/BPMN/20100301/MODEL/BPMN20.xsd" id="Definitions_1">
  <process id="leaveRequest" name="Leave Request Process" isExecutable="true">
    <startEvent id="startEvent" />
    <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="task1" />
    <userTask id="task1" name="Submit Leave Request" />
    <sequenceFlow id="flow2" sourceRef="task1" targetRef="endEvent" />
    <endEvent id="endEvent" />
  </process>
</definitions>
  1. 启动Activiti引擎
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineFactory;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;

public class ActivitiFirstApp {
    public static void main(String[] args) {
        ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createStandaloneInMemory();
        ProcessEngine processEngine = cfg.buildProcessEngine();

        RepositoryService repositoryService = processEngine.getRepositoryService();

        Deployment deployment = repositoryService.createDeployment()
            .addClasspathResource("leaveRequest.bpmn")
            .deploy();

        System.out.println("Deployment ID: " + deployment.getId());
    }
}

通过以上步骤,你已经成功搭建了开发环境并启动了Activiti引擎,部署了一个简单的请假流程定义。

流程定义与设计

BPMN 2.0流程设计简介

BPMN (Business Process Model and Notation) 是一种业务流程建模语言,用于描述业务流程中的活动、流程和任务。BPMN 2.0是其最新版本,提供了更加丰富和复杂的流程模型。流程图由节点(如开始节点、结束节点、任务节点等)、流程线(连接节点的线)及属性(定义节点行为和流程控制)组成。

创建和部署流程定义

创建一个简单的请假流程定义。

创建BPMN文件

  1. 定义开始节点:使用startEvent节点表示流程的开始。
  2. 定义用户任务:使用userTask节点表示待处理的任务。
  3. 定义结束节点:使用endEvent节点表示流程的结束。
  4. 定义流程线:使用sequenceFlow节点连接各个节点,定义流程的执行顺序。
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100301/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100301/MODEL http://www.omg.org/spec/BPMN/20100301/MODEL/BPMN20.xsd" id="Definitions_1">
  <process id="leaveRequest" name="Leave Request Process" isExecutable="true">
    <startEvent id="startEvent" />
    <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="task1" />
    <userTask id="task1" name="Submit Leave Request" />
    <sequenceFlow id="flow2" sourceRef="task1" targetRef="endEvent" />
    <endEvent id="endEvent" />
  </process>
</definitions>

部署流程定义

在Java代码中部署流程定义。

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineFactory;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;

public class ActivitiFirstApp {
    public static void main(String[] args) {
        ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createStandaloneInMemory();
        ProcessEngine processEngine = cfg.buildProcessEngine();

        RepositoryService repositoryService = processEngine.getRepositoryService();

        Deployment deployment = repositoryService.createDeployment()
            .addClasspathResource("leaveRequest.bpmn")
            .deploy();

        System.out.println("Deployment ID: " + deployment.getId());
    }
}

流程变量与任务

流程变量在流程执行过程中用于传递数据,可以是各种类型(如字符串、整数、对象等)。任务可以由用户、服务或其他流程节点触发,用于执行特定的操作。

定义流程变量

在BPMN文件中,可以在任务节点中定义流程变量。

<userTask id="task1" name="Submit Leave Request">
  <extensionElements>
    <activiti:formProperty id="duration" name="Duration" type="string" required="true" />
  </extensionElements>
</userTask>

通过API设置流程变量

在Java代码中设置流程变量。

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;

public class SetProcessVariablesExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveRequest");
        runtimeService.setVariable(processInstance.getId(), "duration", "1 week");

        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.task.Task;

public class TaskManagementExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();

        // 查询任务
        Task task = taskService.createTaskQuery().taskName("Submit Leave Request").singleResult();
        System.out.println("Task ID: " + task.getId());

        // 完成任务
        taskService.complete(task.getId());
    }
}
流程实例与任务管理

创建流程实例

流程实例是流程定义的具体实例化形式,表示一个具体的业务流程执行过程。创建流程实例,通常需要指定流程变量。

创建流程实例

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;

public class CreateProcessInstanceExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveRequest", "1001");
        System.out.println("Process Instance ID: " + processInstance.getId());
    }
}

任务的管理与查询

任务是流程实例中的具体操作。通过任务管理API,可以执行任务的创建、查询、更新和完成等操作。

查询任务

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;

public class QueryTaskExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();

        Task task = taskService.createTaskQuery().taskName("Submit Leave Request").singleResult();
        System.out.println("Task ID: " + task.getId());
    }
}

完成任务

public class CompleteTaskExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        String taskId = "task1";

        taskService.complete(taskId);
    }
}

流程实例状态管理

流程实例的状态表示流程执行的当前状态。可以通过API查询和更新流程实例的状态。

查询流程实例状态

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;

public class QueryProcessInstanceStatusExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("12345").singleResult();
        if (processInstance != null) {
            System.out.println("Process Instance Status: " + processInstance.getProcessDefinitionId());
        }
    }
}

更新流程实例状态

更新流程实例状态可以参考Activiti提供的API,如runtimeService.setVariable(processInstanceId, "status", "completed")

常用API与API调用

查询API使用

Activiti提供了多种查询API,用于获取流程定义、流程实例、任务等信息。

查询流程定义

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;

public class QueryProcessDefinitionExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();

        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leaveRequest").singleResult();
        if (processDefinition != null) {
            System.out.println("Process Definition ID: " + processDefinition.getId());
        }
    }
}

查询流程实例

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;

public class QueryProcessInstanceExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("12345").singleResult();
        if (processInstance != null) {
            System.out.println("Process Instance ID: " + processInstance.getId());
        }
    }
}

任务管理API

任务管理API用于操作任务,如创建、查询、更新和完成任务。

创建任务

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;

public class CreateTaskExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();

        Task task = taskService.createTask();
        task.setName("Submit Leave Request");
        task.setAssignee("user1");
        taskService.saveTask(task);

        System.out.println("Task ID: " + task.getId());
    }
}

事件监听器与服务任务

事件监听器可以监听流程中的各种事件,如启动、结束等。服务任务用于执行特定的服务,如调用外部系统。

事件监听器

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.delegate.BpmnError;

public class EventListenerExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();

        // 添加任务监听器
        TaskListener taskListener = new TaskListener() {
            @Override
            public void notify(DelegateTask delegateTask) {
                System.out.println("Task assigned to: " + delegateTask.getAssignee());
            }
        };

        taskService.setAssignee("task1", "user1");
        taskService.addEventListener(taskListener);
    }
}

服务任务

<userTask id="serviceTask1" name="Submit Leave Request" implementation="java">
    <script>
        public void execute(DelegateExecution execution) {
            String userId = execution.getVariable("userId");
            System.out.println("Executing service task for user: " + userId);
        }
    </script>
</userTask>
实战案例

简单请假流程实例

创建一个简单的请假流程实例。

BPMN文件

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100301/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100301/MODEL http://www.omg.org/spec/BPMN/20100301/MODEL/BPMN20.xsd" id="Definitions_1">
  <process id="leaveRequest" name="Leave Request Process" isExecutable="true">
    <startEvent id="startEvent" />
    <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="taskSubmitRequest" />
    <userTask id="taskSubmitRequest" name="Submit Leave Request" />
    <sequenceFlow id="flow2" sourceRef="taskSubmitRequest" targetRef="taskApproveRequest" />
    <userTask id="taskApproveRequest" name="Approve Leave Request" />
    <sequenceFlow id="flow3" sourceRef="taskApproveRequest" targetRef="endEvent" />
    <endEvent id="endEvent" />
  </process>
</definitions>

创建流程实例

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;

public class CreateLeaveRequestExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveRequest", "1001");
        System.out.println("Process Instance ID: " + processInstance.getId());
    }
}

完成任务

public class CompleteLeaveRequestExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        String taskId = "task1";

        taskService.complete(taskId);
    }
}

复杂流程(如审批流程)实战

创建一个复杂的审批流程实例,例如报销审批流程。

BPMN文件

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100301/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100301/MODEL http://www.omg.org/spec/BPMN/20100301/MODEL/BPMN20.xsd" id="Definitions_1">
  <process id="reimbursementWorkflow" name="Reimbursement Workflow" isExecutable="true">
    <startEvent id="startEvent" />
    <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="taskSubmitRequest" />
    <userTask id="taskSubmitRequest" name="Submit Reimbursement Request" />
    <sequenceFlow id="flow2" sourceRef="taskSubmitRequest" targetRef="taskManagerApprove" />
    <userTask id="taskManagerApprove" name="Manager Approve" />
    <sequenceFlow id="flow3" sourceRef="taskManagerApprove" targetRef="taskDirectorApprove" />
    <userTask id="taskDirectorApprove" name="Director Approve" />
    <sequenceFlow id="flow4" sourceRef="taskDirectorApprove" targetRef="endEvent" />
    <endEvent id="endEvent" />
  </process>
</definitions>

创建流程实例

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;

public class CreateReimbursementRequestExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("reimbursementWorkflow", "1001");
        System.out.println("Process Instance ID: " + processInstance.getId());
    }
}

完成任务

public class CompleteReimbursementRequestExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        String taskId = "task1";

        taskService.complete(taskId);
    }
}

流程监控与优化技巧

监控流程实例

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;

public class MonitorProcessInstanceExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();

        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("12345").singleResult();
        if (processInstance != null) {
            System.out.println("Process Instance Status: " + processInstance.getProcessDefinitionId());
        }
    }
}

优化流程

优化流程通常涉及分析流程执行日志,找出瓶颈和效率低下的环节,然后进行调整。可以使用Activiti的管理控制台来查看流程执行的数据,从而进行优化。

示例代码

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100301/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100301/MODEL http://www.omg.org/spec/BPMN/20100301/MODEL/BPMN20.xsd" id="Definitions_1">
  <process id="improvedWorkflow" name="Improved Workflow" isExecutable="true">
    <startEvent id="startEvent" />
    <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="taskSubmitRequest" />
    <userTask id="taskSubmitRequest" name="Submit Request" />
    <sequenceFlow id="flow2" sourceRef="taskSubmitRequest" targetRef="taskApproveRequest" />
    <userTask id="taskApproveRequest" name="Approve Request" />
    <sequenceFlow id="flow3" sourceRef="taskApproveRequest" targetRef="endEvent" />
    <endEvent id="endEvent" />
  </process>
</definitions>

以上是Activiti入门教程,通过以上内容,你已经掌握了Activiti的基本概念、安装与配置、流程定义与设计、流程实例与任务管理、常用API与API调用,以及实际应用案例。希望这些内容能帮助你快速上手使用Activiti,并在实际项目中发挥其强大的功能。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消