springboot + activiti 項目搭建及簡單使用

1. 引入依賴包

// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.1.1.RELEASE'

// https://mvnrepository.com/artifact/org.activiti/activiti-spring-boot-starter-basic
compile group: 'org.activiti', name: 'activiti-spring-boot-starter-basic', version: '6.0.0'

// https://mvnrepository.com/artifact/com.oracle.ojdbc/ojdbc8
compile group: 'com.oracle.ojdbc', name: 'ojdbc8', version: '19.3.0.0'

// https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter
compile group: 'org.mybatis.spring.boot', name: 'mybatis-spring-boot-starter', version: '2.0.1'

// https://mvnrepository.com/artifact/org.projectlombok/lombok
providedCompile group: 'org.projectlombok', name: 'lombok', version: '1.18.8'

注:由於 springboot 2.x 可能會與引入的 activiti 6.0 有衝突,導致報錯如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
這個時候在springboot的啓動類上加上
@SpringBootApplication (exclude = {org.activiti.spring.boot.SecurityAutoConfiguration.class}) 就好了。

2. 配置application.yml文件

server:
  port: 8081
spring:
  datasource:
    driver-class-name: oracle.jdbc.driver.OracleDriver
    url: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST = 127.0.0.1)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = orcl)))
    username: scott
    password: tiger
  activiti:
    # 自動建表
    #database-schema: ACTIVITI # TODO 千萬不要加這個(第一次運行可以加上,創建好後可以註釋掉)
    #    false (默認值):在創建流程引擎時檢查庫模式的版本,如果版本不匹配則拋出異常。
    #    true:在創建流程引擎時,執行檢查並在必要時對數據庫中所有的表進行更新,如果表不存在,則自動創建。
    #    create-drop:在創建流程引擎時,會創建數據庫的表,並在關閉流程引擎時刪除數據庫的表。
    #    drop-create:Activiti啓動時,執行數據庫表的刪除操作,在Activiti關閉時,會執行數據庫表的創建操作。
    database-schema-update: false # 自動更新數據庫結構
    #    none:不保存任何的歷史數據,因此,在流程執行過程中,這是最高效的。
    #    activity:級別高於none,保存流程實例與流程行爲,其他數據不保存。
    #    audit:除activity級別會保存的數據外,還會保存全部的流程任務及其屬性。audit爲history的默認值。
    #    full:保存歷史數據的最高級別,除了會保存audit級別的數據外,還會保存其他全部流程相關的細節數據,包括一些流程參數等。
    history-level: full # 保存歷史數據庫級別爲full最高級別,便於歷史數據的追溯
    db-history-used: true
    check-process-definitions: false # TODO 自動檢查部署流程定義文件。默認爲true,自動創建好表之後設爲false。設爲false會取消自動部署功能。
    copy-variables-to-local-for-tasks: false # 不加這行配置的話,運行時流程變量表 + 歷史流程變量表 統統的多出來一倍數據(其中taskId爲null)
