继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Activiti实战:新手入门与初级应用指南

喵喔喔
关注TA
已关注
手记 505
粉丝 103
获赞 606
概述

本文介绍了Activiti的工作流引擎及其开发环境配置,详细讲解了Activiti的核心概念和流程设计基础,并通过实战案例演示了请假流程的实现。此外,文章还提供了Activiti调试技巧和常见问题解决方案。

Activiti简介与环境搭建
Activiti介绍

Activiti是一个开源的工作流引擎,基于云原生架构,采用Java语言开发,遵循BPMN2.0标准。它能够嵌入到您的应用程序中,实现复杂的业务流程自动化。Activiti支持动态流程定义变更,简化了工作流模型的开发和维护。它能够与其他系统集成,如Spring、MyBatis等,提供了强大的API接口,能够方便地执行流程、查询流程状态、管理流程实例。

开发环境配置
  1. 下载安装JDK
    确保已安装JDK。可以从Oracle官网或OpenJDK下载安装包,配置环境变量以设置JDK的安装路径。

  2. 下载安装Eclipse或IntelliJ IDEA
    推荐使用Eclipse或IntelliJ IDEA作为开发工具,安装完成后配置相应的IDE。

  3. 安装Maven
    从Maven官网下载安装包,并配置环境变量,在IDE中配置Maven。

  4. 创建Activiti项目
    在Eclipse或IntelliJ IDEA中创建一个新的Maven项目,在pom.xml文件中添加Activiti依赖。

    <dependencies>
       <dependency>
           <groupId>org.activiti</groupId>
           <artifactId>activiti-engine</artifactId>
           <version>5.22.0</version>
       </dependency>
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>8.0.26</version>
       </dependency>
    </dependencies>
  5. 数据库配置
    使用MySQL作为数据库存储Activiti的数据。创建数据库,并配置数据库连接信息。

    <properties>
       <driverClassName>com.mysql.jdbc.Driver</driverClassName>
       <url>jdbc:mysql://localhost:3306/activiti?useSSL=false&amp;serverTimezone=UTC</url>
       <username>root</username>
       <password>password</password>
    </properties>
第一个Activiti实例

下面将通过一个简单的例子来展示如何创建和运行一个Activiti流程实例。

  1. 创建流程定义文件
    创建一个名为hello.bpmn20.xml的文件,内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <definitions xmlns="http://www.omg.org/spec/BPMN/20100301/BPMN20.xsd" id="Definitions_1"
                targetNamespace="http://bpmndi.org">
       <process id="HelloProcess" isExecutable="true">
           <startEvent id="StartEvent_1"></startEvent>
           <sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="EndEvent_1"></sequenceFlow>
           <endEvent id="EndEvent_1"></endEvent>
       </process>
    </definitions>
  2. 创建启动流程的Java类
    编写一个Java类来启动并查询流程实例。

    import org.activiti.engine.ProcessEngine;
    import org.activiti.engine.ProcessEngines;
    import org.activiti.engine.RepositoryService;
    import org.activiti.engine.RuntimeService;
    import org.activiti.engine.TaskService;
    import org.activiti.engine.repository.Deployment;
    import org.activiti.engine.runtime.ProcessInstance;
    import org.activiti.engine.task.Task;
    
    public class HelloActiviti {
       public static void main(String[] args) {
           ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
           RepositoryService repositoryService = processEngine.getRepositoryService();
           Deployment deployment = repositoryService.createDeployment()
                   .addClasspathResource("hello.bpmn20.xml")
                   .deploy();
           RuntimeService runtimeService = processEngine.getRuntimeService();
           ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("HelloProcess");
           TaskService taskService = processEngine.getTaskService();
           Task task = taskService.createTaskQuery()
                   .processInstanceId(processInstance.getId())
                   .singleResult();
    
           System.out.println("任务ID: " + task.getId());
           System.out.println("任务名称: " + task.getName());
           taskService.complete(task.getId());
       }
    }
  3. 运行程序
    运行HelloActiviti类中的main方法,即可看到输出的流程实例信息。
Activiti核心概念解析
流程定义与流程实例

流程定义是流程的蓝图,通常以XML文件的形式存储。流程定义中包含流程中需要执行的各个元素,如任务、网关、事件等。流程实例是基于流程定义创建的实例,可以被具体执行。流程实例的生命周期包括启动、执行、暂停、结束等状态。

任务与用户

任务是用户需要完成的操作,例如审批、填写表单等。任务由流程定义中的task元素表示,任务通常与用户关联。例如,在startProcessInstanceByForm方法中,可以指定任务的负责人。

<userTask id="Task_1" name="审批" />
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(
    "ApprovalProcess", 
    variables.put("assignee", "alice")
);
事件与监听器

事件是流程中的一个触发点,触发时会执行相应的动作。事件可以分为启动事件、结束事件、中间事件等。中间事件可以分为定时器事件、信号事件等。

<interruptingEventThrowEvent id="ThrowEvent_1" name="信号事件" signalEventDefinition="signal" />

监听器是在特定事件上执行的代码。例如,当流程实例启动或结束时,可以注册监听器进行相应的操作。

processEngine.getTaskService().addEventListener(new TaskListener() {
    @Override
    public void notify(DelegateTask delegateTask) {
        System.out.println("任务创建监听器: " + delegateTask.getId());
    }
});
Activiti流程设计基础
BPMN 2.0流程图简介

BPMN(Business Process Model and Notation)是一种建模语言,用于描述业务流程。BPMN 2.0提供了对流程建模、流程执行和流程监控的支持。

