SpringBoot整合Activiti工作流框架的使用

Activiti 介紹

  • Activiti是一個開源的工作流引擎,它實現瞭BPMN 2.0規范,可以發佈設計好的流程定義,並通過api進行流程調度。Activiti 作為一個遵從 Apache 許可的工作流和業務流程管理開源平臺,其核心是基於 Java 的超快速、超穩定的 BPMN2.0 流程引擎,強調流程服務的可嵌入性和可擴展性,同時更加強調面向業務人員。
  • 簡單來說activiti是一個業務流程管理引擎,會沿著設計者設計好的流程,一步一步的執行下去,直到終點。

SpringBoot 整合

配置

activiti會框架會創建一系列的表,所以要配置相關數據庫的信息,需要註意的是,在url中,添加瞭針對數據庫的條件,其中最後一條nullCatalogMeansCurrent=true非常重要,至於有什麼用就不概述瞭,但是沒有這條語句的話就無法自動創建對應的二十八張表。

server:
  port: 8014

spring:
  application:
    name: workflow
  datasource:
    name: mysqlDatasource
    url: jdbc:mysql://localhost:3306/core?useUnicode=true&nullCatalogMeansCurrent=true
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    # 監控統計攔截的filters,如果啟用log4j記得添加依賴
    filters: stat,wall
  # activiti
  activiti:
    #每次應用啟動不檢查Activiti數據表是否存在及版本號是否匹配,提升應用啟動速度
    database-schema-update: true
    #在項目單獨作為一個引擎,本身不部署流程的時候,如果resources目錄沒有“processes”目錄,啟動項目報錯–找不到processes目錄。需要在配置文件中添加以下內容:
    check-process-definitions: false
    process-definition-location-prefix: classpath:/processes/
    process-definition-location-suffixes:
      -**.bpmn
      -**.bpmn20.xml
    #保存歷史數據級別設置為full最高級別,便於歷史數據的追溯
    history-level: full
  # activiti 安全訪問
  security:
    basic:
      enabled: true
    user:
      name: root
      password: root

版本問題

  • 註意 SpringBootActiviti 的版本問題
  • springboot2.0不能與activiti6.0.0直接集成使用,因為activiti6.0.0出來的時候springboot2.0還沒有出來,activiti6.0.0 支持springboot1.2.6以上,2.0.0以下的版本。

使用 starter

依賴

這個版本滿足高版本的springboot,直接使用就行

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

需要註意的是,這裡的依賴版本,需要對應數據庫中act_ge_property表中schema.version版本信息,所以一般不建議在創建完表之後修改依賴信息

啟動項目成功後自動創建表

請添加圖片描述

需要在配置文件中加上 activiti-security的配置

 # activiti 安全訪問
  security:
    basic:
      enabled: true
    user:
      name: root
      password: root

不使用 starter

依賴

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring</artifactId>
    <version>6.0.0</version>
</dependency>

配置代碼

@Configuration
public class ActivitiConfig {

    private static final Logger logger = LoggerFactory.getLogger(ActivitiConfig.class);


    /**
     * 配置分為以下幾步驟
     * 1. 創建ActivitiConfig
     * 2. 使用ActivitiConfig創建ProcessEngineFactoryBean
     * 3. 使用ProcessEngineFactoryBean創建ProcessEngine對象
     * 4. 使用ProcessEngine對象創建需要的服務對象
     */
    private final DataSource dataSource;

    private final PlatformTransactionManager platformTransactionManager;

    @Autowired
    public ActivitiConfig(DataSource dataSource, PlatformTransactionManager transactionManager) {
        this.dataSource = dataSource;
        platformTransactionManager = transactionManager;
    }

