如何在Spring Boot項目中集成Activiti工作流引擎

2024年2月6日 20点热度 0人点赞

引言

Activiti是一個用於工作流和業務流程管理(BPM)的開源平臺。它允許開發人員設計,運行和管理業務流程,從而使企業能夠更高效地運行業務。在Spring Boot項目中集成Activiti工作流引擎可以使我們更輕松地管理和控制業務流程。

Activiti描述

Activiti庫包含了一系列用於處理BPMN 2.0流程定義和流程實例的API。通過這些API,我們可以創建,查詢,更新和刪除流程實例。此外,Activiti還提供了用於繪制流程圖的工具,可以直觀地展示流程的狀態。

代碼示例

1. 添加Maven依賴

在`pom.xml`文件中添加Activiti的依賴:

<dependencies>
    <!-- 其他依賴 -->
    <!-- Activiti -->
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-spring-boot-starter-basic</artifactId>
        <version>7.1.0.M6</version>
    </dependency>
</dependencies>

2. 配置數據庫

在`application.properties`或`application.yml`中配置數據庫連接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

3. 配置Activiti引擎

創建一個配置類,配置Activiti引擎:

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class ActivitiConfig {
    @Bean
    public SpringProcessEngineConfiguration springProcessEngineConfiguration(DataSource dataSource) {
        SpringProcessEngineConfiguration configuration = new SpringProcessEngineConfiguration();
        configuration.setDataSource(dataSource);
        configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        configuration.setAsyncExecutorActivate(false);
        return configuration;
    }
    @Bean
    public ProcessEngine processEngine(SpringProcessEngineConfiguration configuration) {
        return configuration.buildProcessEngine();
    }
}

4. 創建簡單的工作流程

創建一個簡單的BPMN 2.0流程定義文件(如`simple_process.bpmn20.xml`):

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:activiti="http://activiti.org/bpmn"
             targetNamespace="http://www.activiti.org/processdef">
  <process id="simpleProcess" name="Simple Process" isExecutable="true">
    <startEvent id="startEvent" />
    <sequenceFlow id="flow1" sourceRef="startEvent" targetRef="task1" />
    <userTask id="task1" name="User Task" />
    <sequenceFlow id="flow2" sourceRef="task1" targetRef="endEvent" />
    <endEvent id="endEvent" />
  </process>
</definitions>

5. 部署並運行工作流程

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.repository.DeploymentBuilder;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class WorkflowService {
    @Autowired
    private RepositoryService repositoryService;
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;
    @Transactional
    public void deployProcess(String bpmnFile) {
        // bpmnFile 為 定義的流程定義文件simple_process.bpmn20.xml
        DeploymentBuilder deploymentBuilder = repositoryService.createDeployment()
              .addClasspathResource(bpmnFile);
        Deployment deployment = deploymentBuilder.deploy();
    }
    @Transactional
    public void startProcess(String processKey) {
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processKey);
    }
    @Transactional
    public void completeTask(String taskId) {
        taskService.complete(taskId);
    }
}

6. 編寫Controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/workflow")
public class WorkflowController {
    @Autowired
    private WorkflowService workflowService;
    @PostMapping("/deploy/{bpmnFile}")
    public void deployProcess(@PathVariable String bpmnFile) {
        workflowService.deployProcess(bpmnFile);
    }
    @PostMapping("/start/{processKey}")
    public void startProcess(@PathVariable String processKey) {
        workflowService.startProcess(processKey);
    }
    @PostMapping("/complete/{taskId}")
    public void completeTask(@PathVariable String taskId) {
        workflowService.completeTask(taskId);
    }
}

適用場景

1. 企業內部流程自動化:Activiti可以幫助企業自動化和優化內部的業務流程,如請假流程、報銷流程、審批流程等。員工可以通過系統提交請求,系統自動按照設定的流程規則進行審批和處理,提高了流程的透明度和效率。

2. 跨部門協同:對於需要多個部門協同完成的業務流程,Activiti可以幫助企業建立協作流程,實現不同部門間的無縫協同,減少溝通成本,提高協作效率。

3. 客戶服務流程:在客戶服務方面,Activiti可以用於客戶問題處理、客戶投訴流程等。每個問題或投訴都可以被視為一個流程實例,通過Activiti可以將問題或投訴分配給相應的負責人並跟蹤處理過程。

4. 訂單處理和審批:對於需要訂單處理和審批的業務,如電商平臺,可以使用Activiti構建訂單審批流程。訂單從創建到完成,需要經過一系列步驟的審批和處理,Activiti可以幫助自動化這一流程。

Activiti優點

1. 高效管理業務流程:Activiti提供了強大的流程管理能力,能夠高效、可靠地管理各類業務流程,降低了人工幹預和操作錯誤的可能性。

2. 快速開發和部署:集成Activiti到Spring Boot項目中,可以利用Spring Boot的快速開發特性,快速搭建和部署業務流程,提高了開發效率。

3. 提高業務透明度:通過Activiti,業務流程變得可視化,各個步驟的狀態、審批歷史一目了然,提高了業務透明度,有助於監控和優化流程。

4. 易於定制和擴展:Activiti的架構和API設計靈活,可以根據企業的特定需求定制流程,擴展業務流程,適應不同的業務場景。

總 結

通過集成Activiti工作流引擎,我們可以在Spring Boot項目中輕松實現業務流程的管理和運行。Activiti提供了豐富的功能,可以滿足復雜的業務流程需求。在實際應用中,可以根據具體業務場景和需求進行定制和擴展,以達到更好的業務流程管理效果。