版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上關(guān)于JBPM中并發(fā)子流程的實(shí)現(xiàn)方式,網(wǎng)上有很多的說法,但是好像每種辦法都有這樣那樣的缺點(diǎn),要么實(shí)現(xiàn)太復(fù)雜,要么就是會使Token無法繼續(xù)流轉(zhuǎn)。這里我介紹一種我的并發(fā)子流程的實(shí)現(xiàn)方式:使用TaskNode使任務(wù)并行的方式,模擬實(shí)現(xiàn)JBPM子流程的并發(fā)執(zhí)行。 我先簡單的介紹一下實(shí)現(xiàn)思路: 1、數(shù)據(jù)庫中應(yīng)該有至少三個已經(jīng)發(fā)布過的流程定義(ProcessDefinition),發(fā)布的順序無所謂,一個主流程兩個子流程
2、 2、我們在主流程中要實(shí)現(xiàn)并發(fā)子流程的環(huán)節(jié)放置TaskNode,設(shè)置create-tasks="false"、signal="last-wait" 3、我們想要實(shí)現(xiàn)幾個子流程的并發(fā)就在第二步放置的TaskNode中放置幾個Task,每個Task的名字都是要并發(fā)的子流程的名稱 4、在Task
3、Node的Node-Enter action中,我們手動為每一個Task創(chuàng)建一個任務(wù)實(shí)例,同時我們?nèi)〉肨ask的名字也就是要并發(fā)的子流程的名字,創(chuàng)建流程實(shí)例 5、為每個新創(chuàng)建的流程實(shí)例設(shè)置流程變量:TaskInstanceID表示創(chuàng)建當(dāng)前子流程的那個主流程任務(wù)實(shí)例ID,并使子流程開始流轉(zhuǎn) 6、子流程結(jié)束,取得流程變量TaskInstanceID,該流程變量TaskInstanceID是
4、創(chuàng)建他的那個主流程的任務(wù)實(shí)例,得到該TaskInstance,并TaskInstance.end(); 這個時候因?yàn)槲覀冊O(shè)置了TaskNode的Signal為"last-wait",所以當(dāng)所有的子流程均結(jié)束的時候,主流程才會繼續(xù),這樣我們也就實(shí)現(xiàn)了子流程的并發(fā)效果。很簡單的一個思路實(shí)現(xiàn)起來也并不復(fù)雜. 首先讓我們看一下主流程的流程定義: 1<?xml
5、 version="1.0" encoding="UTF-8"?> 2<process-definition xmlns="" name="super1"> 3 <start-state name="start-state1"> 4
6、160;<transition to="task-node1"></transition> 5 </start-state> 6 7 <task-node name="task-node1" create-tasks="false" signal="last-wait"> 8
7、 <description> 9 我們要利用這個TaskNode實(shí)現(xiàn)并發(fā)子流程,create-tasks="true"是為了可以手動控制任務(wù)實(shí)例的創(chuàng)建,同時創(chuàng)建子流程,10 signal="la
8、st-wait"是為了實(shí)現(xiàn)當(dāng)所有子流程均已完成,主流程才能繼續(xù)運(yùn)行的效果11 </description>12 <task name="sub1">13 <description>要并發(fā)的子流程
9、之一</description>14 </task>15 <task name="sub2">16 <description>要并發(fā)的子流程之二</description>17
10、160; </task>18 <event type="node-enter">19 <action name="NodeEnterAction" class="jbpmT
11、est.bfzlc.action.NodeEnterAction"></action>20 </event>21 <transition to="end-state1"></transition>22 </task-node>2324 &
12、#160; <end-state name="end-state1"></end-state>2526 <event type="process-start">27 <script name="SuperProcessStart">28
13、160; System.out.println("主流程啟動,并設(shè)置主流程ID");29 </script>30 </event>31 <event type="process-end">32 &
14、#160; <script name="SuperProcessEnd">33 System.out.println("主流程結(jié)束");34 </script>35 </event>36<
15、/process-definition> 下面是主流程的Node-EnterAction的代碼: 1public class NodeEnterAction implements ActionHandler 2 3 public void execute(ExecutionContext executionContext) throws Exception
16、 4 /取得本節(jié)點(diǎn)所有的Task 5 Set<Task> tasks = (TaskNode)executionContext.getNode().getTasks(); 6 7
17、0; TaskMgmtInstance tgmt = executionContext.getTaskMgmtInstance(); 8 9 for (Task task : tasks) 10
18、; /為每一個Task創(chuàng)建實(shí)例11 TaskInstance taskInstance = tgmt.createTaskInstance(task, executionContext);12 /業(yè)務(wù)Service13
19、 JbpmTestFacade jbpmTestFacade = (JbpmTestFacade)SpringBeanUtil.getBean("jbpmTestFacade");14 /根據(jù)Task的名字,為每一個Task創(chuàng)建相應(yīng)的子流程15
20、; ProcessInstance processInstance = jbpmTestFacade.createProcessInstance(task.getName();16 /設(shè)置創(chuàng)建這個子流程的流程實(shí)例ID17
21、60; processInstance.getContextInstance().setVariable("TaskInstanceID", taskInstance.getId();18 /子流程開始流轉(zhuǎn)19 processInstanc
22、e.signal();20 21 22 23 再看其中一個子流程的定義: 1<?xml version="1.0" encoding="UTF-8"?> 2<process-
23、definition xmlns="" name="sub1"> 3 <start-state name="start-state1"> 4 <transition to="Sub1Task"></transition> 5
24、0; </start-state> 6 7 <task-node name="Sub1Task"> 8 <task name="SubTask1"></task> 9 <transition
25、 to="end-state1"></transition>10 </task-node>1112 <end-state name="end-state1"></end-state>1314 <event type="process-start">15
26、60; <script name="ProcessStartScript">16 System.out.println("-sub1流程啟動-");17 </script>18 </eve
27、nt>1920 <event type="process-end">21 <action name="SubProcessEndAction" class="jbpmTest.bfzlc.action.SubProcessEndAction"></action>22 </ev
28、ent>23</process-definition>24 下面是該子流程的ProcessEndAction: 1public class SubProcessEndAction implements ActionHandler 2 3 public void execute(ExecutionContext executionContext) throws Exception 4 System.out.println(executionContext.getProcessDefinition().getName()+"結(jié)束"); 5
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 犬皮膚病診治
- 膽囊切除手術(shù)后的飲食與生活注意
- 麥子課件教案教學(xué)課件
- 匆匆的 課件教學(xué)課件
- 采購小組長述職報告
- 高三化學(xué)一輪復(fù)習(xí) 第一章 第1講 考點(diǎn)三 分散系 膠體 課件
- 4.1.1原電池的工作原理上學(xué)期人教版(2019)選擇性必修1
- 腕手關(guān)節(jié)僵硬的康復(fù)治療
- 不玩危險物品教案反思
- 甲狀腺核磁共振成像結(jié)果
- 自然災(zāi)害風(fēng)險管理
- 中國智庫名錄類別索引-社會智庫
- 世界七大洲及各個國家的英文名字
- 管溝回填土、砂施工方案及工藝方法
- 情緒的身體密碼-心理健康教育教案
- 2023年中考復(fù)習(xí)文言文比較訓(xùn)練-《誡子書》與“世家子弟最易犯”
- YS/T 285-2012鋁電解用預(yù)焙陽極
- GB/T 4339-1999金屬材料熱膨脹特征參數(shù)的測定
- GB/T 15706-2012機(jī)械安全設(shè)計通則風(fēng)險評估與風(fēng)險減小
- GB/T 14337-2008化學(xué)纖維短纖維拉伸性能試驗(yàn)方法
- 《兩彈一星錢學(xué)森的科學(xué)精神與家國情懷【3500字】》
評論
0/150
提交評論