自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Flowable工作流引擎的科普與實踐

開發(fā) 前端
在傳統(tǒng)的手動審批系統(tǒng)中,開發(fā)人員需要從頭開始設(shè)計和實現(xiàn)整個審批流程,包括流程邏輯、狀態(tài)跟蹤、任務(wù)分配等。這可能需要大量的時間和精力,尤其是在涉及到復(fù)雜的業(yè)務(wù)場景時。

一.引言

當(dāng)我們在日常工作和業(yè)務(wù)中需要進(jìn)行各種審批流程時,可能會面臨一系列技術(shù)和業(yè)務(wù)上的挑戰(zhàn)。手動處理這些審批流程可能會導(dǎo)致開發(fā)成本的增加以及業(yè)務(wù)復(fù)雜度的上升。在這種情況下,引入工作流引擎能夠帶來很多好處,讓我們一起來看看:

  1. 開發(fā)成本的挑戰(zhàn):

在傳統(tǒng)的手動審批系統(tǒng)中,開發(fā)人員需要從頭開始設(shè)計和實現(xiàn)整個審批流程,包括流程邏輯、狀態(tài)跟蹤、任務(wù)分配等。這可能需要大量的時間和精力,尤其是在涉及到復(fù)雜的業(yè)務(wù)場景時。

使用工作流引擎,開發(fā)人員可以利用其強大的流程建模和執(zhí)行功能,快速搭建審批系統(tǒng)。工作流引擎提供了圖形化的流程設(shè)計工具,讓流程建模變得簡單易懂。這樣,開發(fā)人員可以專注于業(yè)務(wù)邏輯的實現(xiàn),大大降低了開發(fā)成本和周期。

  1. 業(yè)務(wù)復(fù)雜度的挑戰(zhàn):
  • 在實際的審批流程中,往往涉及到多個步驟、多個角色、多個條件等復(fù)雜情況。手動處理這些復(fù)雜的業(yè)務(wù)流程可能會導(dǎo)致流程不一致、流程控制不清晰等問題,增加了業(yè)務(wù)的復(fù)雜度和錯誤的可能性。
  • 工作流引擎提供了靈活的條件判斷和分支網(wǎng)關(guān)功能,可以輕松處理復(fù)雜的審批流程。不同的業(yè)務(wù)場景可以在流程圖中得到清晰的表達(dá),從而確保流程的邏輯一致性和可控性。同時,F(xiàn)lowable引擎支持動態(tài)變量和表單的設(shè)置,使得審批系統(tǒng)能夠滿足不同業(yè)務(wù)場景的靈活需求。

通過引入工作流引擎,我們可以克服手動處理審批流程所帶來的開發(fā)成本高和業(yè)務(wù)復(fù)雜度的挑戰(zhàn)。它使得開發(fā)人員能夠更專注于業(yè)務(wù)邏輯的實現(xiàn),快速構(gòu)建符合實際需求的審批系統(tǒng)。同時,流程圖的可視化設(shè)計和條件判斷的支持,使得業(yè)務(wù)流程更加清晰、透明,降低了錯誤發(fā)生的概率,提高了審批過程的效率和準(zhǔn)確性。這將為企業(yè)帶來更高的效益和競爭力。

圖片圖片

二.技術(shù)選型

目前市面上比較主流的幾個工作流引擎包括Activiti、Flowable、Camunda等,體系較為成熟,使用最為廣泛的是activiti,flowable跟activiti本質(zhì)上沒什么區(qū)別,是由activiti改版而來,但是兩者后續(xù)發(fā)展路線則不一樣,Activiti后續(xù)發(fā)展重心是在商業(yè)版與云上面,并未對核心功能與性能優(yōu)化上有過多的跟進(jìn)優(yōu)化,而flowable當(dāng)下重心則是針對功能性、擴(kuò)展性、性能上進(jìn)行迭代優(yōu)化。

圖片圖片

當(dāng)然,具體選型還是要看業(yè)務(wù)實際的需要,目前activiti迭代的方向并不是當(dāng)下我們業(yè)務(wù)所需要的,我們更重視性能、擴(kuò)展性這一塊,而flowbale與Camunda之間為什么選擇了flowable呢,則是因為flowable社區(qū)較為活躍,遇到并處理問題上更為效率,并且面對多節(jié)點審批時,異步任務(wù)是提升吞吐率的優(yōu)質(zhì)之選。

圖片圖片

下面我將簡單介紹下flowable的一些功能以及模塊。

三.Flowable引擎介紹

3.1 基礎(chǔ)元素

  1. 流程定義(Process Definition):
  • 流程定義是業(yè)務(wù)流程的抽象表示,它描述了流程中各個環(huán)節(jié)的順序和執(zhí)行邏輯。

在Flowable中,流程定義通常使用BPMN 2.0標(biāo)準(zhǔn)(Business Process Model and Notation)進(jìn)行建模,可以通過Flowable Modeler進(jìn)行圖形化設(shè)計。

  1. 流程實例(Process Instance):
  • 流程實例是流程定義的一個具體執(zhí)行實例。每當(dāng)一個流程啟動時,就會創(chuàng)建一個新的流程實例,這個實例將遵循流程定義中規(guī)定的執(zhí)行邏輯。
  • 每個流程實例都有一個唯一的標(biāo)識符,用于跟蹤和管理流程的執(zhí)行狀態(tài)。
  1. 任務(wù)(Task):
  • 任務(wù)表示流程中的具體工作單元,需要由參與者(用戶或系統(tǒng))完成。
  • 在Flowable中,任務(wù)可以是用戶任務(wù)(Human Task)、服務(wù)任務(wù)(Service Task)、腳本任務(wù)(Script Task)等類型。
  1. 網(wǎng)關(guān)(Gateway):
  • 網(wǎng)關(guān)用于在流程中進(jìn)行條件分支和合并操作,根據(jù)一定的條件來控制流程的走向。
  • Flowable提供了多種類型的網(wǎng)關(guān),如排他網(wǎng)關(guān)(Exclusive Gateway)、并行網(wǎng)關(guān)(Parallel Gateway)等。
  1. 執(zhí)行(Execution):
  • 執(zhí)行代表了流程中的一個具體執(zhí)行狀態(tài),包括當(dāng)前的節(jié)點、變量值等信息。
  • 當(dāng)流程實例執(zhí)行時,會產(chǎn)生一系列執(zhí)行對象,它們共同組成了流程的執(zhí)行路徑。
  1. 變量(Variable):
  • 變量用于在流程中傳遞和保存數(shù)據(jù),可以在流程的不同節(jié)點間進(jìn)行傳遞和共享。
  • Flowable允許在流程實例中動態(tài)添加、修改和刪除變量。
  1. 監(jiān)聽器(Listener):
  • 監(jiān)聽器用于在流程的不同生命周期階段監(jiān)聽事件,例如流程啟動、流程結(jié)束、任務(wù)分配等事件。
  • Flowable支持多種類型的監(jiān)聽器,開發(fā)者可以根據(jù)需求自定義監(jiān)聽邏輯。

圖片圖片

這些是Flowable中的一些基礎(chǔ)元素,它們構(gòu)成了流程引擎的核心。通過這些元素,我們可以靈活地設(shè)計和管理復(fù)雜的業(yè)務(wù)流程,使得流程執(zhí)行更加高效、透明和可控。

3.2 API說明

在調(diào)用開始之前,我們簡單說明一下各個api的作用以及應(yīng)用場景:

  1. RepositoryService:
  • RepositoryService用于管理流程和流程部署相關(guān)的操作。
  • 可以通過該Service部署、刪除、查詢流程定義,以及獲取流程定義的資源文件等。
  1. RuntimeService:
  • RuntimeService用于管理流程實例的啟動、掛起、終止等操作。
  • 可以通過該Service啟動流程實例,查詢流程實例狀態(tài),設(shè)置流程變量等。
  1. TaskService:
  • TaskService用于管理任務(wù)的創(chuàng)建、完成、分配等操作。
  • 可以通過該Service查詢用戶任務(wù)、完成任務(wù),指定任務(wù)的辦理人等。
  1. IdentityService:
  • IdentityService用于管理用戶、組和用戶組的操作。
  • 可以通過該Service創(chuàng)建、刪除、查詢用戶和組,將用戶加入到用戶組等。
  1. HistoryService:
  • HistoryService用于查詢流程實例和任務(wù)的歷史數(shù)據(jù)。
  • 可以通過該Service查詢已完成的流程實例、已完成的任務(wù),以及歷史的流程變量值等。
  1. ManagementService:
  • ManagementService用于執(zhí)行一些底層的管理操作,如數(shù)據(jù)庫表的創(chuàng)建、刪除,作業(yè)的執(zhí)行,引擎的配置等。
  • 一般情況下,開發(fā)人員不需要直接使用ManagementService,因為它執(zhí)行的操作較為底層。

3.3系統(tǒng)數(shù)據(jù)表介紹

啟動后會自動生成一些內(nèi)置的系統(tǒng)表(如果不想自動生成可以通過配置關(guān)閉),這里簡單介紹一下表的含義:

ACT_HI_*: 歷史數(shù)據(jù)表,例如:

表名

含義

ACT_HI_PROCINST

歷史流程實例表,存儲已完成的流程實例信息,包括流程開始時間、結(jié)束時間等。

ACT_HI_TASKINST

歷史任務(wù)實例表,存儲已完成的任務(wù)實例信息,包括任務(wù)開始時間、結(jié)束時間、辦理人等。

ACT_HI_VARIABLE

歷史流程變量表,用于存儲在流程運行時設(shè)置的變量信息。

ACT_RU_*: 運行時的數(shù)據(jù)表,節(jié)點結(jié)束時清除,例如:

表名

含義

ACT_RU_EXECUTION

運行時流程執(zhí)行實例表,存儲當(dāng)前正在執(zhí)行的流程實例信息。

ACT_RU_TASK

運行時任務(wù)表,存儲當(dāng)前正在執(zhí)行的任務(wù)信息。

ACT_RU_VARIABLE

運行時流程變量表,用于存儲在流程運行時設(shè)置的變量信息。

另外,flowable支持定期清理歷史數(shù)據(jù),業(yè)務(wù)側(cè)可以定義一個時間范圍,超過時間范圍可以認(rèn)為數(shù)據(jù)可以被清理,系統(tǒng)內(nèi)部會自行將數(shù)據(jù)物理刪除,為歷史表做瘦身操作。

不過我們業(yè)務(wù)側(cè)接入的時候,往往業(yè)務(wù)需要創(chuàng)建幾個符合我們具體業(yè)務(wù)場景的表,例如工單表、任務(wù)表雖然框架提供了,但是并沒有記錄詳細(xì)的狀態(tài),這些狀態(tài)是我們業(yè)務(wù)自己定義的,所以需要額外創(chuàng)建業(yè)務(wù)工單表、審批任務(wù)(節(jié)點)表、流水表等來進(jìn)行數(shù)據(jù)上的冗余來滿足實際的業(yè)務(wù)場景。

四.流程圖建模繪制

4.1 BPMN 2.0協(xié)議

我們可以通過可視化后臺繪制流程建模,生成BPMN格式的文件,那么BMPN又是什么呢?

BPMN(Business Process Model and Notation)是一種用于建模業(yè)務(wù)流程的標(biāo)準(zhǔn)化符號和語法,用于描述業(yè)務(wù)流程的各個環(huán)節(jié)和活動。BPMN的最新版本是BPMN 2.0,它是業(yè)務(wù)流程建模領(lǐng)域的國際標(biāo)準(zhǔn),由OMG(Object Management Group)制定和發(fā)布。

BPMN 2.0的主要目標(biāo)是提供一種統(tǒng)一的標(biāo)準(zhǔn),使得不同人員和組織能夠使用相同的符號和語法來建模和理解業(yè)務(wù)流程,從而增加流程的可視化和可讀性。

它具有以下特點和優(yōu)勢:

  1. 圖形化表示:
  • BPMN 2.0使用圖形化符號來表示業(yè)務(wù)流程,包括開始事件、結(jié)束事件、任務(wù)、網(wǎng)關(guān)等。這些符號使得流程的設(shè)計和閱讀更加直觀和易懂。
  1. 豐富的元素:
  • BPMN 2.0定義了豐富的元素和連接方式,可以描述復(fù)雜的業(yè)務(wù)流程,包括順序流、消息流、時間流等。
  1. 流程分支和合并:
  • BPMN 2.0支持多種類型的網(wǎng)關(guān)元素,如排他網(wǎng)關(guān)、并行網(wǎng)關(guān)等,用于實現(xiàn)條件分支和合并,使得流程的走向更加靈活。
  1. 子流程支持:
  • BPMN 2.0允許將復(fù)雜的業(yè)務(wù)流程分解為多個子流程,使得整體流程更易于管理和維護(hù)。
  1. 擴(kuò)展性:
  • BPMN 2.0支持自定義屬性和擴(kuò)展元素,使得業(yè)務(wù)流程模型能夠滿足特定業(yè)務(wù)需求。
  1. 與執(zhí)行引擎的結(jié)合:
  • BPMN 2.0是與執(zhí)行引擎(如Flowable)無縫集成的,這使得通過工作流引擎執(zhí)行流程變得更加高效和自動化。

4.2 繪制

我們可以從Flowable官網(wǎng)下載flowable-ui部署到本地來啟動可視化后臺,可以使用在線的Flowable Modeler來繪制,這里我們使用官網(wǎng)的flowable-ui來繪制。

具體下載啟動過程我就不過多贅述了,flowable-ui是基于 springboot2.0開發(fā)的,可以直接以下方式來啟動:

java -jar flowable-ui.war

啟動成功后如圖所示:

圖片圖片

我們打開建模器應(yīng)用程序并點擊【創(chuàng)建流程】按鈕,我們可以給模型進(jìn)行一個簡單的定義.

圖片圖片

如圖繪制了一個最簡單的流程建模

圖片圖片

我們也可以給用戶任務(wù)分配一些基礎(chǔ)屬性,這里我們配置一個固定用戶, 當(dāng)然這里也支持占位符來動態(tài)控制

圖片圖片

Image.png

圖片圖片

這樣一個最簡單的流程建模(不含復(fù)雜節(jié)點、網(wǎng)關(guān)等)就繪制完畢了,繪制完成后會生成一個xml文件,

接下來我會從導(dǎo)入到執(zhí)行來執(zhí)行執(zhí)行一遍該流程。

五.快速開始

5.1 導(dǎo)入starter

<dependency>
            <groupId>org.flowable</groupId>
            <artifactId>flowable-spring-boot-starter</artifactId>
            <version>6.6.0</version>
        </dependency>

5.2 導(dǎo)入建模

@Test
 public void createConfig() throws Exception{
    File file = new File("/Users/xxx/Documents/flowbale/model/testModel.bpmn20.xml");
    final FileInputStream fileInputStream = new FileInputStream(file);
    final Deployment deploy = repositoryService.createDeployment()
                .addInputStream("testModel.bpmn20.xml", fileInputStream).tenantId("類似于業(yè)務(wù)線的id,可以做數(shù)據(jù)隔離用")
                .name("testModel").deploy();

    System.out.println("id=" + deploy.getId());
 }

5.3 查詢流程建模的基本信息

@Test
    public void getProcessDefinition() {

        final ProcessDefinition rst =
                repositoryService.createProcessDefinitionQuery().processDefinitionKey("testModel").orderByProcessDefinitionVersion().desc().list().get(0);

        System.out.println(rst.toString());
    }

5.4 創(chuàng)建審批工單

// processDefinitionKey 流程建模的key
// businessId 具有業(yè)務(wù)屬性的id
// variableMap變量的map 結(jié)果會存入 ACT_RU_VARIABLE表中,如果審批人傳入的是變量就需要再節(jié)點執(zhí)行前將變量傳入到系統(tǒng)中
Map<String, Object> variableMap = new HashMap();
variableMap.put("testUserList", Lists.newArrayList("nick","jack","tony"));
String processDefinitionKey = "testModel";
Long businessId = 1L;
String tenantId = "1001";
runtimeService.startProcessInstanceByKeyAndTenantId(processDefinitionKey, businessId + "", variableMap, tenantId);

5.5 獲取待審批工單

final List<Task> taskList = taskService.createTaskQuery().taskAssignee("jack").list()

5.6 審批工單

Map<String, Object> variableMap = new HashMap();
// 我們自己定義了一個內(nèi)部標(biāo)準(zhǔn)化字段,flag代表著節(jié)點是通過還是駁回,在互斥網(wǎng)關(guān)判斷通過駁回的時候會用到。
variableMap.put("flag", 1);
taskService.complete(taskId), variableMap);

5.7 事件監(jiān)聽

我們通過上述用例了解了一個工單是如何操作流轉(zhuǎn)的,但是一個完整的審批服務(wù)是應(yīng)該有消息推送的,當(dāng)審批節(jié)點到達(dá)某個人需要提醒他進(jìn)行審批操作,或者審批工單結(jié)束了需要通知發(fā)起人,我們應(yīng)該如何操作呢?Flowable提供了便攜的事件監(jiān)聽器,不需要我們額外編寫代碼來判斷是否到達(dá)相應(yīng)的節(jié)點,我們這里常用的就是節(jié)點創(chuàng)建、節(jié)點完成、流程結(jié)束等。

Flowable支持的事件有幾十種,具體大家請自行去官網(wǎng)參考,下面僅展示“流程結(jié)束事件”監(jiān)聽器的代碼用例:

package com.zhuanzhuan.workflow_engine.config;

import com.zhuanzhuan.workflow_engine.listener.*;
import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType;
import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher;
import org.flowable.spring.SpringProcessEngineConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;

/**
 * @author:Live
 * @desc:
 * @date: 19:55 2023/1/13
 */
@Configuration
@Slf4j
public class FlowableListenerConfiguration implements ApplicationListener<ContextRefreshedEvent> {

    @Autowired
    private SpringProcessEngineConfiguration configuration;

   
    @Autowired
    private ProcessEndListener processEndListener;
  

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        FlowableEventDispatcher dispatcher = configuration.getEventDispatcher();
      
        dispatcher.addEventListener(processEndListener, FlowableEngineEventType.PROCESS_COMPLETED);
       
    }
}
package com.zhuanzhuan.workflow_engine.listener;

import com.bj58.zhuanzhuan.zzarch.common.util.JsonUtil;
import com.zhuanzhuan.workflow_engine.entity.dto.WorkflowOrderDTO;
import com.zhuanzhuan.workflow_engine.enums.CurrentFlagEnum;
import com.zhuanzhuan.workflow_engine.enums.WorkflowStateEnum;
import com.zhuanzhuan.workflow_engine.mq.MqConstant;
import com.zhuanzhuan.workflow_engine.mq.body.ProcessExchangeMsgBody;
import com.zhuanzhuan.workflow_engine.mq.producer.ProducerHandler;
import com.zhuanzhuan.workflow_engine.service.WorkflowOrderBizService;
import com.zhuanzhuan.workflow_engine.wrapper.FlowableWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.engine.delegate.event.impl.FlowableEntityEventImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @author:Live
 * @desc:
 * @date: 19:34 2023/1/13
 */
@Component
@Slf4j
public class ProcessEndListener implements FlowableEventListener {


    @Override
    public void onEvent(FlowableEvent flowableEvent) {
      // 流程結(jié)束的監(jiān)聽器,發(fā)送mq、給發(fā)起人發(fā)送消息在此進(jìn)行
    }
    
    @Override
    public boolean isFailOnException() {
        // 拋異常, 不姑息
        return true;
    }

    @Override
    public boolean isFireOnTransactionLifecycleEvent() {
        // event觸發(fā)時機跟著 getOnTransaction走
        return true;
    }

    @Override
    public String getOnTransaction() {
        // 提交事務(wù)后觸發(fā)
        return TransactionState.COMMITTED.name();
    }

}

六.總結(jié)

以上就是Flowable工作流引擎的簡介以及基本用法,我們實際生產(chǎn)建設(shè)過程中,還需要基于框架進(jìn)行拓展開發(fā)來滿足我們項目的實際需要,例如是否需要引入用戶組、權(quán)限管理的模塊、是否存在性能問題從而引入異步任務(wù)的模塊、是否需要冗余業(yè)務(wù)表來滿足定制化查詢的需求,這些都屬于擴(kuò)展玩法,需要我們根據(jù)實際需求按需接入。畢竟沒有最好的架構(gòu),只有最適合的架構(gòu),選擇適合自己的才是最重要的。

七.參考資料

1.flowable官方文檔 https://www.flowable.org/documentation.html
2.技術(shù)選型參考 https://www.zhihu.com/question/59274016/answer/2398240513

關(guān)于作者 

王銳剛,線上回收業(yè)務(wù)后端開發(fā)工程師

責(zé)任編輯:武曉燕 來源: 轉(zhuǎn)轉(zhuǎn)技術(shù)
相關(guān)推薦

2021-10-14 11:34:05

技術(shù)工作流引擎

2024-07-18 08:38:31

2015-07-14 09:26:28

微型工作流引擎設(shè)計

2023-01-04 08:02:16

工作流架構(gòu)設(shè)計

2011-12-14 09:58:58

JavajBPM

2023-07-05 09:48:44

Activiti部署

2022-07-07 08:38:15

Springflowable引擎

2009-06-11 14:43:34

jbpm工作流引擎jBPM搭建

2009-09-01 18:26:23

C#工作流引擎

2022-07-14 10:06:20

工作流引擎營銷自動化vivo

2024-10-17 08:39:32

2022-02-21 10:50:28

SvnGitHub分支

2021-03-12 06:44:09

Argo Workfl開源項目

2009-03-03 09:13:36

工作流BPM業(yè)務(wù)流程

2021-12-17 08:39:39

SpringbootActiviti網(wǎng)關(guān)路由

2024-04-07 00:06:00

Rust編程技巧

2014-07-31 17:03:12

2009-06-11 14:33:11

jbpm工作流引擎什么是jbpm

2023-06-12 08:01:57

Camunda工作流引擎

2012-05-18 16:55:34

JavaBonita
點贊
收藏

51CTO技術(shù)棧公眾號