精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

工作流引擎架構設計

開發 架構
節點狀態變更可以有申請人撤回,審批人同意,審批人駁回。那么在駁回時,可以直接駁回到開始節點,流程結束,也可以到上一個節點。更復雜一些,甚至可以到前面流程的任意一個節點。

最近開發的安全管理平臺新增了很多工單申請流程需求,比如加白申請,開通申請等等。最開始的兩個需求,為了方便,也沒多想,就直接開發了對應的業務代碼。

但隨著同類需求不斷增多,感覺再這樣寫可要累死人,于是開始了工作流引擎的開發之路。查找了一些資料之后,開發了現階段的工作流引擎,文章后面會有介紹。

雖然現在基本上能滿足日常的需求,但感覺還不夠智能,還有很多的優化空間,所以正好借此機會,詳細了解了一些完善的工作流引擎框架,以及在架構設計上需要注意的點,形成了這篇文章,分享給大家。

什么是工作流

先看一下維基百科對于工作流的定義:

工作流(Workflow),是對工作流程及其各操作步驟之間業務規則的抽象、概括描述。工作流建模,即將工作流程中的工作如何前后組織在一起的邏輯和規則,在計算機中以恰當的模型表達并對其實施計算。

工作流要解決的主要問題是:為實現某個業務目標,利用計算機在多個參與者之間按某種預定規則自動傳遞文檔、信息或者任務。

簡單來說,工作流就是對業務的流程化抽象。WFMC(工作流程管理聯盟) 給出了工作流參考模型如下:

圖片

舉一個例子,比如公司辦公的 OA 系統,就存在大量的申請審批流程。而在處理這些流程時,如果每一個流程都對應一套代碼,顯然是不現實的,這樣會造成很大程度上的代碼冗余,而且開發工作量也會驟增。

這個時候就需要一個業務無關的,高度抽象和封裝的引擎來統一處理。通過這個引擎,可以靈活配置工作流程,并且可以自動化的根據配置進行狀態變更和流程流轉,這就是工作流引擎。

簡單的工作流

那么,一個工作流引擎需要支持哪些功能呢?

這個問題并沒有一個標準答案,需要根據實際的業務場景和需求來分析。在這里,我通過一個工單流程的演進,從簡單到復雜,循序漸進地介紹一下都需要包含哪些基礎功能。

最簡單流程

圖片

最簡單的一個流程工單,申請人發起流程,每個節點審批人逐個審批,最終流程結束。

會簽

圖片

在這個過程中,節點分成了兩大類:簡單節點和復雜節點。

簡單節點處理邏輯不變,依然是處理完之后自動到下一個節點。復雜節點比如說會簽節點,則不同,需要其下的所有子節點都處理完成,才能到下一個節點。

并行

圖片

同樣屬于復雜節點,其任何一個子節點處理完成后,都可以進入到下一個節點。

條件判斷

圖片

需要根據不同的表單內容進入不同的分支流程。

舉一個例子,比如在進行休假申請時,請假一天需要直屬領導審批,如果大于三天則需要部門領導審批。

動態審批人

圖片

審批節點的審批人需要動態獲取,并且可配置。

審批人的獲取方式可以分以下幾種:

  • 固定審批人
  • 從申請表單中獲取
  • 根據組織架構,動態獲取
  • 從配置的角色組或者權限組中獲取

撤銷和駁回

圖片

節點狀態變更可以有申請人撤回,審批人同意,審批人駁回。那么在駁回時,可以直接駁回到開始節點,流程結束,也可以到上一個節點。更復雜一些,甚至可以到前面流程的任意一個節點。

自動化節點

圖片

有一些節點是不需要人工參與的,比如說聯動其他系統自動處理,或者審批節點有時間限制,超時自動失效。

個性化通知

節點審批之后,可以配置不同的通知方式來通知相關人。

以上是我列舉的一些比較常見的需求點,還有像加簽,代理,腳本執行等功能,如果都實現的話,應該會是一個龐大的工作量。當然了,如果目標是做一個商業化產品的話,功能還是需要更豐富一些的。

但把這些常見需求點都實現的話,應該基本可以滿足大部分的需求了,至少對于我們系統的工單流程來說,目前是可以滿足的。

工作流引擎對比

既然這是一個常見的需求,那么需要我們自己來開發嗎?市面上有開源項目可以使用嗎?

答案是肯定的,目前,市場上比較有名的開源流程引擎有 Osworkflow、Jbpm、Activiti、Flowable、Camunda 等等。其中:Jbpm、Activiti、Flowable、Camunda 四個框架同宗同源,祖先都是 Jbpm4,開發者只要用過其中一個框架,基本上就會用其它三個了。

Osworkflow

Osworkflow 是一個輕量化的流程引擎,基于狀態機機制,數據庫表很少。Osworkflow 提供的工作流構成元素有:步驟(step)、條件(conditions)、循環(loops)、分支(spilts)、合并(joins)等,但不支持會簽、跳轉、退回、加簽等這些操作,需要自己擴展開發,有一定難度。

如果流程比較簡單,Osworkflow 是一個很不錯的選擇。

JBPM

JBPM 由 JBoss 公司開發,目前最高版本是 JPBM7,不過從 JBPM5 開始已經跟之前不是同一個產品了,JBPM5 的代碼基礎不是 JBPM4,而是從 Drools Flow 重新開始的。基于 Drools Flow 技術在國內市場上用的很少,所有不建議選擇 JBPM5 以后版本。

JBPM4 誕生的比較早,后來 JBPM4 創建者 Tom Baeyens 離開 JBoss,加入 Alfresco 后很快推出了新的基于 JBPM4 的開源工作流系統 Activiti,另外 JBPM 以 hibernate 作為數據持久化 ORM 也已不是主流技術。

Activiti

Activiti 由 Alfresco 軟件開發,目前最高版本 Activiti7。Activiti 的版本比較復雜,有 Activiti5、Activiti6、Activiti7 幾個主流版本,選型時讓人暈頭轉向,有必要先了解一下 Activiti 這幾個版本的發展歷史。

Activiti5 和 Activiti6 的核心 leader 是 Tijs Rademakers,由于團隊內部分歧,在 2017 年 Tijs Rademakers 離開團隊,創建了后來的 Flowable。Activiti6 以及 Activiti5 代碼已經交接給了 Salaboy 團隊,Activiti6 以及 Activiti5 的代碼官方已經暫停維護了。

Salaboy 團隊目前在開發 Activiti7 框架,Activiti7 內核使用的還是 Activiti6,并沒有為引擎注入更多的新特性,只是在 Activiti 之外的上層封裝了一些應用。

Flowable

Flowable 是一個使用 Java 編寫的輕量級業務流程引擎,使用 Apache V2 license 協議開源。2016 年 10 月,Activiti 工作流引擎的主要開發者離開 Alfresco 公司并在 Activiti 分支基礎上開啟了 Flowable 開源項目。基于 Activiti v6 beta4 發布的第一個 Flowable release 版本為 6.0。

Flowable 項目中包括 BPMN(Business Process Model and Notation)引擎、CMMN(Case Management Model and Notation)引擎、DMN(Decision Model and Notation)引擎、表單引擎(Form Engine)等模塊。

相對開源版,其商業版的功能會更強大。以 Flowable6.4.1 版本為分水嶺,大力發展其商業版產品,開源版本維護不及時,部分功能已經不再開源版發布,比如表單生成器(表單引擎)、歷史數據同步至其他數據源、ES 等。

Camunda

Camunda 基于 Activiti5,所以其保留了 PVM,最新版本 Camunda7.15,保持每年發布兩個小版本的節奏,開發團隊也是從 Activiti 中分裂出來的,發展軌跡與 Flowable 相似,同時也提供了商業版,不過對于一般企業應用,開源版本也足夠了。

以上就是每個項目的一個大概介紹,接下來主要對比一下 Jbpm、Activiti、Flowable 和 Camunda。只看文字的話可能對它們之間的關系還不是很清楚,所以我畫了一張圖,可以更清晰地體現每個項目的發展軌跡。

圖片

那么,如果想要選擇其中一個項目來使用的話,應該如何選擇呢?我羅列了幾項我比較關注的點,做了一張對比表格,如下:


Activiti 7

Flowable 6

Camunda

JBPM 7

流程協議

BPMN2.0、XPDL、PDL

BPMN2.0、XPDL、XPDL

BPMN2.0、XPDL、XPDL

BPMN2.0

開源情況

開源

商業和開源版

商業和開源版

開源

開發基礎

JBPM4

Activiti 5 & 6

Activiti 5

版本 5 之后 Drools Flow

數據庫

Oracle、SQL Server、MySQL

Oracle、SQL Server、MySQL、postgre

Oracle、SQL Server、MySQL、postgre

MySQL,postgre

架構

spring boot 2

spring boot 1.5

spring boot 2

Kie

運行模式

獨立運行和內嵌

獨立運行和內嵌

獨立運行和內嵌

-

流程設計器

AngularJS

AngularJS

bpmn.js

-

活躍度

活躍

相對活躍

相對活躍

-

表數量

引入 25 張表

引入 47 張表

引入 19 張表

-

jar 包數量

引入 10 個 jar

引入 37 個 jar

引入 15 個 jar

-

Flowable 應用舉例

如果選擇使用開源項目來開發自己的引擎,或者嵌入到現有的項目中,應該如何使用呢?這里通過 Flowable 來舉例說明。

使用 Flowable 可以有兩種方式,分別是內嵌和獨立部署方式,現在來分別說明:

內嵌模式

創建 maven 工程

先建一個普通的 maven 工程,加入 Flowable 引擎的依賴以及 h2 內嵌數據庫的依賴,也可以使用 MySQL 數據庫來做持久化。

<!-- https://mvnrepository.com/artifact/org.flowable/flowable-engine -->
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-engine</artifactId>
<version>6.7.2</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.192</version>
</dependency>

創建流程引擎實例

import org.flowable.engine.ProcessEngine;
import org.flowable.engine.ProcessEngineConfiguration;
import org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration;

public class HolidayRequest {

public static void main(String[] args){
ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
.setJdbcUrl("jdbc:h2:mem:flowable;DB_CLOSE_DELAY=-1")
.setJdbcUsername("sa")
.setJdbcPassword("")
.setJdbcDriver("org.h2.Driver")
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);

ProcessEngine processEngine = cfg.buildProcessEngine();
}

}

接下來,我們就可以往這個引擎實例上部署一個流程 xml。比如,我們想建立一個員工請假流程:

<?xml versinotallow="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"
typeLanguage="http://www.w3.org/2001/XMLSchema"
expressinotallow="http://www.w3.org/1999/XPath"
targetNamespace="http://www.flowable.org/processdef">

<process id="holidayRequest" name="Holiday Request" isExecutable="true">

<startEvent id="startEvent"/>
<sequenceFlow sourceRef="startEvent" targetRef="approveTask"/>

<!-- <userTask id="approveTask" name="Approve or reject request"/>-->
<userTask id="approveTask" name="Approve or reject request" activiti:candidateGroups="managers"/>

<sequenceFlow sourceRef="approveTask" targetRef="decision"/>

<exclusiveGateway id="decision"/>
<sequenceFlow sourceRef="decision" targetRef="externalSystemCall">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[
${approved}
]]>
</conditionExpression>
</sequenceFlow>
<sequenceFlow sourceRef="decision" targetRef="sendRejectionMail">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[
${!approved}
]]>
</conditionExpression>
</sequenceFlow>

<serviceTask id="externalSystemCall" name="Enter holidays in external system"
activiti:class="org.example.CallExternalSystemDelegate"/>
<sequenceFlow sourceRef="externalSystemCall" targetRef="holidayApprovedTask"/>

<!-- <userTask id="holidayApprovedTask" name="Holiday approved"/>-->
<userTask id="holidayApprovedTask" name="Holiday approved" activiti:assignee="${employee}"/>

<sequenceFlow sourceRef="holidayApprovedTask" targetRef="approveEnd"/>

<serviceTask id="sendRejectionMail" name="Send out rejection email"
activiti:class="org.flowable.SendRejectionMail"/>
<sequenceFlow sourceRef="sendRejectionMail" targetRef="rejectEnd"/>

<endEvent id="approveEnd"/>

<endEvent id="rejectEnd"/>

</process>

</definitions>

此 xml 是符合 bpmn2.0 規范的一種標準格式,其對應的流程圖如下:

接下來,我們就把這個文件傳給流程引擎,讓它基于該文件,創建一個工作流。

RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("holiday-request.bpmn20.xml")
.deploy();

創建后,實際就寫到內存數據庫 h2 了,我們還可以把它查出來:

ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.deploymentId(deployment.getId())
.singleResult();
System.out.println("Found process definition : " + processDefinition.getName());

創建工作流實例

創建工作流實例,需要提供一些輸入參數,比如我們創建的員工請假流程,參數就需要:員工姓名、請假天數、事由等。

Scanner scanner= new Scanner(System.in);

System.out.println("Who are you?");
String employee = scanner.nextLine();

System.out.println("How many holidays do you want to request?");
Integer nrOfHolidays = Integer.valueOf(scanner.nextLine());

System.out.println("Why do you need them?");
String description = scanner.nextLine();


RuntimeService runtimeService = processEngine.getRuntimeService();

Map<String, Object> variables = new HashMap<String, Object>();
variables.put("employee", employee);
variables.put("nrOfHolidays", nrOfHolidays);
variables.put("description", description);

參數準備好后,就可以傳給工作流了:

ProcessInstance processInstance =
runtimeService.startProcessInstanceByKey("holidayRequest", variables);

此時,就會根據流程定義里的:

<userTask id="approveTask" name="Approve or reject request" activiti:candidateGroups="managers"/>

創建一個任務,任務有個標簽,就是 candidateGroups,這里的 managers,可以猜得出,是給 managers 建了個審批任務。

查詢并審批任務

基于 manager 查詢任務:

TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("managers").list();
System.out.println("You have " + tasks.size() + " tasks:");
for (int i=0; i<tasks.size(); i++) {
System.out.println((i+1) + ") " + tasks.get(i).getName());
}

審批任務:

boolean approved = scanner.nextLine().toLowerCase().equals("y");
variables = new HashMap<String, Object>();
variables.put("approved", approved);
taskService.complete(task.getId(), variables);

這里就是把全局變量 approved,設為了 true,然后提交給引擎。引擎就會根據這里的變量是 true 還是 false,選擇走不同分支。如下:

<sequenceFlow sourceRef="decision" targetRef="externalSystemCall">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[
${approved}
]]>
</conditionExpression>
</sequenceFlow>
<sequenceFlow sourceRef="decision" targetRef="sendRejectionMail">
<conditionExpression xsi:type="tFormalExpression">
<![CDATA[
${!approved}
]]>
</conditionExpression>
</sequenceFlow>

回調用戶代碼

審批后,就會進入下一個節點:

<serviceTask id="externalSystemCall" name="Enter holidays in external system"
activiti:class="org.example.CallExternalSystemDelegate"/>

這里有個 class,就是需要我們自己實現的:

最后,流程就走完結束了。

REST API 模式

上面介紹的方式是其作為一個 jar,內嵌到我們的程序里。創建引擎實例后,由我們業務程序去驅動引擎的運行。引擎和業務代碼在同一個進程里。

第二種方式,Flowable 也可以作為一個獨立服務運行,提供 REST API 接口,這樣的話,非 Java 語言開發的系統就也可以使用該引擎了。

這個只需要我們下載官方的 zip 包,里面有個 rest 的 war 包,可以直接放到 tomcat 里運行。

部署工作流

在這種方式下,如果要實現上面舉例的員工請假流程,可以通過調接口來實現:

啟動工作流:

其他接口就不一一展示了,可以參考官方文檔。

通過頁面進行流程建模

截止到目前,創建工作流程都是通過建立 xml 來實現的,這樣還是非常不方便的。因此,系統也提供了通過頁面可視化的方式來創建流程,使用鼠標拖拽相應組件即可完成。

但是體驗下來還是比較辛苦的,功能很多,名詞更多,有很多都不知道是什么意思,只能不斷嘗試來理解。

開源 VS 自研

既然已經有成熟的開源產品了,還需要自研嗎?這算是一個老生常談的問題了。那到底應該如何選擇呢?其實并不困難,歸根結底就是要符合自身的業務特點,以及實際的需求。

開源優勢:

入門門檻低,有很多可以復用的成果。通常而言,功能比較豐富,周邊生態也比較完善,投入產出比比較高。一句話總結,投入少,見效快。

開源劣勢:

內核不容易掌控,門檻較高,通常開源的功能和實際業務并不會完全匹配,很多開源產品開箱即用做的不夠好,需要大量調優。一句話總結,入門容易掌控難。

自研優勢:

產品核心技術掌控程度高,可以更好的貼著業務需求做,可以定制的更好,基于上述兩點,通常更容易做到良好的性能表現。一句話總結,量身定制。

自研劣勢:

投入產出比略低,且對團隊成員的能力曲線要求較高。此外封閉的生態會導致周邊支持缺乏,當需要一些新需求時,往往都需要定制開發。一句話總結,啥事都要靠自己。

基于以上的分析,再結合我們自身業務,我總結了以下幾點可供參考:

開源項目均為 Java 技術棧,而我們使用 Python 和 Go 比較多,技術棧不匹配

開源項目功能豐富,而我們業務相對簡單,使用起來比較重

開源項目并非開箱即用,需要結合業務特點做定制開發,學習成本和維護成本比較高

綜上所述,我覺得自研更適合我們現階段的產品特點。

工作流引擎架構設計

如果選擇自研,架構應該如何設計呢?有哪些比較重要的模塊和需要注意的點呢?下面來詳細說說。

BPMN

BPMN 全稱是 Business Process Model And Notation,即業務流程模型和符號。

可以理解成一種規范,在這個規范里,哪些地方用空心圓,哪些地方用矩形,哪些地方用菱形,都是有明確定義的。

也就是說,只要是基于這個規范開發的系統,其所創建的流程就都是可以通用的。

其實,如果只是開發一個內部系統,不遵守這個規范也沒有問題。但要是做一個產品的話,為了通用性更強,最好還是遵守這個規范。

流程設計器

對于工作流引擎來說,流程設計器的選型至關重要,它提供了可視化的流程編排能力,決定了用戶體驗的好壞。

目前主流的流程設計器有 Activiti-Modeler,mxGraph,bpmn-js 等,下面來做一個簡單介紹。

Activiti-Modeler

Activiti 開源版本中帶了 Web 版流程設計器,在 Activiti-explorer 項目中有 Activiti-Modeler,優點是集成簡單,開發工作量小,缺點是界面不美觀,用戶體驗差。

mxGraph

mxGraph 是一個強大的 JavaScript 流程圖前端庫,可以快速創建交互式圖表和圖表應用程序,國內外著名的 ProcessOne 和 draw.io 都是使用該庫創建的強大的在線流程圖繪制網站。

由于 mxGraph 是一個開放的 js 繪圖開發框架,我們可以開發出很炫的樣式,或者完全按照項目需求定制。

圖片

官方網站:http://jgraph.github.io/mxgrap

bpmn-js

bpmn-js 是 BPMN2.0 渲染工具包和 Web 模型。bpmn-js 正在努力成為 Camunda BPM 的一部分。bpmn-js 使用 Web 建模工具可以很方便的構建 BPMN 圖表,可以把 BPMN 圖表嵌入到你的項目中,容易擴展。

bpmn-js 是基于原生 js 開發,支持集成到 vue、react 等開源框架中。

圖片

官方網站:https://bpmn.io/

以上介紹的都屬于是功能強大且完善的框架,除此之外,還有其他基于 Vue 或者 React 開發的可視化編輯工具,大家也可以根據自己的實際需求進行選擇。

流程引擎

最后來說說流程引擎,整個系統的核心。引擎設計的好壞決定了整個系統的穩定性,可用性,擴展性等等。

圖片

整體架構如圖所示,主要包括一下幾個部分:

一、流程設計器主要通過一系列工具創建一個計算機可以處理的工作流程描述,流程建模通常由許多離散的節點步驟組成,需要包含所有關于流程的必要信息,這些信息包括流程的起始和結束條件,節點之間的流轉,要承擔的用戶任務,被調用的應用程序等。

二、流程引擎主要負責流程實例化、流程控制、節點實例化、節點調度等。在執行過程中,工作流引擎提供流程的相關信息,管理流程的運行,監控流程的運行狀態,并記錄流程運行的歷史數據。

三、存儲服務提供具體模型及流程流轉產生的信息的存儲空間,工作流系統通常需要支持各種常見的數據庫存儲。

四、組織模型不屬于工作流系統的建設范圍,但流程設計器在建模的過程中會引用組織模型,如定義任務節點的參與者。還有就是在流程流轉的過程中同樣也需要引用組織模型,如在進行任務指派時,需要從組織模型中確定任務的執行者。

工作流引擎內部可以使用平臺自身的統一用戶組織架構,也可以適配第三方提供的用戶組織架構。

五、工作流引擎作為一項基礎支撐服務提供給各業務系統使用,對第三方系統開放標準的 RESTful 服務。

后記

下面來說說我現在開發的系統支持到了什么程度,以及未來可能的發展方向。由于畢竟不是一個專門的工單系統,工單申請也只是其中的一個模塊,所以在整體的功能上肯定和完整的工作流引擎有很大差距。

第一版

第一版并沒有流程引擎,開發方式簡單粗暴,每增加一個流程,就需要重新開發對應的表和業務代碼。

這樣做的缺點是非常明顯的:

每個流程需要單獨開發,工作量大,開發效率低

流程功能相近,代碼重復量大,冗余,不利于維護

定制化開發,缺少擴展性#

第二版

第二版,也就是目前的版本。

隨著工單流程逐漸增多,工作量逐漸增大,于是開始對流程進行優化,開發了現階段的工作流引擎。

圖片

在新增一個工單流程時,需要先進行工作流配置,配置其基礎信息,自定義字段,狀態和流轉這些信息。還支持配置自動化節點,可以根據條件由程序自動完成相關操作并審批。

配置好之后,后端無需開發,由統一的引擎代碼進行處理,包括節點審批流轉,狀態變更等。只需要開發前端的創建和查詢頁面即可,相比于第一版,已經在很大程度上提高了開發效率。

目前版本需要優化的點:

缺少可視化流程設計器,無法做到拖拽式設計流程

節點之間狀態流轉不夠靈活

缺少分布式事物支持,以及異常處理機制

下一個版本

針對以上不足,下一個版本準備主要優化三點,如下:

需要支持可視化流程設計器,使流程設計更加簡單,靈活

根據流程配置自動生成前端頁面,做到新增一種類型的工單,無需開發

增加節點自動化能力,異常處理機制,提高系統的穩定性

以上就是本文的全部內容,如果覺得還不錯的話歡迎點贊,轉發和關注,感謝支持。

參考文章:

https://www.cnblogs.com/grey-wolf/p/15963839.html

https://www.cnblogs.com/duck-and-duck/p/14436373.html#!comments

https://zhuanlan.zhihu.com/p/369761832

https://zhuanlan.zhihu.com/p/143739835

https://bbs.qolome.com/?p=365

https://workflowengine.io/blog/java-workflow-engines-comparison/

責任編輯:武曉燕 來源: AlwaysBeta
相關推薦

2020-08-06 08:26:22

Kubernetes架構開發

2020-08-06 08:16:26

Kubernetes架構開源

2015-07-14 09:26:28

微型工作流引擎設計

2021-10-14 11:34:05

技術工作流引擎

2023-07-05 09:48:44

Activiti部署

2011-12-14 09:58:58

JavajBPM

2024-10-17 08:39:32

2012-07-23 10:36:46

工作流

2009-03-03 09:13:36

工作流BPM業務流程

2023-08-02 18:48:23

Flowable工作流引擎

2009-06-11 14:43:34

jbpm工作流引擎jBPM搭建

2009-09-01 18:26:23

C#工作流引擎

2021-12-17 08:39:39

SpringbootActiviti網關路由

2025-10-17 08:22:32

2014-07-31 17:03:12

2021-03-12 06:44:09

Argo Workfl開源項目

2009-06-11 14:33:11

jbpm工作流引擎什么是jbpm

2025-09-04 01:33:00

Flowable工作流引擎

2023-06-12 08:01:57

Camunda工作流引擎

2022-10-26 08:00:43

Activiti工作流BPM
點贊
收藏

51CTO技術棧公眾號

欧美在线激情网| 日韩av在线网址| 欧美 亚洲 视频| 国产 欧美 精品| 青青草精品视频| 欧美猛男性生活免费| 北岛玲一区二区| 日本国产亚洲| 黑人精品xxx一区一二区| 在线观看欧美一区| 理论片中文字幕| 免费久久精品视频| 91chinesevideo永久地址| fc2ppv在线播放| 欧美成人专区| 日韩欧美一区二区不卡| 一本大道熟女人妻中文字幕在线| www.久久ai| 中文字幕丰满乱码| 国产又粗又大又爽视频| 亚洲国产精品一区制服丝袜| 中文字幕av一区| 动漫美女无遮挡免费| 欧美天堂一区| 色成人在线视频| 免费看欧美黑人毛片| 欧美黄色激情| 中文字幕精品三区| 免费日韩电影在线观看| 国内爆初菊对白视频| 国内精品伊人久久久久av影院 | 91精品国产91久久久久久一区二区 | 精品一区在线播放| 丁香花免费高清完整在线播放 | 在线xxxxx| 国产精品国产亚洲精品| 欧美视频三区在线播放| 日韩在线第三页| 性欧美18xxxhd| 亚洲成人激情自拍| 精品国产不卡一区二区三区| 中文字幕欧美视频在线| 国产乱国产乱老熟300部视频| 成人午夜sm精品久久久久久久| 欧美日韩一区二区在线| 久久久久免费看黄a片app| 久久青青色综合| 樱桃视频在线观看一区| 日韩不卡视频一区二区| 成人高清免费在线| 最好看的中文字幕久久| 中文字幕中文字幕99| 自拍视频在线播放| 国产欧美日韩三区| 天堂av一区二区| 日本高清中文字幕在线| 中文字幕综合网| 中文字幕一区二区三区四区五区人| 8888四色奇米在线观看| 18成人在线视频| 亚洲小视频在线播放| 日韩伦理电影网站| 亚洲电影在线免费观看| 欧美成人一区二区在线观看| 天堂资源在线| 欧美伊人久久久久久午夜久久久久| 日韩一级片播放| 福利一区在线| 日韩亚洲欧美成人一区| 亚洲精品国产成人av在线| 鲁大师精品99久久久| 亚洲精品自产拍| 超薄肉色丝袜一二三| 久久国产亚洲精品| 两个人的视频www国产精品| 免费麻豆国产一区二区三区四区| 亚洲激情黄色| 欧洲成人免费视频| 亚洲一区二区激情| 国内精品伊人久久久久av影院| 超碰97国产在线| 亚洲人成色777777老人头| 国产欧美日韩精品在线| 中文字幕第50页| 亚洲美女久久精品| 欧美猛男超大videosgay| 制服下的诱惑暮生| 嫩草国产精品入口| 色妞一区二区三区| 国产精品19乱码一区二区三区| 久久一区精品| 亚洲精品免费网站| 亚洲 美腿 欧美 偷拍| 中文字幕欧美激情一区| 欧美国产综合在线| 日韩天堂在线| 亚洲国产精品成人va在线观看| 女人黄色一级片| 亚洲清纯自拍| 91免费电影网站| 日本人妖在线| 亚洲精品视频在线| 毛葺葺老太做受视频| 福利欧美精品在线| 日韩亚洲成人av在线| 午夜精品三级久久久有码| 久久91精品国产91久久小草| 久久艳妇乳肉豪妇荡乳av| 成人免费看片| 在线免费av一区| 精品影片一区二区入口| 亚洲国产一区二区三区在线播放| 青草成人免费视频| 亚洲av无码国产综合专区| 国产精品网站导航| 黄www在线观看| 都市激情亚洲| 欧美日韩国产123| 中文字幕在线播放av| 久久先锋资源网| 亚洲人成无码网站久久99热国产| 国产精品**亚洲精品| 在线成人激情视频| 免费亚洲精品视频| 在线免费观看一级片| 91影院在线观看| 日产精品久久久久久久蜜臀| 永久免费观看精品视频| 亚洲最新av在线网站| 91精品国产乱码久久久张津瑜| 国产成人在线影院| 久久久成人精品一区二区三区| 久久久加勒比| 中文字幕日韩精品在线| 中文字幕日韩免费| 久久亚洲一级片| 国产亚洲天堂网| 欧美变态挠脚心| 51久久精品夜色国产麻豆| 亚洲高清视频网站| 亚洲第一主播视频| 逼特逼视频在线观看| 国产精品sm| 91精品国自产在线观看| 黄色成人在线| 欧美肥妇毛茸茸| 三上悠亚在线观看视频| 九九在线精品视频| 黄色www在线观看| 精品一区91| 欧美精品一本久久男人的天堂| 国产99999| 亚洲一区二区三区中文字幕| 欧美午夜精品一区二区| 日韩视频三区| 久久人人九九| 黄瓜视频成人app免费| 一区二区三区无码高清视频| 免费在线不卡av| 国产精品白丝在线| 肉色超薄丝袜脚交| 国产精品第十页| 久久国产精品久久精品国产| 成人影院入口| 自拍偷拍亚洲一区| 99在线精品视频免费观看20| 亚洲午夜日本在线观看| 亚洲做受高潮无遮挡| 毛片av一区二区三区| 青草全福视在线| 久久久亚洲欧洲日产| 国产精品福利无圣光在线一区| 亚乱亚乱亚洲乱妇| 日韩欧美一二区| 日韩欧美中文字幕一区二区| 国产亚洲va综合人人澡精品| 亚洲视频一二三四| 极品av少妇一区二区| 欧美一区亚洲二区| 99综合久久| 91av视频在线播放| 一级日本在线| 亚洲成色777777女色窝| 999视频在线| 亚洲精品中文在线影院| jizz欧美性20| 久久国产精品99久久久久久老狼| 男人天堂手机在线视频| 精品久久美女| 动漫一区二区在线| 青青热久免费精品视频在线18| 九九视频直播综合网| 免费看男男www网站入口在线| 欧美精品v国产精品v日韩精品 | 久久视频精品| 精品国产一区二区三区四区vr| 成人福利一区二区| 久久久影视精品| 一级毛片视频在线| 日韩国产高清视频在线| 国产精品自拍电影| 色婷婷综合久久| 黄色小说在线观看视频| 国产精品网友自拍| 亚洲人人夜夜澡人人爽| 国产 日韩 欧美大片| 成年人三级黄色片| 男人的天堂成人在线| 国产美女作爱全过程免费视频| 成人短片线上看| 麻豆成人av| 国产精品xxxav免费视频| 91精品啪在线观看麻豆免费 | 日本韩国欧美在线| 国产又大又黑又粗免费视频| 亚洲精品国久久99热| 人妻互换一区二区激情偷拍| 26uuu国产一区二区三区| 岛国精品一区二区三区| 国内外成人在线视频| 国产一二三区av| 免费日韩视频| 免费一级特黄毛片| 午夜日韩在线| 神马午夜伦理影院| 亚洲成人国产| 一本一道久久a久久精品综合| 精品久久久亚洲| 欧美一进一出视频| 亚洲宅男一区| 欧美日韩一区二| 最新精品国偷自产在线| 精品中文字幕人| 天天躁日日躁成人字幕aⅴ| 国产欧美日韩综合精品二区| 福利片在线一区二区| 粉嫩av四季av绯色av第一区| 狂野欧美xxxx韩国少妇| 91久久精品国产91性色| 高清不卡一区| 亚洲精品免费网站| 91精品久久久久久综合五月天| 亚洲最大福利网| 国产精品美女久久久久| 91精品在线影院| 麻豆一二三区精品蜜桃| 99蜜桃在线观看免费视频网站| 日韩高清二区| 成人欧美视频在线| 国产精品对白| 久久亚洲免费| 国产欧美日韩| 影音先锋欧美资源| 66视频精品| 成人区一区二区| 亚洲一区二区免费看| 日韩av一二三四| 久久国产精品99精品国产 | 中文字幕av网站| 欧美日韩电影在线播放| 精品二区在线观看| 亚洲成色777777女色窝| 毛片免费在线观看| 久久精品99久久久香蕉| 18videosex性欧美麻豆| 韩剧1988免费观看全集| 春暖花开亚洲一区二区三区| 国产精品综合久久久| 日本一区二区三区视频在线看| 国产另类自拍| 国产欧美日韩精品一区二区免费 | 麻豆亚洲av成人无码久久精品| 午夜视频一区二区三区| 国产一级一级国产| 欧美精品乱码久久久久久按摩| 亚洲AV无码一区二区三区少妇| 亚洲精品成人av| 91视频在线观看| 欧美激情亚洲另类| 欧美黄色三级| 国产成人精品福利一区二区三区| 久草成人资源| 白白操在线视频| 日日嗨av一区二区三区四区| 精品国产乱码久久久久久1区二区| av一区二区三区黑人| 亚洲国产精品一区二区久久hs| 亚洲资源在线观看| 亚洲永久精品一区| 欧美成人r级一区二区三区| 理论视频在线| 欧美高跟鞋交xxxxxhd| 日韩中文视频| 国产欧美日韩综合精品二区| 国产精品二区不卡| 波多野结衣家庭教师在线| 紧缚奴在线一区二区三区| 无码人妻精品一区二区三区温州| 中文字幕一区二区在线播放 | 久久影院亚洲| 男人女人拔萝卜视频| 国产人伦精品一区二区| 国产亚洲精品女人久久久久久| 欧美日韩高清不卡| 日产精品久久久久久久性色| 欧美日本高清视频| 国外成人福利视频| 麻豆av福利av久久av| 狠狠爱综合网| 91欧美一区二区三区| 欧美韩日一区二区三区四区| 可以在线观看av的网站| 欧美成人官网二区| 18videosex性欧美麻豆| 国产有码在线一区二区视频| 亚洲欧洲免费| 日本少妇高潮喷水视频| 国产91丝袜在线播放九色| 国产视频精品免费| 欧美色图天堂网| 韩国三级在线观看久| 欧美一级视频免费在线观看| jazzjazz国产精品久久| 第九区2中文字幕| 国产一区二区三区免费在线观看| 人妻无码一区二区三区免费| 色欧美日韩亚洲| 美女毛片在线看| 国产大片精品免费永久看nba| 五月激激激综合网色播| 欧美二区在线视频| 成人99免费视频| 国产精品成人久久| 日韩欧美一区中文| av片在线观看网站| 亚洲自拍小视频免费观看| 国产精品久久久乱弄| 五月激情五月婷婷| 综合自拍亚洲综合图不卡区| 国产欧美久久久| 久久影视电视剧免费网站清宫辞电视| 久久精品国产福利| 亚洲精品免费在线看| 久久精品国产网站| 欧美肥妇bbwbbw| 宅男噜噜噜66一区二区66| 黄色网页在线播放| 91网免费观看| 亚洲美女视频在线免费观看| 国产精品久久无码| 精品久久中文字幕久久av| 神马久久高清| 国产不卡在线观看| 第九色区aⅴ天堂久久香| www.精品在线| 亚洲欧美视频在线观看视频| 亚洲第一免费视频| 91国产精品电影| 尤物tv在线精品| 国产三级国产精品国产专区50| 亚洲欧洲国产日韩| 亚洲国产www| 欧美一区三区三区高中清蜜桃| 欧美日韩高清| 亚洲高清视频免费| 亚洲成a人v欧美综合天堂下载 | 2023国产精华国产精品| 久久国产精品视频在线观看| 久久免费国产精品| 亚洲专区在线播放| 欧美激情综合亚洲一二区| 日韩三级av| 国产性生活一级片| 亚洲国产视频a| 精品推荐蜜桃传媒| 亚洲a一级视频| 一区二区三区成人精品| 2019男人天堂| 精品欧美乱码久久久久久1区2区| 深夜成人在线| 亚洲成人午夜在线| 成人午夜视频在线观看| 中文字幕免费高清网站| 不卡av在线播放| 女仆av观看一区| 在线观看日本www| 欧美日韩亚洲激情| 老司机精品视频在线观看6| 国产精品污www一区二区三区| 日日夜夜精品视频免费| 久久久综合久久久| 中文字幕亚洲综合| 日韩动漫一区| 中文国产在线观看| 色综合欧美在线| 啪啪免费视频一区| 亚洲人成影视在线观看| www.在线欧美| 国产熟女精品视频| 国产精品久久不能|