mybatis:
  # xml位置,指定dao與sql關聯
  mapper-locations: classpath:mapper/*.xml
  configuration:
    # 下劃線命名的字段,自動轉駝峯命名
    map-underscore-to-camel-case: true
    default-executor-type: batch
  type-aliases-package: com.caihao.activititest2.entity

3. 畫流程圖

畫流程圖的話可以通過 idea 軟件裝插件的方式進行畫圖,也可以去官網下載 demo,然後將 activiti-app.war 放到 tomcat 下啓動,訪問 http://localhost:8080/activiti-app/editor/#/processes 進行畫圖。
下面是我運行官網 demo 所畫的請假流程圖。
請假單流程圖
將畫好的流程圖導出,放到項目的 resources 資源目錄下的 processes 目錄下。

注:流程圖不是必須放在 processes 目錄下,只是好像 resources 目錄下必須得有 processes 目錄,因爲 activiti 默認初始化時會去加載 processes 目錄,如果沒有 processes 目錄的話好像是會報錯的。因此,畫好的流程圖只需放在 resources 目錄下即可,但是 resources 目錄下必須要有 processes 文件夾。

4. 編寫代碼

4.1 部署流程定義

首先部署流程定義,repositoryService 通過 springboot 注入的方式得到。

public String deployProcess() {
    Deployment deployment = repositoryService.createDeployment()
            .addClasspathResource("processes/leaveBill2.bpmn20.xml")
            .name("請假審批")
            .category("辦公類別")
            .deploy();
    log.info("deploymentId:{};deploymentName:{}", deployment.getId(), deployment.getName());
    return "deploy success";
}

4.2 刪除流程定義

創建流程定義之後可能會覺得沒創建好,想重新再來。這個時候就需要刪除流程定義了。

public String deleteProcessDefinition() {
    // 根據流程定義的key刪除流程定義
    // 查詢指定key的所有版本的流程定義
    List<ProcessDefinition> pdList = repositoryService.createProcessDefinitionQuery().processDefinitionKey
            ("leaveBill2").list();
    for (ProcessDefinition processDefinition : pdList) {
        // 級聯刪除指定key的所有版本
        repositoryService.deleteDeployment(processDefinition.getDeploymentId(), true);
    }
    return "delete success";
}

由於重複部署流程定義會產生多個版本的流程定義,因此這裏選擇通過指定 key 獲取對應的流程定義集合,然後循環刪除。

4.3 啓動流程實例

部署流程定義之後,緊接着就是要啓動流程了。runtimeService 通過注入的方式得到。

public String startProcess() {
    Map<String, Object> variables = new HashMap<>();
    variables.put("userId", "張三");
    // 啓動流程,同時設置變量(因爲第一個任務節點的指定人是通過變量的方式獲取的)
    ProcessInstance pi = runtimeService.startProcessInstanceByKey("leaveBill2", variables);
    log.info("pid:{}={}", pi.getId(), pi.getProcessInstanceId());
    return "pid:" + pi.getId();
}

4.4 刪除流程實例

有時候,可能運行着的流程被人取消了,我們就需要刪除這個流程實例。

public String deleteProcessInstance(String piId, String reason) {
    runtimeService.deleteProcessInstance(piId, reason);
    return "piId:" + piId + "; reason:" + reason;
}

注:刪除流程實例和刪除流程定義是不同的。刪除流程實例就好比把一個 class 的對象給置爲 null 了,我們還可以重新 new 一個對象出來(對應着啓動流程實例)。而刪除流程定義則直接把這個 class 文件給刪除掉了。

4.5 獲取任務

已經啓動流程實例了,這個時候可以查看某人的任務了。taskService 通過注入的方式得到。

public String getTask(String userId) {
    List<Task> taskList = taskService.createTaskQuery()// 創建任務查詢對象
            .taskAssignee(userId)// 指定個人任務辦理人
            .list();
    for (Task task : taskList) {
        log.info("taskId:{};taskName:{};pid:{}", task.getId(), task.getName(), task.getProcessInstanceId());
    }
    return taskList.toString();
}

這裏可以獲取到任務 id 和 流程實例 id,任務 id 可以用來完成任務,流程實例 id 可以用來查看流程圖等。

4.6 完成任務

完成任務的時候需要用到任務 id,我們可以通過上面的獲取任務來獲得任務 id。

public String completeTask(String userId, String taskId, String agree) {
    Map<String, Object> variables = new HashMap<>();
    if ("張三".equals(userId)) {
        variables.put("agree1", agree);
    } else if ("李四".equals(userId)) {
        variables.put("agree2", agree);
    }
    // 完成任務,同時設置變量(因爲我的流程圖裏面,通過agree1和agree2變量的值來決定具體走哪條線)
    taskService.complete(taskId, variables);
    return "complete success";
}

4.7 查看流程執行圖

由於這塊代碼較多,就不展示出來了。這裏截取一張效果圖,內容比較簡陋。
流程執行圖


至此,springboot + activiti 的項目搭建就結束了。內容寫的比較簡單,主要是記錄一些步驟,方便複習。
代碼:https://github.com/caiworld/ActivitiTest2

參考:
idea 集成activiti工作流
SpringBoot - 工作流Activiti開發
Activiti7工作流+SpringBoot
以及一些其他的資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章