BPMN 2.0图由一系列元素组成,包括流程定义、任务、网关、事件、数据对象、消息等。这些元素通过连接线连接起来,形成一个完整的流程图。

流程图绘制工具

流程图的绘制工具有多种选择,包括:

  • Eclipse BPMN2 Modeler
    Eclipse BPMN2 Modeler是一个基于Eclipse的插件,支持BPMN 2.0流程图的绘制和编辑。
  • Camunda Modeler
    Camunda Modeler是一个开源的流程图绘制工具,支持BPMN 2.0。
  • BPMN.io
    BPMN.io是一个在线流程图绘制工具,支持BPMN 2.0。

使用这些工具,您可以绘制流程图并将其导出为XML文件。

常见流程设计模式

常见的流程设计模式包括:

  • 审批流程
    审批流程通常包含多个任务节点,每个任务节点代表一个审批步骤。例如,审批一个请假申请,需要经过多个管理层审批。

  • 并行分支
    并行分支是指流程在某些节点处可以同时执行多个任务。例如,一个订单处理流程可以同时执行发货和计费。

  • 串行分支
    串行分支是指流程在某些节点处根据条件选择执行不同的分支。例如,一个申请流程可以根据申请人的身份选择不同的审批路径。

  • 循环
    循环是指流程在某些节点处可以重复执行某些任务。例如,一个报销流程可以多次提交报销单直到所有报销单都处理完毕。
Activiti API基础使用
流程定义管理

Activiti提供了丰富的API用于管理流程定义。常用的流程定义管理操作包括部署流程定义、查询流程定义、删除流程定义等。

Deployment deployment = repositoryService.createDeployment()
    .addClasspathResource("process.bpmn20.xml")
    .deploy();

List<Deployment> deployments = repositoryService.createDeploymentQuery()
    .list();

repositoryService.deleteDeployment(deployment.getId(), true);
任务查询与操作

任务是流程中的一个可执行元素,可以查询和操作任务的状态。

List<Task> tasks = taskService.createTaskQuery()
    .taskAssignee("alice")
    .list();

taskService.complete(task.getId());
流程实例的启动、查询与结束

流程实例是基于流程定义创建的实例,可以启动、查询和结束。

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("MyProcess");

ProcessInstance pi = runtimeService.createProcessInstanceQuery()
    .processInstanceId(processInstance.getId())
    .singleResult();

runtimeService.deleteProcessInstance(pi.getId(), "流程结束");
实战案例:请假流程实现
需求分析

请假流程的需求分析包括以下几个环节:

  1. 员工发起请假请求。
  2. 请假请求提交给部门经理审批。
  3. 部门经理审批通过后,提交给人事部门审核。
  4. 人事部门审核通过后,流程结束。
流程设计

请假流程可以设计为包含多个任务节点的流程。流程图如下:

<process id="LeaveProcess" isExecutable="true">
    <startEvent id="StartEvent_1"></startEvent>
    <sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="RequestTask_1"></sequenceFlow>
    <userTask id="RequestTask_1" name="请假申请" />
    <sequenceFlow id="Flow_2" sourceRef="RequestTask_1" targetRef="ManagerApprovalTask_1"></sequenceFlow>
    <userTask id="ManagerApprovalTask_1" name="部门经理审批" />
    <sequenceFlow id="Flow_3" sourceRef="ManagerApprovalTask_1" targetRef="HRApprovalTask_1"></sequenceFlow>
    <userTask id="HRApprovalTask_1" name="人事部门审批" />
    <sequenceFlow id="Flow_4" sourceRef="HRApprovalTask_1" targetRef="EndEvent_1"></sequenceFlow>
    <endEvent id="EndEvent_1"></endEvent>
</process>
代码实现

实现流程的Java代码如下:

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

public class LeaveProcessExample {
    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment = repositoryService.createDeployment()
            .addClasspathResource("leave.bpmn20.xml")
            .deploy();

        RuntimeService runtimeService = processEngine.getRuntimeService();
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("LeaveProcess");

        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery()
            .processInstanceId(processInstance.getId())
            .singleResult();

        System.out.println("任务ID: " + task.getId());
        System.out.println("任务名称: " + task.getName());

        taskService.complete(task.getId());
    }
}
Activiti调试与常见问题解决
调试技巧
  1. 使用Activiti Explorer
    Activiti Explorer是一个Web应用,提供了一个图形化界面来查看和调试流程实例。可以通过浏览器访问Activiti Explorer,查看流程定义和实例,以及任务和事件。

  2. 使用日志
    Activiti支持通过日志来查看流程实例的状态。可以配置日志级别,以便在运行时查看详细的日志信息。

  3. 使用调试工具
    在IDE中启用调试模式,可以在流程执行时打断点进行调试。可以通过调试工具查看流程实例的状态和变量的值。
常见错误及解决方案
  1. 流程定义未找到
    确认流程定义文件已正确部署,确认流程定义的key名称正确。

  2. 任务未找到
    确认任务的assignee正确,确认任务的ID正确。

  3. 流程实例未找到
    确认流程实例的ID正确,检查流程实例的状态,确认是否已结束或暂停。
性能优化建议
  1. 数据库优化
    使用索引优化查询性能,定期清理过期的数据。

  2. 流程实例的批量操作
    使用批量操作API来减少数据库访问次数。

  3. 使用缓存
    使用缓存技术来减少数据库访问次数。

通过以上的介绍和示例,您应该已经掌握了Activiti的基本使用方法和一些常见问题的解决技巧。希望这些内容能帮助您更好地使用Activiti来实现复杂的业务流程自动化。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP