上一篇:Spring學(xué)習(xí)之整合Activiti(二)
下一篇:工作流Activiti異常積累
在Spring學(xué)習(xí)之整合Activiti(一)的測(cè)試環(huán)節(jié)進(jìn)入modeler.html創(chuàng)建模型頁(yè)面時(shí)需要傳modelId,那么這些Id是如何生成的(Activiti中的所有的id:act_ge_bytearray肥缔、act_re_deployment等等中的主鍵生成基本一致)快压?
在本章節(jié)朴则,我們跟著源碼查看一下:
一干像、ModelService.createModel方法
進(jìn)新建模型頁(yè)面首先調(diào)用ModelService(示例中的類)中的createModel()方法獲取modelId:
如上在兩處打印
modelData.getId()
赖歌,很容易得知构资,modelId是在repositoryService.saveModel(modelData)
中生成的
二、RepositoryServiceImpl.saveModel方法
我們進(jìn)入repositoryService.saveModel
方法:
該方法實(shí)際調(diào)用的是SaveModelCmd
類中的execute
方法
三齐帚、SaveModelCmd.execute方法
我們進(jìn)入SaveModelCmd
類:
新建模型時(shí)妒牙,model.getId()是為null的,所以這里調(diào)用的是:
commandContext.getModelEntityManager().insertModel(model);
四对妄、ModelEntityManager.insertModel方法
ModelEntityManager
的insertModel
方法代碼如下:
五湘今、DbSqlSession.insert方法
繼續(xù)進(jìn)入DbSqlSession.insert
方法查看:
dbSqlSessionFactory.getIdGenerator().getNextId()
調(diào)用的是DbIdGenerator
中的getNextId
方法
六、DbIdGenerator.getNextId方法
可以看到饥伊,modelId生成邏輯主要在該類中象浑,
在getNextId
方法中,判斷lastId
是否小于nextId
琅豆,而這個(gè)條件中的lastId
和nextId
只是一個(gè)成員變量愉豺,在DbIdGenerator實(shí)例銷毀后,lastId
和nextId
就會(huì)被重置茫因,說明重啟服務(wù)后lastId
和nextId
就會(huì)被重置蚪拦,
會(huì)執(zhí)行getNewBlock
方法重新生成lastId
和nextId
,最后返回nextId冻押;
在getNewBlock
方法驰贷,我們看看第一句IdBlock是怎么生成的,調(diào)用GetNextIdBlockCmd
類的execute
方法
七洛巢、GetNextIdBlockCmd.execute方法
進(jìn)入GetNextIdBlockCmd
類:
該execute方法中:
首先獲取act_ge_property表中的next.dbid
字段的值,傳給oldValue
;
idBlockSize
:為2500,然后通過oldValue
和newValue-1
生成IdBlock
八括袒、IdBlock類
九、遇到的坑
以上生成id的邏輯稿茉,在不手動(dòng)操作數(shù)據(jù)庫(kù)是沒有問題锹锰,比如,所有的流程模型都是在網(wǎng)頁(yè)上新建的漓库,但是如果某些模型數(shù)據(jù)是直接操作數(shù)據(jù)庫(kù)恃慧,插入時(shí)會(huì)報(bào)主鍵重復(fù):
場(chǎng)景:
在測(cè)試環(huán)境的網(wǎng)頁(yè)上新建模型,并導(dǎo)出該模型的數(shù)據(jù)記錄渺蒿,然后導(dǎo)入到生產(chǎn)環(huán)境的數(shù)據(jù)庫(kù)中痢士,這里可能出現(xiàn)的情況是:
生產(chǎn)服務(wù)啟動(dòng)服務(wù)后會(huì)部署流程模型,而此時(shí)部署id是act_ge_property表中的next.dbid
字段的值茂装;而部署后也會(huì)往act_ge_bytearray表插入數(shù)據(jù)怠蹂,從上面的源碼可以看出:act_ge_bytearray表中的id是act_ge_property表中的next.dbid
字段的值nextId+1
而由于測(cè)試環(huán)境的modelid也有可能是act_ge_property表中的next.dbid
字段的值(啟動(dòng)服務(wù)后直接新建模型),新建模型時(shí)會(huì)將模型的xml文件插入到act_ge_bytearray表少态,此時(shí)act_ge_bytearray表中的該模型的id是act_ge_property表中的next.dbid
字段的值nextId+1褥蚯,如此便與生產(chǎn)服務(wù)的部署id沖突!
針對(duì)上述問題况增,我們模擬一下:準(zhǔn)備一張表:init_activities_20190321.sql (生產(chǎn)上的sql)
9.1、模擬生產(chǎn)環(huán)境
首先我們模擬生產(chǎn)環(huán)境:
我們往數(shù)據(jù)庫(kù)中導(dǎo)入init_activities_20190321.sql
隨便部署一個(gè)模型训挡,調(diào)用deploy方法澳骤,數(shù)據(jù)變化結(jié)果如下:
頁(yè)面效果:
數(shù)據(jù)庫(kù)變化:
9.1歧强、模擬測(cè)試環(huán)境新增模型
然后模擬測(cè)試環(huán)境:往數(shù)據(jù)庫(kù)中導(dǎo)入init_activities_20190321.sql三張表的結(jié)果如下:
然后啟動(dòng)服務(wù),新增兩條模型为肮,數(shù)據(jù)庫(kù)變化如下:
可以看到摊册,測(cè)試環(huán)境的act_ge_bytearray中新增的模型中有兩條數(shù)據(jù)的id與生產(chǎn)環(huán)境的act_ge_bytearray中的兩個(gè)數(shù)據(jù)的id一致,這樣的颊艳,如果將測(cè)試環(huán)境該三個(gè)表中的新增的模型數(shù)據(jù)導(dǎo)出來茅特,命名為update_activities_20190517.sql;在生產(chǎn)環(huán)境運(yùn)行棋枕,就會(huì)報(bào)主鍵沖突白修。
解決方案可查看工作流Activiti異常積累 異常4部分
上一篇:Spring學(xué)習(xí)之整合Activiti(二)
下一篇:工作流Activiti異常積累