Flowable中文文檔全面解讀

一、 安裝和使用

安裝和使用Flowable需要先下載相應版本的Flowable,可以從官方網站、github等獲取,然後解壓後就可以開始使用。一般來說,使用Flowable分為三個主要步驟:1)建模工作流, 2)部署工作流,3)執行工作流

二、 工作流引擎核心模塊

Flowable工作流引擎的核心模塊包括:1)啟動子模塊,這個模塊負責載入其他模塊並啟動工作流引擎,2)存儲子模塊,負責管理工作流數據,3)運行時子模塊,這個子模塊負責提供運行時服務(例如任務分配、事件攔截器、作業操作等)

三、 啟動流程實例

啟動工作流引擎以及啟動工作流實例是Flowable的重要特性。啟動工作流實例是以一個定義好的BPMN 2.0 flow文件為模板來實現運行時流程能力的。在Flowable中,提供了多種啟動流程實例的方式,如通過key啟動、通過process definition id啟動等。


// 1. 獲取runtimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 2. 通過流程定義ID(key)來啟動流程實例
ProcessInstance instance = runtimeService.startProcessInstanceByKey("process_key");

四、 用戶任務

用戶任務是面向用戶的任務,需要手動完成。Flowable提供了一系列API來幫助程序員處理任務。在任務管理中,常見的操作包括:1)查詢待辦任務,2)領取任務,3)完成任務


// 1. 獲取TaskService
TaskService taskService = processEngine.getTaskService();
// 2. 獲取任務查詢對象
TaskQuery query = taskService.createTaskQuery();
// 3. 查詢指派給當前用戶的所有任務
query.taskAssignee("當前用戶ID");

// 獲取任務列表
List<Task> taskList = query.list();
// 完成任務
Task task = taskList.get(0);
taskService.complete(task.getId());

五、 定時器

定時器在Flowable中可以被稱之為作業,在一個工作流程中,發生的所有事件都是非常重要的,當發生事件時,Flowable需要在特定的時間觸發相應的操作。Flowable提供了一種適用於非同步事件處理的調度模式,這種模式基於Java Timer和Spring Task。 在Flowable中,定時器由「Timer Event」元素提供,可安排計劃來調度任務的運行。在處理內存資源緊張的情況下,Flowable定時器支持非同步處理事件,使輕量的流程引擎可以在決策期間執行長時間運行的操作。


// 1. 通過JobExecutor註冊定時器Service
JobExecutor jobExecutor = new JobExecutor();
FlowableScheduler bpmnScheduler = new BpmnJobScheduler(jobExecutor);
processEngineConfiguration.setBpmnJobExecutor(jobExecutor);

// 2. 添加定時器事件
TimerEventDefinition timerEventDefinition = eventDefs[0].querySingle("timerEventDefinition");
Definitions defs = rootElement.querySingle("definitions");
Process process = defs.querySingle("process");
UserTask task = process.querySingle("userTask");
BoundaryEvent boundaryEvent = task.getBoundaryEvent();
boundaryEvent.setAttachedToRef(task.getId());
boundaryEvent.setValues(flowJsonDelegate);

EventSubscriptionEntity subscriptionEntity = (EventSubscriptionEntity) runtimeService.createEventSubscriptionQuery()
                                                    .eventType(TimerEventEntity.EVENT_TYPE)
                                                    .processInstanceId(instance.getId())
                                                    .activityId(task.getId())
                                                    .singleResult();

// 啟動定時器
bpmnScheduler.schedule(new TimerEventHandler(subscriptionEntity));

六、事件攔截器

事件攔截器是Flowable流程引擎中實現AOP機制的一種方式。它為業務程序操作提供了一些手段來對流程狀態進行觀察和控制。流程執行過程中的各種事件事件(任務分配、任務開始、任務完成等)都會被攔截並分發到相應的事件監聽器中。 通過配置相關的事件監聽器來確定攔截器將生成哪些事件,然後將這些事件與其他業務邏輯相結合,來實現對流程執行的控制。


public class CustomProcessEngineConfiguration extends StandaloneProcessEngineConfiguration {
    @Override
    public EventDispatcher getEventDispatcher() {
        if (getCustomEventDispatchers().isEmpty()) {
            return super.getEventDispatcher();
        } else {
            EventDispatcherImpl eventDispatcher = new EventDispatcherImpl(getClock(), getExecutionListeners(), getTaskListeners(), 
                                                                          createEventListenerGroups(), getCustomEventDispatchers());
            eventDispatcher.setAsyncExecutor(asyncExecutor);
            return eventDispatcher;
        }
    }
    
