Activiti是什么?
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 类,例如
UserTask
、ExclusiveGateway
、StartEvent
等。 - 属性和行为:为模型元素定义必要的属性和行为,如任务的执行逻辑、事件的触发条件等。
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>
在这个流程定义中,我们定义了以下步骤:
- 发起申请(submitApprovalTask),由发起人(initiator)完成。
- 审批(approvalTask),由审批人(approver)完成,有两个可能的结果:批准或拒绝。
- 如果审批通过,则通知发起人审批结果(approvedTask)。
- 如果审批被拒绝,则通知发起人审批结果(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