- Activiti權(quán)威指南
- 冀正
- 1158字
- 2020-11-28 15:59:55
2.6 初始化流程引擎
在代碼清單2-14中,new ProcessEngineImpl(this)這行代碼主要用于實(shí)例化ProcessEngineImpl類,該類的核心定義如代碼清單2-25所示。
代碼清單2-25 ProcessEngineImpl.java

嘗試將以上代碼的執(zhí)行邏輯梳理總結(jié)如下。
(1)第2~12行進(jìn)行屬性填充,ProcessEngineImpl實(shí)例對(duì)象的屬性值均從processEngineConfiguration對(duì)象中進(jìn)行獲取,這里的設(shè)計(jì)是典型的門面模式,為客戶端的使用提供便利,無須關(guān)心ProcessEngineConfiguration類的內(nèi)部實(shí)現(xiàn)機(jī)制。
(2)第13行執(zhí)行數(shù)據(jù)庫(kù)表生成策略。開發(fā)人員可以在配置文件中為流程引擎配置類設(shè)置databaseSchemaUpdate屬性值,該屬性的可選值如下所示。
? flase:默認(rèn)值。流程引擎啟動(dòng)時(shí),首先從ACT_GE_PROPERTY表中查詢Activiti引擎的版本值(NAME_字段的值等于’schema.version'),然后獲取ProcessEngine接口中定義的VERSION靜態(tài)變量值,兩者進(jìn)行對(duì)比,如果數(shù)據(jù)庫(kù)中的表不存在或者表存在但版本不匹配則直接拋出異常。
? true:流程引擎啟動(dòng)時(shí)會(huì)對(duì)所有的表進(jìn)行更新操作(upgrade目錄中的DDL腳本),如果數(shù)據(jù)庫(kù)中的表不存在則開始創(chuàng)建表(create目錄中的DDL腳本)。
? create_drop:流程引擎啟動(dòng)時(shí)創(chuàng)建表,流程引擎關(guān)閉時(shí)刪除表(流程引擎的關(guān)閉形如processEngine.close())。
? drop-create:流程引擎啟動(dòng)時(shí)首先刪除數(shù)據(jù)庫(kù)中存在的表然后重新創(chuàng)建表(該方式不需要手動(dòng)關(guān)閉流程引擎),該操作非常危險(xiǎn),因此不建議正式環(huán)境使用。
? create:流程引擎啟動(dòng)時(shí)直接創(chuàng)建表不管數(shù)據(jù)庫(kù)是否存在表,這就意味著如果數(shù)據(jù)庫(kù)中已經(jīng)存在表,再次執(zhí)行創(chuàng)建表的DDL肯定會(huì)報(bào)錯(cuò),因此不建議使用。
(3)注冊(cè)流程引擎。ProcessEngines.registerProcessEngine(this)方法將ProcessEngineImpl實(shí)例對(duì)象注冊(cè)到ProcessEngines類中。
(4)作業(yè)執(zhí)行器。第15~20行如果流程引擎配置類配置了作業(yè)執(zhí)行器jobExecutor-Activate開關(guān)屬性和異步作業(yè)執(zhí)行器asyncExecutorActivate開關(guān)屬性則需要分別啟動(dòng)作業(yè)執(zhí)行器和異步作業(yè)執(zhí)行器。有關(guān)作業(yè)執(zhí)行器可以參考第9章的講解。
(5)流程引擎生命周期監(jiān)聽器。如果流程引擎配置類配置有流程引擎生命周期監(jiān)聽器ProcessEngineLifecycleListener,則執(zhí)行第22行觸發(fā)流程引擎生命周期監(jiān)聽器中的onProcessEngineBuilt方法。
(6)轉(zhuǎn)發(fā)事件。第24~26行轉(zhuǎn)發(fā)事件類型為ENGINE_CREATED的事件,關(guān)于事件轉(zhuǎn)發(fā)器可以參考第6章。
2.6.1 操作引擎表
了解databaseSchemaUpdate屬性的含義之后,接下來分析SchemaOperationsProcess-EngineBuild命令類中execute方法的處理邏輯,如代碼清單2-26所示。有關(guān)命令類的相關(guān)知識(shí),第12章會(huì)詳細(xì)講解。
代碼清單2-26 SchemaOperationsProcessEngineBuild.java

首先根據(jù)commandContext獲取DbSqlSession實(shí)例對(duì)象,然后調(diào)用該實(shí)例對(duì)象的performSchemaOperationsProcessEngineBuild方法進(jìn)行下一步的處理,該方法的具體實(shí)現(xiàn)如代碼清單2-27所示。
代碼清單2-27 DbSqlSession.java

該方法的處理邏輯梳理如下。
(1)根據(jù)Context類獲取流程引擎配置類中的databaseSchemaUpdate屬性值。
(2)根據(jù)databaseSchemaUpdate值執(zhí)行如下的邏輯。
? 如果屬性值為drop-create,則第5行調(diào)用dbSchemaDrop方法進(jìn)行數(shù)據(jù)庫(kù)表的刪除工作。
? 如果屬性值為create-drop、drop-create、create三者中的任意一個(gè),則第13行調(diào)用dbSchemaCreate方法進(jìn)行數(shù)據(jù)庫(kù)表的創(chuàng)建工作。
? 如果該屬性值為false,則第16行調(diào)用dbSchemaCheckVersion方法對(duì)數(shù)據(jù)庫(kù)中存在的版本值與ProcessEngine接口中定義的版本值進(jìn)行比對(duì)。
? 如果該屬性值為true,則第19行調(diào)用dbSchemaUpdate方法進(jìn)行數(shù)據(jù)庫(kù)表的升級(jí)操作。
以上數(shù)據(jù)庫(kù)的DDL文件在1.3節(jié)詳細(xì)講解過,可以參考該節(jié)進(jìn)行學(xué)習(xí)。
擴(kuò)展
如果打算在引擎創(chuàng)建、刪除、更新表時(shí)執(zhí)行項(xiàng)目中的DDL腳本,可以通過擴(kuò)展DbSqlSession類進(jìn)行實(shí)現(xiàn)。
- The Complete Rust Programming Reference Guide
- Implementing VMware Horizon 7(Second Edition)
- AWS Serverless架構(gòu):使用AWS從傳統(tǒng)部署方式向Serverless架構(gòu)遷移
- 深入理解Django:框架內(nèi)幕與實(shí)現(xiàn)原理
- 數(shù)據(jù)結(jié)構(gòu)與算法JavaScript描述
- Swift 3 New Features
- Full-Stack React Projects
- PostgreSQL Replication(Second Edition)
- UVM實(shí)戰(zhàn)
- TMS320LF240x芯片原理、設(shè)計(jì)及應(yīng)用
- Go語言底層原理剖析
- Python 3 Object:oriented Programming(Second Edition)
- Learning Cocos2d-JS Game Development
- JavaWeb從入門到精通(視頻實(shí)戰(zhàn)版)
- 小學(xué)生C++趣味編程從入門到精通