官术网_书友最值得收藏!

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)。

主站蜘蛛池模板: 昭苏县| 金山区| 广灵县| 乐昌市| 南充市| 碌曲县| 皮山县| 务川| 宁德市| 全椒县| 富裕县| 玛纳斯县| 霍林郭勒市| 义乌市| 呼图壁县| 定日县| 綦江县| 岑溪市| 临沂市| 鄂托克前旗| 博湖县| 永州市| 调兵山市| 准格尔旗| 鱼台县| 郴州市| 介休市| 郑州市| 陆川县| 疏附县| 报价| 页游| 昌平区| 土默特左旗| 凤翔县| 民和| 泉州市| 禹城市| 招远市| 吴堡县| 陇川县|