JBPM實(shí)踐之并發(fā)子流程的實(shí)現(xiàn)_第1頁
JBPM實(shí)踐之并發(fā)子流程的實(shí)現(xiàn)_第2頁
JBPM實(shí)踐之并發(fā)子流程的實(shí)現(xiàn)_第3頁
JBPM實(shí)踐之并發(fā)子流程的實(shí)現(xiàn)_第4頁
JBPM實(shí)踐之并發(fā)子流程的實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、關(guān)于JBPM中并發(fā)子流程的實(shí)現(xiàn)方式,網(wǎng)上有很多的說法,但是好像每種辦法都有這樣那樣的缺點(diǎn),要么實(shí)現(xiàn)太復(fù)雜,要么就是會(huì)使Token無法繼續(xù)流轉(zhuǎn)。這里我介紹一種我的并發(fā)子流程的實(shí)現(xiàn)方式:使用TaskNode使任務(wù)并行的方式,模擬實(shí)現(xiàn)JBPM子流程的并發(fā)執(zhí)行。 我先簡(jiǎn)單的介紹一下實(shí)現(xiàn)思路:         1、數(shù)據(jù)庫中應(yīng)該有至少三個(gè)已經(jīng)發(fā)布過的流程定義(ProcessDefinition),發(fā)布的順序無所謂,一個(gè)主流程兩個(gè)子流程      &

2、#160;  2、我們?cè)谥髁鞒讨幸獙?shí)現(xiàn)并發(fā)子流程的環(huán)節(jié)放置TaskNode,設(shè)置create-tasks="false"、signal="last-wait"         3、我們想要實(shí)現(xiàn)幾個(gè)子流程的并發(fā)就在第二步放置的TaskNode中放置幾個(gè)Task,每個(gè)Task的名字都是要并發(fā)的子流程的名稱         4、在TaskNode的Node-Ent

3、er action中,我們手動(dòng)為每一個(gè)Task創(chuàng)建一個(gè)任務(wù)實(shí)例,同時(shí)我們?nèi)〉肨ask的名字也就是要并發(fā)的子流程的名字,創(chuàng)建流程實(shí)例         5、為每個(gè)新創(chuàng)建的流程實(shí)例設(shè)置流程變量:TaskInstanceID表示創(chuàng)建當(dāng)前子流程的那個(gè)主流程任務(wù)實(shí)例ID,并使子流程開始流轉(zhuǎn)         6、子流程結(jié)束,取得流程變量TaskInstanceID,該流程變量TaskInstanceID是創(chuàng)建他的那個(gè)主流程的任務(wù)實(shí)

4、例,得到該TaskInstance,并TaskInstance.end();         這個(gè)時(shí)候因?yàn)槲覀冊(cè)O(shè)置了TaskNode的Signal為"last-wait",所以當(dāng)所有的子流程均結(jié)束的時(shí)候,主流程才會(huì)繼續(xù),這樣我們也就實(shí)現(xiàn)了子流程的并發(fā)效果。很簡(jiǎn)單的一個(gè)思路實(shí)現(xiàn)起來也并不復(fù)雜.         首先讓我們看一下主流程的流程定義: 1<?xml version

5、="1.0" encoding="UTF-8"?> 2<process-definition  xmlns=""  name="super1"> 3    <start-state name="start-state1"> 4        <trans

6、ition to="task-node1"></transition> 5    </start-state> 6 7    <task-node name="task-node1" create-tasks="false" signal="last-wait"> 8    &

7、#160;   <description> 9            我們要利用這個(gè)TaskNode實(shí)現(xiàn)并發(fā)子流程,create-tasks="true"是為了可以手動(dòng)控制任務(wù)實(shí)例的創(chuàng)建,同時(shí)創(chuàng)建子流程,10            signal="last-wait"

8、是為了實(shí)現(xiàn)當(dāng)所有子流程均已完成,主流程才能繼續(xù)運(yùn)行的效果11        </description>12        <task name="sub1">13            <description>要并發(fā)的子流程之一</descri

9、ption>14        </task>15        <task name="sub2">16            <description>要并發(fā)的子流程之二</description>17  

10、60;     </task>18        <event type="node-enter">19            <action name="NodeEnterAction" class="jbpmTest.bfzlc.act

11、ion.NodeEnterAction"></action>20        </event>21        <transition to="end-state1"></transition>22    </task-node>2324    &l

12、t;end-state name="end-state1"></end-state>2526    <event type="process-start">27        <script name="SuperProcessStart">28        

13、60;   System.out.println(&quot;主流程啟動(dòng),并設(shè)置主流程ID&quot;);29        </script>30    </event>31    <event type="process-end">32       &#

14、160;<script name="SuperProcessEnd">33            System.out.println(&quot;主流程結(jié)束&quot;);34        </script>35    </event>36</process-defi

15、nition>    下面是主流程的Node-EnterAction的代碼: 1public class NodeEnterAction implements ActionHandler  2 3    public void execute(ExecutionContext executionContext) throws Exception  4 

16、       /取得本節(jié)點(diǎn)所有的Task 5        Set<Task> tasks = (TaskNode)executionContext.getNode().getTasks(); 6         7       

17、; TaskMgmtInstance tgmt = executionContext.getTaskMgmtInstance(); 8         9        for (Task task : tasks) 10         

18、   /為每一個(gè)Task創(chuàng)建實(shí)例11            TaskInstance taskInstance = tgmt.createTaskInstance(task, executionContext);12            /業(yè)務(wù)Service13  &

19、#160;         JbpmTestFacade jbpmTestFacade = (JbpmTestFacade)SpringBeanUtil.getBean("jbpmTestFacade");14            /根據(jù)Task的名字,為每一個(gè)Task創(chuàng)建相應(yīng)的子流程15    

20、        ProcessInstance processInstance = jbpmTestFacade.createProcessInstance(task.getName();16            /設(shè)置創(chuàng)建這個(gè)子流程的流程實(shí)例ID17         

21、0;  processInstance.getContextInstance().setVariable("TaskInstanceID", taskInstance.getId();18            /子流程開始流轉(zhuǎn)19            processInstance.signal();20

22、        21        22    23        再看其中一個(gè)子流程的定義: 1<?xml version="1.0" encoding="UTF-8"?> 2<process-definition

23、60; xmlns=""  name="sub1"> 3    <start-state name="start-state1"> 4        <transition to="Sub1Task"></transition> 5    

24、;</start-state> 6 7    <task-node name="Sub1Task"> 8        <task name="SubTask1"></task> 9        <transition to=&quo

25、t;end-state1"></transition>10    </task-node>1112    <end-state name="end-state1"></end-state>1314    <event type="process-start">15      

26、0; <script name="ProcessStartScript">16            System.out.println(&quot;-sub1流程啟動(dòng)-&quot;);17        </script>18    </event>1920

27、60;   <event type="process-end">21        <action name="SubProcessEndAction" class="jbpmTest.bfzlc.action.SubProcessEndAction"></action>22    </event>23<

28、/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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論