    protected Map<String, EventDispatcher> getCustomEventDispatchers() {
        return customEventDispatchers;
    }
}

EventDispatcher dispatcher = ((ProcessEngineImpl) processEngine).getProcessEngineConfiguration().getEventDispatcher();
List<EventDispatcher> eventDispatchers = new ArrayList();
eventDispatchers.add(dispatcher);

CustomProcessEngineConfiguration config = new CustomProcessEngineConfiguration();
config.setCustomEventDispatchers(eventDispatchers);
ProcessEngine engine = config.buildProcessEngine();

七、 資料庫鎖定機制

在多用戶環境下,為了防止並發問題,需要使用特殊技術來控制數據訪問,例如:樂觀鎖和悲觀鎖。Flowable引擎通過使用基於文件鎖的樂觀鎖機制來管理實例訪問,這種機制可以確保數據的一致性,同時也保證了較高的並發性和可擴展性。


<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

<bean id="processSessionFactory" class="org.apache.ibatis.session.defaults.DefaultSqlSessionFactory">
    <constructor-arg ref="processDataSource"/>
    <property name="configuration" ref="processConfiguration"/>
</bean>

<bean id="processConfiguration" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="org.flowable.engine.mappers" />
    <property name="processDataSource" ref="processDataSource" />
    <property name="processSessionFactory" ref="processSessionFactory" />
    <property name="sqlSessionFactoryBeanName" value="processSessionFactory" />
</bean>

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/249048.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:31
下一篇 2024-12-12 13:31

相關推薦

  • Python應用程序的全面指南

    Python是一種功能強大而簡單易學的編程語言,適用於多種應用場景。本篇文章將從多個方面介紹Python如何應用於開發應用程序。 一、Web應用程序 目前,基於Python的Web…

    編程 2025-04-29
  • 使用Spire.PDF進行PDF文檔處理

    Spire.PDF是一款C#的PDF庫,它可以幫助開發者快速、簡便地處理PDF文檔。本篇文章將會介紹Spire.PDF庫的一些基本用法和常見功能。 一、PDF文檔創建 創建PDF文…

    編程 2025-04-29
  • Python讀取中文

    Python是一種高級編程語言,被廣泛地應用於各種領域中。而處理中文數據也是其中重要的一部分。本文將介紹在Python中如何讀取中文,為大家提供指導和幫助。 一、讀取中文文件 在P…

    編程 2025-04-29
  • Python zscore函數全面解析

    本文將介紹什麼是zscore函數,它在數據分析中的作用以及如何使用Python實現zscore函數,為讀者提供全面的指導。 一、zscore函數的概念 zscore函數是一種用於標…

    編程 2025-04-29
  • jQuery Datatable分頁中文

    jQuery Datatable是一個非常流行的數據表插件,它可以幫助您快速地在頁面上創建搜索、過濾、排序和分頁的數據表格。不過,它的默認設置是英文的,今天我們就來探討如何將jQu…

    編程 2025-04-29
  • Python計算中文字元個數

    本文將從多個方面對Python計算中文字元個數進行詳細的闡述,包括字元串長度計算、正則表達式統計和模塊使用方法等內容。 一、字元串長度計算 在Python中,計算字元串長度是非常容…

    編程 2025-04-29
  • 全面解讀數據屬性r/w

    數據屬性r/w是指數據屬性的可讀/可寫性,它在程序設計中扮演著非常重要的角色。下面我們從多個方面對數據屬性r/w進行詳細的闡述。 一、r/w的概念 數據屬性r/w即指數據屬性的可讀…

    編程 2025-04-29
  • Python計算機程序代碼全面介紹

    本文將從多個方面對Python計算機程序代碼進行詳細介紹,包括基礎語法、數據類型、控制語句、函數、模塊及面向對象編程等。 一、基礎語法 Python是一種解釋型、面向對象、動態數據…

    編程 2025-04-29
  • Python3亂碼轉中文

    本文將詳細介紹如何轉換Python3中的亂碼為中文字元,幫助Python3開發工程師更好的處理中文字元的問題。 一、Python3中文亂碼的原因 在Python3中,中文字元使用的…

    編程 2025-04-29
  • Python爬蟲文檔報告

    本文將從多個方面介紹Python爬蟲文檔的相關內容,包括:爬蟲基礎知識、爬蟲框架及常用庫、爬蟲實戰等。 一、爬蟲基礎知識 1、爬蟲的定義: 爬蟲是一種自動化程序,通過模擬人的行為在…

    編程 2025-04-28

發表回復

登錄後才能評論