likes
comments
collection
share

Activiti是什么?

作者站长头像
站长
· 阅读数 27

Activiti 是一个轻量级的工作流和业务流程管理 (BPM) 平台,它为设计、执行和管理各种业务流程提供了支持。它主要用于处理业务流程中的任务分配、管理和执行。

Activiti 的几个主要功能模块

1. activiti-engine

这是 Activiti 工作流引擎的核心组件,负责流程的执行和管理。该模块包含所有管理流程实例、任务、历史数据等的服务和API。关键功能如下:

  • 流程定义和部署:通过 Repository Service,支持 BPMN 2.0 流程定义的部署和存储。
  • 流程实例的创建和管理:通过 Runtime Service,可以启动流程实例,控制流程执行,以及管理流程变量。
  • 任务管理:通过 Task Service,管理用户任务和系统任务,包括任务分配、查询和完成等功能。
  • 历史数据:通过 History Service,记录和查询所有流程活动的历史信息,支持业务监控和后续分析。
  • 事务控制:整合 Spring 的事务管理,确保流程执行的一致性和可靠性。

2. activiti-bpmn-converter

这个模块负责 BPMN 2.0 文件与 Activiti 内部模型之间的转换。它是 Activiti 的重要组成部分,使得 Activiti 能够解析 BPMN 2.0 标准定义的流程文件。主要功能包括:

  • BPMN 解析:将 BPMN XML 文件解析为 Activiti 可理解的内部对象模型。
  • 模型转换:将内部模型转换回 BPMN XML,支持流程定义的导出。

3. activiti-bpmn-model

这个模块定义了 BPMN 2.0 的各种元素和结构,如任务、网关、事件、流程等。它为 Activiti 引擎提供了一组 Java 类,这些类反映了 BPMN 2.0 规范的结构。主要内容包括:

  • 模型定义:为每种 BPMN 元素定义 Java 类,例如 UserTaskExclusiveGatewayStartEvent 等。
  • 属性和行为:为模型元素定义必要的属性和行为,如任务的执行逻辑、事件的触发条件等。

4. activiti-spring-boot-starter

这是为了简化 Activiti 和 Spring Boot 的整合而设计的启动器。它利用 Spring Boot 的自动配置特性,使得在 Spring Boot 应用中集成 Activiti 变得非常简单。主要特点包括:

  • 自动配置:自动配置数据源、事务管理、各种服务和 API。
  • 依赖管理:自动引入 Activiti 所需的所有依赖。
  • 属性配置:允许通过 application.properties 或 application.yml 文件配置 Activiti 的各种属性。

简单案例

首先,我们需要在项目中添加Activiti的依赖。在Maven项目的pom.xml文件中添加如下依赖:

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <version>7.1.0.M6</version>
</dependency>

然后,我们需要配置Activiti的数据源和事务管理器。在application.properties文件中添加如下配置:

spring.datasource.url=jdbc:h2:mem:activiti
spring.datasource.username=sa
spring.datasource.password=

spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

spring.activiti.database-schema-update=true

接下来,我们定义一个简单的工作流程定义文件(helloworld.bpmn20.xml):

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:activiti="http://activiti.org/bpmn"
             targetNamespace="Examples">

    <process id="helloworld" name="Hello World">
        <startEvent id="theStart" />
        <sequenceFlow id="flow1" sourceRef="theStart" targetRef="printHello" />
        <serviceTask id="printHello" activiti:class="com.example.HelloWorldDelegate" />
        <sequenceFlow id="flow2" sourceRef="printHello" targetRef="theEnd" />
        <endEvent id="theEnd" />
    </process>

</definitions>

在这个工作流程定义中,我们定义了一个名为"Hello World"的流程,其中包含一个开始事件、一个服务任务和一个结束事件。服务任务将执行com.example.HelloWorldDelegate类中定义的逻辑。

接下来,我们实现HelloWorldDelegate类:

package com.example;

import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;

public class HelloWorldDelegate implements JavaDelegate {