    /*
     * 1. 創建配置文件,也就是提供一些配置信息,這樣就可以自定義自己的創建信息瞭
     * 需要一些參數,1. 數據源。2. 事務管理器。
     * 這裡還加入瞭自動掃描process包下的bpmn(流程定義文件)的設置,這樣就可以省去瞭部署
     * */
    @Bean
    public SpringProcessEngineConfiguration springProcessEngineConfiguration() {
        SpringProcessEngineConfiguration spec = new SpringProcessEngineConfiguration();
        spec.setDataSource(dataSource);
        spec.setTransactionManager(platformTransactionManager);
        spec.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        Resource[] resources = null;
        // 啟動自動部署流程
        try {
            resources = new PathMatchingResourcePatternResolver().getResources("classpath*:processes/*.*.xml");
        } catch (IOException e) {
            logger.error("Error Occur:", e);
        }
        spec.setDeploymentResources(resources);
        return spec;
    }

    @Bean
    public ProcessEngineFactoryBean processEngine() {
        ProcessEngineFactoryBean engineFactoryBean = new ProcessEngineFactoryBean();
        engineFactoryBean.setProcessEngineConfiguration(springProcessEngineConfiguration());
        return engineFactoryBean;
    }

    @Bean
    public RepositoryService repositoryService() throws Exception {
        return Objects.requireNonNull(processEngine().getObject()).getRepositoryService();
    }

    @Bean
    public RuntimeService runtimeService() throws Exception {
        return Objects.requireNonNull(processEngine().getObject()).getRuntimeService();
    }

    @Bean
    public TaskService taskService() throws Exception {
        return Objects.requireNonNull(processEngine().getObject()).getTaskService();
    }

    @Bean
    public HistoryService historyService() throws Exception {
        return Objects.requireNonNull(processEngine().getObject()).getHistoryService();
    }
}

resources中創建process文件夾,文件夾的路徑和名字需要和ActivitiConfig中的配置保持一致啟動springBoot項目即可創建完成

使用 Activiti

Idea 安裝 Activiti BPMN visualizer 插件

編寫測試 bpmn.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:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn"
             xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
             xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
             typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"
             targetNamespace="http://www.activiti.org/processdef">
    <process id="test" name="test" isExecutable="true">
        <startEvent id="startevent1" name="Start"></startEvent>
        <endEvent id="endevent1" name="End"></endEvent>
        <userTask id="usertask1" name="HelloWorld" activiti:assignee="goxcheer"></userTask>
        <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
        <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow>
    </process>
    <bpmndi:BPMNDiagram id="BPMNDiagram_test">
        <bpmndi:BPMNPlane bpmnElement="test" id="BPMNPlane_test">
            <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
                <omgdc:Bounds height="35.0" width="41.0" x="220.0" y="180.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
                <omgdc:Bounds height="35.0" width="35.0" x="640.0" y="180.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
                <omgdc:Bounds height="55.0" width="105.0" x="390.0" y="170.0"></omgdc:Bounds>
            </bpmndi:BPMNShape>
            <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
                <omgdi:waypoint x="261.0" y="197.0"></omgdi:waypoint>
                <omgdi:waypoint x="390.0" y="197.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
            <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
                <omgdi:waypoint x="495.0" y="197.0"></omgdi:waypoint>
                <omgdi:waypoint x="640.0" y="197.0"></omgdi:waypoint>
            </bpmndi:BPMNEdge>
        </bpmndi:BPMNPlane>
    </bpmndi:BPMNDiagram>
</definitions>

編寫測試代碼

測試代碼

@RequestMapping("/test")
@RestController
public class ActivitiTestController {

    private static final Logger logger = LoggerFactory.getLogger(ActivitiTestController.class);

    @Autowired
    RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @RequestMapping("/test1")
    public void test1() {
        logger.info("Start.........");
        ProcessInstance pi = runtimeService.startProcessInstanceByKey("test");
        logger.info("流程啟動成功,流程id:{}", pi.getId());
    }


    @RequestMapping("/test2")
    public void test2() {
        String userId = "root";
        List<Task> resultTask = taskService.createTaskQuery().processDefinitionKey("test").taskCandidateOrAssigned(userId).list();
        logger.info("任務列表:{}", resultTask);
    }

}

…簡單配置到此結束

完整配置代碼見 :https://gitee.com/Marlon_Brando/onlineshop_back/tree/develop/os_workflow

到此這篇關於SpringBoot整合Activiti工作流框架的使用的文章就介紹到這瞭,更多相關SpringBoot Activiti工作流內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet! 

推薦閱讀: