工作流引擎Activiti經(jīng)過多年的發(fā)展,已經(jīng)變成一個成熟的工作流框架,在2017年,Activiti推出了全新的6.0版本,除了完善對BPMN規(guī)范的支持外,還加入了對DMN規(guī)范的支持。為了能讓廣大的程序開發(fā)者一探新版本Activiti的功能,筆者在di yi版的基礎(chǔ)上,編寫了本書的第二版。書中會對Activiti的知識進(jìn)行全面講解,并從源碼角度對Activiti進(jìn)行深度剖析。本書會以Activiti為基礎(chǔ),講述該框架的API使用、BPMN規(guī)范,除了這些工作流的基本知識外,還講解了zui新的DMN規(guī)范引擎、Activiti整合Spring Boot等內(nèi)容。在本書的第18章,深入Activiti的源代碼,展示舍棄流程虛擬機(PVM)之后的Activiti,如何對流程進(jìn)行控制,讓讀者能一窺Activiti的廬山真面目。zui后一章,以一個案例結(jié)束本書的內(nèi)容,案例中整合Spring、Struts2等主流框架,目的是讓讀者在學(xué)習(xí)的過程中更貼近實際案例。
1. 內(nèi)容深入。書中的案例不僅僅講解Activiti的功能,更模仿Activiti的思路去模擬功能的實現(xiàn),讀者可以深入了解其中的原理。
2. 開發(fā)環(huán)境與案例更貼近實際。書中案例的開發(fā)環(huán)境、使用的框架以及工具均是來自企業(yè)的實際應(yīng)用,案例的選取與研發(fā)過程更貼近實際。
3. 注釋詳細(xì)本書的代碼,幾乎每行Java代碼均有注釋,讀者可以很容易的了解代碼的意思,輕松的掌握相應(yīng)的知識。
前 言
當(dāng)今技術(shù)發(fā)展一日千里,各種技術(shù)框架如雨后春筍般涌現(xiàn),技術(shù)正在改變世界、改變生活。作者從業(yè)十余年,面對如此變幻莫測的世界,亦難巋然不動,面對日新月異的知識,時常懷著一顆謙卑的心。只有學(xué)習(xí),才能帶來快樂,才不會被淘汰。程序是枯燥的,但程序又是美麗的,看似冷冰冰的代碼,實則豐富多彩。
Java是目前世界上應(yīng)用最廣泛的語言,在Java領(lǐng)域出現(xiàn)了眾多優(yōu)秀的框架和組件,這些組件正在慢慢提高編程的效率,使得編程這項原本枯燥的工作變得更為優(yōu)雅與簡單。在工作流領(lǐng)域,涌現(xiàn)出多個使用Java語言編寫的框架,如OpenWFE、jBPM、Shark,甚至在國內(nèi)市面上出現(xiàn)了不少國產(chǎn)的工作流引擎。近年來,出現(xiàn)了一款全新的工作流框架Activiti,經(jīng)過幾年的發(fā)展,Activiti已經(jīng)成為一款成熟的工作流產(chǎn)品。筆者在2014年,基于Activiti 5.0版本,編寫了《瘋狂Workflow講義》第一版,Activiti 6.0在2017年發(fā)布,為了幫助廣大的Java研發(fā)者學(xué)習(xí)新框架,筆者對《瘋狂Workflow講義》進(jìn)行升級,并將多年的實踐經(jīng)驗融入本書中。
本書經(jīng)過約半年的編寫,至今能得以付梓,得益于多方襄助,對他們的感激之情,難以言表。感謝傳道并解惑的恩師,感謝聰穎而好學(xué)的讀者,感謝善良和親愛的家人,筆者會謝意永存、銘感不忘。
本書內(nèi)容概括
本書是一本介紹Java工作流領(lǐng)域的書,以Activiti為核心,內(nèi)容囊括了多個流行的企業(yè)級Java EE框架,全書主要可分為以下幾個部分。
第一部分:對Activiti的基礎(chǔ)知識進(jìn)行講解,包括框架起源、基本的設(shè)計模式、數(shù)據(jù)庫設(shè)置以及框架配置等,該部分知識可以幫助讀者對Activiti有一個較為深入的認(rèn)識,對Activiti的設(shè)計有一個初步的印象,該部分內(nèi)容也可以作為整合Activiti到項目中的參考。
第二部分:從源代碼的實現(xiàn)上講解Activiti各個模塊的API,除了講述這些API的作用外,還會引領(lǐng)讀者深入到這些API的內(nèi)部,此部分內(nèi)容可以作為一個詳細(xì)的Activiti API的幫助文檔。
第三部分:詳細(xì)講述了BPMN 2.0規(guī)范的內(nèi)容,包括目前Activiti對該規(guī)范的實現(xiàn)情況。在講解BPMN 2.0規(guī)范時,將規(guī)范與Activiti的實現(xiàn)進(jìn)行結(jié)合,讓讀者在通俗易懂的例子示范下,對Activiti的實現(xiàn)及BPMN 2.0規(guī)范有較為深入的了解。
第四部分:Activiti 6支持的DMN規(guī)范,本書將在第15章中講述Activiti基于DMN規(guī)范的規(guī)則引擎。Activiti的規(guī)則引擎目前尚未正式面世,筆者研讀了當(dāng)前版本的源代碼,并帶領(lǐng)讀者優(yōu)先體會了Activiti的規(guī)則引擎。
第五部分:講述如何在實際企業(yè)應(yīng)用中使用Activiti,并與其他流行的開源框架進(jìn)行整合,包括企業(yè)應(yīng)用開發(fā)所必須使用的Web Service、企業(yè)服務(wù)總線、規(guī)則引擎、IoC框架和ORM框架等。除了主要的Activiti知識外,企業(yè)中常用框架的知識,也在該部分內(nèi)容中得到了體現(xiàn)。通過學(xué)習(xí)這部分內(nèi)容,可以極大豐富你的實戰(zhàn)知識,讓你成為一個更全面的技術(shù)人員。
第六部分:在第18章中講述了Activiti的核心架構(gòu)及Activiti的表單知識,本書最后一章,通過講解一個辦公系統(tǒng)的開發(fā)過程,讓讀者更了解Activiti在實際生產(chǎn)中的應(yīng)用,從而理論層面,走上實踐的道路。
本書特點
筆者長期工作于企業(yè)的IT部門,有著豐富的企業(yè)應(yīng)用開發(fā)經(jīng)驗,因此本書具有以下特點。
1. 內(nèi)容深入
從筆者接觸編程開始,就養(yǎng)成了查看源代碼的習(xí)慣,書中的示例不僅僅能幫助理解Activiti的功能,更借鑒了Activiti的思路去模擬功能的實現(xiàn),所以讀者能夠深入了解其中的原理。
2. 開發(fā)環(huán)境與示例更貼近實際
本書中示例的開發(fā)環(huán)境、使用的框架及工具均來自企業(yè)的實際應(yīng)用,示例的選取與研發(fā)過程更貼近實際。
3. 注釋詳細(xì)
本書的代碼幾乎每行都有注釋,讀者可以很容易地了解代碼的意思,輕松掌握相應(yīng)的知識。
本書寫給誰看
如果你有一定的Java語言基礎(chǔ),進(jìn)行過Web項目的開發(fā),對工作流有一定的認(rèn)識,那么本書可以幫助你提升關(guān)于工作流的知識水平。如果你是一個從事過企業(yè)應(yīng)用開發(fā)的程序員,本書同樣適合你,本書的知識可以幫助你深入理解工作流引擎,使你可以將這些工作流框架應(yīng)用到實際的企業(yè)生產(chǎn)中。
衷心感謝
首先非常感謝李剛老師,一直以來,他既是我的老師,也是我的技術(shù)后盾,非常幸運人生能有這樣一位良師益友。
其次感謝出版社的編輯,為本書的出版做了很多細(xì)致的工作,并為本書提出了許多寶貴的意見。
最后感謝我的家人,你們是我前進(jìn)的動力。
楊恩雄,從事十多年Java EE企業(yè)應(yīng)用開發(fā),曾任中企動力系統(tǒng)設(shè)計師、中企開源項目經(jīng)理、數(shù)碼辰星科技公司項目經(jīng)理,參與過多個企業(yè)級項目的設(shè)計與架構(gòu)工作,曾負(fù)責(zé)辰星電影票網(wǎng)絡(luò)銷售系統(tǒng)的整體架構(gòu)。精通Activiti、Drools、ESB等開源技術(shù),在SOA、SaaS、大數(shù)據(jù)應(yīng)用、互聯(lián)網(wǎng)系統(tǒng)架構(gòu)方面有著豐富的經(jīng)驗,曾出版《瘋狂Java實戰(zhàn)演習(xí)》《瘋狂Workflow講義》《瘋狂Spring Cloud微服務(wù)架構(gòu)實戰(zhàn)》等書籍。
第1章 Activiti介紹1
1.1 工作流介紹2
1.2 BPMN 2.0規(guī)范簡述2
1.2.1 BPMN 2.0概述3
1.2.2 BPMN 2.0元素3
1.2.3 BPMN 2.0的XML結(jié)構(gòu)5
1.3 Activiti介紹5
1.3.1 Activiti的出現(xiàn)5
1.3.2 Activiti的發(fā)展5
1.3.3 選擇Activiti還是jBPM5
1.4 本章小結(jié)6
第2章 安裝與運行Activiti7
2.1 下載與運行Activiti8
2.1.1 下載和安裝JDK8
2.1.2 下載和安裝MySQL9
2.1.3 下載和安裝Activiti10
2.2 運行官方的Activiti示例11
2.2.1 請假流程概述11
2.2.2 新建用戶11
2.2.3 定義流程12
2.2.4 發(fā)布流程14
2.2.5 啟動與完成流程15
2.2.6 流程引擎管理16
2.3 安裝開發(fā)環(huán)境17
2.3.1 下載Eclipse17
2.3.2 安裝Activiti插件18
2.4 編寫第一個Activiti程序19
2.4.1 如何運行本書示例19
2.4.2 建立工程環(huán)境19
2.4.3 創(chuàng)建配置文件20
2.4.4 創(chuàng)建流程文件20
2.4.5 加載流程文件與啟動流程21
2.5 本章小結(jié)22
第3章 Activiti數(shù)據(jù)庫設(shè)計23
3.1 通用數(shù)據(jù)表24
3.1.1 資源表24
3.1.2 屬性表24
3.2 流程存儲表25
3.2.1 部署數(shù)據(jù)表25
3.2.2 流程定義表25
3.3 身份數(shù)據(jù)表25
3.3.1 用戶表25
3.3.2 用戶賬號(信息)表26
3.3.3 用戶組表26
3.3.4 關(guān)系表26
3.4 運行時數(shù)據(jù)表26
3.4.1 流程實例(執(zhí)行流)表26
3.4.2 流程任務(wù)表27
3.4.3 流程參數(shù)表27
3.4.4 流程與身份關(guān)系表27
3.4.5 工作數(shù)據(jù)表28
3.4.6 事件描述表28
3.5 歷史數(shù)據(jù)表28
3.5.1 流程實例表28
3.5.2 流程明細(xì)表29
3.5.3 歷史任務(wù)表和歷史行為表29
3.5.4 附件表和評論表29
3.6 DMN規(guī)則引擎表30
3.6.1 決策部署表30
3.6.2 決策表30
3.6.3 部署資源表30
3.7 本章小結(jié)30
第4章 Activiti流程引擎配置31
4.1 流程引擎配置對象32
4.1.1 讀取默認(rèn)的配置文件32
4.1.2 讀取自定義的配置文件33
4.1.3 讀取輸入流的配置33
4.1.4 使用createStandaloneInMemProcess- EngineConfiguration方法34
4.1.5 使用createStandaloneProcessEngine- Configuration方法34
4.2 數(shù)據(jù)源配置35
4.2.1 Activiti支持的數(shù)據(jù)庫35
4.2.2 Activiti與Spring35
4.2.3 JDBC配置35
4.2.4 DBCP數(shù)據(jù)源配置36
4.2.5 C3P0數(shù)據(jù)源配置37
4.2.6 Activiti其他數(shù)據(jù)源配置38
4.2.7 數(shù)據(jù)庫策略配置38
4.2.8 databaseType配置39
4.3 其他屬性配置40
4.3.1 history配置40
4.3.2 asyncExecutorActivate配置41
4.3.3 郵件服務(wù)器配置41
4.4 ProcessEngineConfiguration bean41
4.4.1 ProcessEngineConfiguration及其子類41
4.4.2 自定義ProcessEngineConfiguration42
4.5 Activiti的命令攔截器43
4.5.1 命令模式44
4.5.2 責(zé)任鏈模式45
4.5.3 編寫自定義攔截器47
4.6 本章小結(jié)49
第5章 流程引擎的創(chuàng)建50
5.1 ProcessEngineConfiguration的buildProcessEngine方法51
5.2 ProcessEngines對象51
5.2.1 init方法與getDefaultProcessEngine方法51
5.2.2 registerProcessEngine方向和unregister方法52
5.2.3 retry方法53
5.2.4 destroy方法53
5.3 ProcessEngine對象54
5.3.1 服務(wù)組件54
5.3.2 關(guān)閉流程引擎55
5.3.3 流程引擎名稱56
5.4 本章小結(jié)56
第6章 用戶組與用戶57
6.1 用戶組管理58
6.1.1 Group對象58
6.1.2 創(chuàng)建用戶組58
6.1.3 修改用戶組59
6.1.4 刪除用戶組60
6.2 Activiti數(shù)據(jù)查詢61
6.2.1 查詢對象61
6.2.2 list方法61
6.2.3 listPage方法62
6.2.4 count方法63
6.2.5 排序方法63
6.2.6 ID排序問題64
6.2.7 多字段排序66
6.2.8 singleResult方法67
6.2.9 用戶組數(shù)據(jù)查詢68
6.2.10 原生SQL查詢69
6.3 用戶管理71
6.3.1 User對象71
6.3.2 添加用戶71
6.3.3 修改用戶72
6.3.4 刪除用戶72
6.3.5 驗證用戶密碼73
6.3.6 用戶數(shù)據(jù)查詢74
6.3.7 設(shè)置認(rèn)證用戶75
6.4 用戶信息管理77
6.4.1 添加和刪除用戶信息77
6.4.2 查詢用戶信息78
6.4.3 設(shè)置用戶圖片78
6.5 用戶組與用戶的關(guān)系80
6.5.1 綁定關(guān)系80
6.5.2 解除綁定81
6.5.3 查詢用戶組下的用戶81
6.5.4 查詢用戶所屬的用戶組82
6.6 本章小結(jié)83
第7章 流程存儲84
7.1 流程文件部署85
7.1.1 Deployment對象85
7.1.2 DeploymentBuilder對象85
7.1.3 添加輸入流資源86
7.1.4 添加classpath資源87
7.1.5 添加字符串資源88
7.1.6 添加壓縮包資源88
7.1.7 添加BPMN模型資源89
7.1.8 修改部署信息90
7.1.9 過濾重復(fù)部署90
7.1.10 取消部署時的驗證92
7.2 流程定義的管理93
7.2.1 ProcessDefinition對象93
7.2.2 流程部署93
7.2.3 流程圖部署95
7.2.4 流程圖自動生成95
7.2.5 中止與激活流程定義96
7.2.6 流程定義緩存配置97
7.2.7 自定義緩存98
7.3 流程定義權(quán)限100
7.3.1 設(shè)置流程定義的用戶權(quán)限100
7.3.2 設(shè)置流程定義的用戶組權(quán)限101
7.3.3 IdentityLink對象102
7.3.4 查詢權(quán)限數(shù)據(jù)102
7.4 RepositoryService數(shù)據(jù)查詢與刪除104
7.4.1 查詢部署資源104
7.4.2 查詢流程文件105
7.4.3 查詢流程圖106
7.4.4 查詢部署資源名稱107
7.4.5 刪除部署資源107
7.4.6 DeploymentQuery對象108
7.4.7 ProcessDefinitionQuery對象109
7.5 本章小結(jié)109
第8章 流程任務(wù)管理110
8.1 任務(wù)的創(chuàng)建與刪除111
8.1.1 Task接口111
8.1.2 創(chuàng)建與保存Task實例112
8.1.3 刪除任務(wù)112
8.2 任務(wù)權(quán)限113
8.2.1 設(shè)置候選用戶組114
8.2.2 設(shè)置候選用戶115
8.2.3 權(quán)限數(shù)據(jù)查詢116
8.2.4 設(shè)置任務(wù)持有人118
8.2.5 設(shè)置任務(wù)代理人119
8.2.6 添加任務(wù)權(quán)限數(shù)據(jù)119
8.2.7 刪除用戶組權(quán)限121
8.2.8 刪除用戶權(quán)限122
8.3 任務(wù)參數(shù)123
8.3.1 基本類型參數(shù)設(shè)置124
8.3.2 序列化參數(shù)125
8.3.3 獲取參數(shù)126
8.3.4 參數(shù)作用域127
8.3.5 設(shè)置多個參數(shù)128
8.3.6 數(shù)據(jù)對象129
8.4 任務(wù)附件管理130
8.4.1 Attachment對象130
8.4.2 創(chuàng)建任務(wù)附件130
8.4.3 附件查詢132
8.4.4 刪除附件133
8.5 任務(wù)評論與事件記錄133
8.5.1 Comment對象133
8.5.2 新增任務(wù)評論134
8.5.3 事件的記錄135
8.5.4 數(shù)據(jù)查詢136
8.6 任務(wù)聲明與完成137
8.6.1 任務(wù)聲明137
8.6.2 任務(wù)完成138
8.7 本章小結(jié)139
第9章 流程控制140
9.1 流程實例與執(zhí)行流141
9.1.1 流程實例與執(zhí)行流概念141
9.1.2 流程實例和執(zhí)行流對象(ProcessInstance與Execution)141
9.2 啟動流程142
9.2.1 startProcessInstanceById方法142
9.2.2 startProcessInstanceByKey方法144
9.2.3 startProcessInstanceByMessage145
9.3 流程參數(shù)146
9.3.1 設(shè)置與查詢流程參數(shù)147
9.3.2 流程參數(shù)的作用域147
9.3.3 其他設(shè)置參數(shù)的方法149
9.4 流程操作149
9.4.1 流程觸發(fā)149
9.4.2 觸發(fā)信號事件150
9.4.3 觸發(fā)消息事件152
9.4.4 中斷與激活流程153
9.4.5 刪除流程154
9.5 流程數(shù)據(jù)查詢155
9.5.1 執(zhí)行流查詢155
9.5.2 流程實例查詢157
9.6 本章小結(jié)158
第10章 歷史數(shù)據(jù)管理和流程引擎管理159
10.1 歷史數(shù)據(jù)管理160
10.1.1 歷史流程實例查詢160
10.1.2 歷史任務(wù)查詢161
10.1.3 歷史行為查詢163
10.1.4 歷史流程明細(xì)查詢165
10.1.5 刪除歷史流程實例和歷史任務(wù)166
10.2 工作的產(chǎn)生167
10.2.1 異步任務(wù)產(chǎn)生的工作168
10.2.2 定時中間事件產(chǎn)生的工作169
10.2.3 定時邊界事件產(chǎn)生的工作170
10.2.4 定時開始事件產(chǎn)生的工作171
10.2.5 流程拋出事件產(chǎn)生的工作172
10.2.6 暫停工作的產(chǎn)生174
10.2.7 無法執(zhí)行的工作175
10.3 工作管理176
10.3.1 工作查詢對象176
10.3.2 獲取工作異常信息176
10.3.3 轉(zhuǎn)移與刪除工作177
10.4 數(shù)據(jù)庫管理178
10.4.1 查詢引擎屬性178
10.4.2 數(shù)據(jù)表信息查詢179
10.4.3 數(shù)據(jù)庫操作180
10.4.4 數(shù)據(jù)表查詢180
10.5 本章小結(jié)181
第11章 流程事件182
11.1 事件分類183
11.1.1 按照事件的位置分類183
11.1.2 按照事件的特性分類183
11.2 事件定義183
11.2.1 定時器事件定義184
11.2.2 cron表達(dá)式184
11.2.3 錯誤事件定義186
11.2.4 信號事件定義186
11.2.5 消息事件定義187
11.2.6 取消事件定義187
11.2.7 補償事件定義188
11.2.8 其他事件定義188
11.3 開始事件188
11.3.1 無指定開始事件188
11.3.2 定時器開始事件189
11.3.3 消息開始事件190
11.3.4 錯誤開始事件191
11.4 結(jié)束事件193
11.4.1 無指定結(jié)束事件193
11.4.2 錯誤結(jié)束事件194
11.4.3 取消結(jié)束事件和取消邊界事件196
11.4.4 終止結(jié)束事件199
11. 5 邊界事件200
11.5.1 定時器邊界事件201
11.5.2 錯誤邊界事件203
11.5.3 信號邊界事件204
11.5.4 補償邊界事件206
11.6 中間事件209
11.6.1 中間事件分類209
11.6.2 定時器中間事件