    @Override
    public void execute(DelegateExecution execution) {
        System.out.println("Hello World!");
    }
}

最后,我们创建一个REST控制器来启动工作流程:

package com.example;

import org.activiti.engine.RuntimeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class WorkflowController {

    @Autowired
    private RuntimeService runtimeService;

    @GetMapping("/start")
    public void startProcess() {
        runtimeService.startProcessInstanceByKey("helloworld");
    }
}

在上面的代码中,我们注入了RuntimeService,并定义了一个REST端点/start,用于启动名为"helloworld"的工作流程。

启动应用程序后,访问http://localhost:8080/start, 将看到控制台输出"Hello World!"。

案例升级

让我们将案例变得更加复杂一些。我们将定义一个简单的审批流程,包括发起申请、审批人审批和通知申请人结果等步骤。

首先,我们定义一个BPMN 2.0的流程定义文件(approval.bpmn20.xml):

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:activiti="http://activiti.org/bpmn"
             targetNamespace="Examples">

    <process id="approval" name="Approval Process">
        <startEvent id="startEvent" />
        <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="submitApprovalTask" />

        <userTask id="submitApprovalTask" name="Submit Approval" activiti:assignee="${initiator}" />
        <sequenceFlow id="flow2" sourceRef="submitApprovalTask" targetRef="approvalTask" />

        <userTask id="approvalTask" name="Approve or Reject" activiti:assignee="${approver}" />
        <sequenceFlow id="flow3" sourceRef="approvalTask" targetRef="approvedTask" />
        <sequenceFlow id="flow4" sourceRef="approvalTask" targetRef="rejectedTask" />

        <userTask id="approvedTask" name="Approved" activiti:assignee="${initiator}" />
        <sequenceFlow id="flow5" sourceRef="approvedTask" targetRef="approvedEndEvent" />
        <endEvent id="approvedEndEvent" />

        <userTask id="rejectedTask" name="Rejected" activiti:assignee="${initiator}" />
        <sequenceFlow id="flow6" sourceRef="rejectedTask" targetRef="rejectedEndEvent" />
        <endEvent id="rejectedEndEvent" />
    </process>

</definitions>

在这个流程定义中,我们定义了以下步骤:

  1. 发起申请(submitApprovalTask),由发起人(initiator)完成。
  2. 审批(approvalTask),由审批人(approver)完成,有两个可能的结果:批准或拒绝。
  3. 如果审批通过,则通知发起人审批结果(approvedTask)。
  4. 如果审批被拒绝,则通知发起人审批结果(rejectedTask)。

接下来,我们实现一个Service类来启动流程实例并设置一些流程变量:

package com.example;

import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class ApprovalService {

    @Autowired
    private RuntimeService runtimeService;

    public void startApprovalProcess(String initiator, String approver) {
        Map<String, Object> variables = new HashMap<>();
        variables.put("initiator", initiator);
        variables.put("approver", approver);

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("approval", variables);
        System.out.println("Approval process started: " + processInstance.getId());
    }
}

在startApprovalProcess方法中,我们设置了两个流程变量:initiator和approver,分别表示发起人和审批人。然后,我们使用RuntimeService启动名为"approval"的流程实例,并传入这些流程变量。

最后,我们创建一个REST控制器来触发流程:

package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ApprovalController {

    @Autowired
    private ApprovalService approvalService;

    @PostMapping("/start-approval")
    public void startApprovalProcess(@RequestParam String initiator, @RequestParam String approver) {
        approvalService.startApprovalProcess(initiator, approver);
    }
}

在这个控制器中,我们定义了一个POST端点/start-approval,用于启动审批流程。initiator和approver参数分别表示发起人和审批人。

启动应用程序后,您可以使用curl或Postman等工具发送POST请求到http://localhost:8080/start-approval?initiator=john&approver=mary, 以启动一个新的审批流程实例。

转载自:https://juejin.cn/post/7362739494494486562
评论
请登录