我們知道,UFLO包含uflo-core、uflo-console與uflo-client三個(gè)主要模塊,uflo-core主要負(fù)責(zé)流程的核心流轉(zhuǎn)控制;uflo-console則是采用dor ado7做為表現(xiàn)層,以網(wǎng)頁(yè)形式為我們提供了流程模版在在線監(jiān)控與測(cè)試;而uflo-client則提供給我們的程序員使用,程序員通過(guò)uflo-client模塊中 提供的ProcessClient與TaskClient實(shí)現(xiàn)業(yè)務(wù)系統(tǒng)與流程引擎的綁定。
在實(shí)際的使用當(dāng)中,我們推薦將UFLO與BDF2一起使用,這樣有了BDF2框架后,UFLO的使用就變得非常的簡(jiǎn)單,所以這里的最佳實(shí)踐以將以在 BDF2上使用UFLO為基礎(chǔ)來(lái)進(jìn)行介紹。將UFLO與BDF2結(jié)合使用,可以通過(guò)bdf2-uflo模塊實(shí)現(xiàn),關(guān)于bdf2-uflo模塊,之前已經(jīng)有過(guò)詳細(xì)介紹,這里就不再贅述了。在結(jié)合BDF2使用U FLO時(shí),一定要加上bdf2-uflo模塊,因?yàn)閎df2-uflo模塊的運(yùn)行依賴于uflo-core與uflo-console兩模塊,所以如果您的項(xiàng)目是Maven結(jié)構(gòu),那么 在添加好bdf2-uflo模塊后,Maven會(huì)為我們自動(dòng)加載uflo-core與uflo-console兩模塊及他們所依賴的其它第三方j(luò)ar文件。但如果您是普通的Dy namic web project項(xiàng)目,那么在添加好bdf2-uflo對(duì)應(yīng)的jar后,還需要手工添加uflo-core與uflo-console兩模塊jar及他們所依賴的其它第三方j(luò)ar文件。
值得注意的是,我們程序員要使用的uflo-client模塊并沒(méi)有被bdf2-uflo模塊所依賴,所以在添加完bdf2-uflo模塊后,我們還需要手添加到uflo-cli ent模塊(如果是Dynamic web project項(xiàng)目,需要手工添加uflo-client對(duì)應(yīng)的jar)。所以一個(gè)在bdf2中使用uflo,需要包含以下表格所示的四模塊。
我們知道,UFLO使用有兩種部署模式,也就是普通的嵌入式模式和獨(dú)立服務(wù)運(yùn)行模式。在實(shí)際項(xiàng)目開(kāi)發(fā)當(dāng)中,無(wú)論是哪種部署模式,在結(jié)合bdf2使用uflo時(shí)都需要上述表格中所描述的四個(gè)模塊,對(duì)于我們的程序員而言,只需要去調(diào)用uflo-client中的ProcessClient與TaskClient實(shí)現(xiàn)業(yè)務(wù)與流程的結(jié)合就行,而不用去關(guān)注將來(lái)使用UFLO的部署模式,因?yàn)槲覀儾捎肬FLO開(kāi)發(fā)的業(yè)務(wù)系統(tǒng)在運(yùn)行時(shí)是否采用獨(dú)立服務(wù)運(yùn)行模式,完全由uflo.restAccessBaseUrl屬性決定,它的值為遠(yuǎn)程獨(dú)立部署的UFLO Server所在應(yīng)用的地址,該屬性默認(rèn)值為空,也就是說(shuō)不定義訪問(wèn)遠(yuǎn)程的UFlo Server,這樣當(dāng)該屬性值為空時(shí),應(yīng)用中的UFLO將以嵌入式模式運(yùn)行,而不會(huì)去訪問(wèn)遠(yuǎn)程的UFLOServer;一旦我們配置了該屬性,那么UFLO中所有事關(guān)流程流轉(zhuǎn)的動(dòng)作將全部通過(guò)訪問(wèn)這個(gè)uflo.restAccessBaseUrl屬性指定的獨(dú)立部署的UFLo Server完成,從而實(shí)現(xiàn)獨(dú)立服務(wù)運(yùn)行模式;uflo.restAccessBaseUrl屬性值定義的格式如下:
uflo.restAccessBaseUrl屬性定義格式http://localhost:8080/uflo-test-server/dorado
從上述定義的格式來(lái)看,就是指定遠(yuǎn)程UFLO Server應(yīng)用地址,值得注意的時(shí),地址一定要以dorado結(jié)尾,這是因?yàn)閁FLOServer暴露給外部可訪問(wèn)的REST風(fēng)格的服務(wù)是通過(guò)Dorado7提供的Servlet完成的,所以這里要求一定要以dorado結(jié)尾。
采用獨(dú)立服務(wù)模式下,我們除了要為客戶端指定UFLO Server所在應(yīng)用地址外,還需要告訴我們的UFLOServer,當(dāng)前有多少個(gè)客戶端,它們的地址又分別是多少,所以我們還需要為UFLO Server定義一上屬性,以告訴UFLOServer當(dāng)前有哪些客戶端在調(diào)用當(dāng)前Server上的UFLO暴露的服務(wù),該屬性名稱為uflo.clients,屬性值定義格式如下:
uflo.clients屬性值定義格式http://localhost:8080/uflo-test-client1
可以看到,定義格式比較簡(jiǎn)單,我們只需要指定客戶端應(yīng)用所在地址就行,同時(shí)如果有多個(gè)客戶端,那么該屬性直接定義多個(gè)客戶端URL,中間用“;”分隔,如:
多個(gè)客戶端地址URL定義http://localhost:8080/uflo-test-client1;http://localhost:8080/uflo-test-client2;http://localhost:8080/uflo-test-client3
有了這個(gè)地址,當(dāng)我們采用我們的流程模版在線設(shè)計(jì)器修改已有的流程模版,在將修改好的流程模版部署的UFLO Server時(shí)或者在UFLOServer上刪除某個(gè)流程模版時(shí),我們的Server會(huì)利用這里定義的客戶端地址,通知所有客戶端立即更新對(duì)應(yīng)的流程模版,從而實(shí)現(xiàn)流程模版數(shù)據(jù)的同步。
前面的我們提過(guò),UFLO的獨(dú)立服務(wù)模式,不是一種純粹的獨(dú)立服務(wù)模式,而是一種混合嵌入式模式的獨(dú)立運(yùn)行,所以在獨(dú)立服務(wù)模式下,我們的客戶端應(yīng)用中同樣要包含uflo-core、uflo-console模塊。實(shí)際上,在UFLO獨(dú)立服務(wù)模式下,作為客戶端的業(yè)務(wù)系統(tǒng),其中的流程引擎只會(huì)將一些可能會(huì)影響流程流轉(zhuǎn)的操作發(fā)送到遠(yuǎn)程UFloServer上完成,而對(duì)于普通的流程信息查詢,則直接調(diào)用系統(tǒng)內(nèi)嵌入的UFLO引擎實(shí)現(xiàn),這樣做的即保證了大并發(fā)下流程引擎運(yùn)行的完整性,也大幅提升了系統(tǒng)的運(yùn)行效率。下圖向我們展示的UFLO的嵌入式運(yùn)行模式。
與嵌入式運(yùn)行模式相對(duì)應(yīng),一旦我們?cè)O(shè)置了uflo.restAccessBaseUrl屬性,那么我們的包含uflo的BDF2應(yīng)用,將自動(dòng)從嵌入式模式轉(zhuǎn)換為獨(dú)立服務(wù)與嵌入式混合模式,如下圖所示。
從上面的獨(dú)立服務(wù)部署模式的示意圖中可以看到,UFloServer也是一個(gè)普通的Web應(yīng)用,在這個(gè)應(yīng)用當(dāng)中只需要包含uflo-core、uflo-console及bdf2-uflo三個(gè)模塊即可,而不需要像我們的客戶端應(yīng)用那樣包含uflo-client模塊??梢钥吹剑c嵌入式不同的地方就是uflo.restAccessBaseUrl屬性從空值變成了UFloServer地址,這樣就完成了我們的業(yè)務(wù)系統(tǒng)從嵌入式運(yùn)行模式到獨(dú)立服務(wù)模式的轉(zhuǎn)換。
在獨(dú)立服務(wù)部署模式下,因?yàn)槲覀兊目蛻舳藨?yīng)用當(dāng)中也包含uflo-console模塊,所以我們的客戶端可直接訪問(wèn)uflo-console模塊當(dāng)中包含的流程監(jiān)控與測(cè)試中心頁(yè)面com.bstek.uflo.console.view.ProcessMaintain.d,但我們的UFloServer上也有這個(gè)頁(yè)面,那我們究竟應(yīng)該采用哪個(gè)呢?回答是UFloServer上的。因?yàn)橛辛薙erver,我們肯定不能再用各個(gè)客戶端中包含的監(jiān)控測(cè)試頁(yè)面了,而應(yīng)該用UFloServer上的這個(gè)頁(yè)面。除了這個(gè)頁(yè)面之外,其它的諸如待辦任務(wù)列表頁(yè)面com.bstek.uflo.console.view.TodoTaskMaintain.d,以及節(jié)假日配置頁(yè)面com.bstek.uflo.console.view.CalendarMaintain.d,都可以采用各個(gè)應(yīng)用uflo-console中自帶的頁(yè)面即可,因?yàn)檫@些頁(yè)面都只是數(shù)據(jù)的簡(jiǎn)單查看與維護(hù),不會(huì)影響流程的流轉(zhuǎn),所以不用使用UFlo Server上的。
在我們項(xiàng)目上線的時(shí)候,無(wú)論是我們的UFLO Server還是UFLO Client,都需要調(diào)整uflo.idBlockSize屬性,在安裝與配置一節(jié)點(diǎn)我們就解釋過(guò)這個(gè)屬性,我們知道它的作用是用于定義UFLO中所有表數(shù)據(jù)主鍵中的緩沖區(qū)大小的,緩存區(qū)越小,用完的速度就越快,這個(gè)屬性默認(rèn)值為10,比較便于我們開(kāi)發(fā)測(cè)試,正式部署到生產(chǎn)環(huán)境一定要修改該屬性值,一般情況下,可以修改該屬性值為5000,這樣可為系統(tǒng)提供一個(gè)比較大的ID緩存區(qū),提供給UFLO流程引擎使用,從而提高系統(tǒng)運(yùn)行效率。
對(duì)于采用UFLO Server運(yùn)行流程的UFLO的客戶端應(yīng)用來(lái)說(shuō),還需要添加一個(gè)名為uflo.disableScheduler的屬性,該屬性默認(rèn)值為false,用于標(biāo)明是否禁用當(dāng)前應(yīng)用中用于周期性掃描任務(wù)提醒功能的JOB,對(duì)于采用UFLOServer的UFLO的客戶端應(yīng)用來(lái)說(shuō),需要將該屬性值設(shè)置為true,表示禁用UFLO客戶端中周期性掃描任務(wù)提醒功能的JOB,這樣,所有掃描的工作都交由UFLO Server來(lái)完成。
更多建議: