零全零美(www.zzgwt.com)
          生活中的很多事情,并不像If...Else那么簡(jiǎn)單!
          posts - 96,comments - 52,trackbacks - 0
                   關(guān)于JBPM中并發(fā)子流程的實(shí)現(xiàn)方式,網(wǎng)上有很多的說(shuō)法,但是好像每種辦法都有這樣那樣的缺點(diǎn),要么實(shí)現(xiàn)太復(fù)雜,要么就是會(huì)使Token無(wú)法繼續(xù)流轉(zhuǎn)。這里我介紹一種我的并發(fā)子流程的實(shí)現(xiàn)方式:使用TaskNode使任務(wù)并行的方式,模擬實(shí)現(xiàn)JBPM子流程的并發(fā)執(zhí)行。
           我先簡(jiǎn)單的介紹一下實(shí)現(xiàn)思路:
                   1、數(shù)據(jù)庫(kù)中應(yīng)該有至少三個(gè)已經(jīng)發(fā)布過(guò)的流程定義(ProcessDefinition),發(fā)布的順序無(wú)所謂,一個(gè)主流程兩個(gè)子流程
                   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-Enter 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,并使子流程開(kāi)始流轉(zhuǎn)
                   6、子流程結(jié)束,取得流程變量TaskInstanceID,該流程變量TaskInstanceID是創(chuàng)建他的那個(gè)主流程的任務(wù)實(shí)例,得到該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)起來(lái)也并不復(fù)雜. 
              
              首先讓我們看一下主流程的流程定義:
           1<?xml version="1.0" encoding="UTF-8"?>
           2<process-definition  xmlns=""  name="super1">
           3    <start-state name="start-state1">
           4        <transition to="task-node1"></transition>
           5    </start-state>
           6
           7    <task-node name="task-node1" create-tasks="false" signal="last-wait">
           8        <description>
           9            我們要利用這個(gè)TaskNode實(shí)現(xiàn)并發(fā)子流程,create-tasks="true"是為了可以手動(dòng)控制任務(wù)實(shí)例的創(chuàng)建,同時(shí)創(chuàng)建子流程,
          10            signal="last-wait"是為了實(shí)現(xiàn)當(dāng)所有子流程均已完成,主流程才能繼續(xù)運(yùn)行的效果
          11        </description>
          12        <task name="sub1">
          13            <description>要并發(fā)的子流程之一</description>
          14        </task>
          15        <task name="sub2">
          16            <description>要并發(fā)的子流程之二</description>
          17        </task>
          18        <event type="node-enter">
          19            <action name="NodeEnterAction" class="jbpmTest.bfzlc.action.NodeEnterAction"></action>
          20        </event>
          21        <transition to="end-state1"></transition>
          22    </task-node>
          23
          24    <end-state name="end-state1"></end-state>
          25
          26    <event type="process-start">
          27        <script name="SuperProcessStart">
          28            System.out.println(&quot;主流程啟動(dòng),并設(shè)置主流程ID&quot;);
          29        </script>
          30    </event>
          31    <event type="process-end">
          32        <script name="SuperProcessEnd">
          33            System.out.println(&quot;主流程結(jié)束&quot;);
          34        </script>
          35    </event>
          36</process-definition>

              下面是主流程的Node-EnterAction的代碼:

           1public class NodeEnterAction implements ActionHandler {
           2
           3    public void execute(ExecutionContext executionContext) throws Exception {
           4        //取得本節(jié)點(diǎn)所有的Task
           5        Set<Task> tasks = ((TaskNode)executionContext.getNode()).getTasks();
           6        
           7        TaskMgmtInstance tgmt = executionContext.getTaskMgmtInstance();
           8        
           9        for (Task task : tasks) {
          10            //為每一個(gè)Task創(chuàng)建實(shí)例
          11            TaskInstance taskInstance = tgmt.createTaskInstance(task, executionContext);
          12            //業(yè)務(wù)Service
          13            JbpmTestFacade jbpmTestFacade = ((JbpmTestFacade)SpringBeanUtil.getBean("jbpmTestFacade"));
          14            //根據(jù)Task的名字,為每一個(gè)Task創(chuàng)建相應(yīng)的子流程
          15            ProcessInstance processInstance = jbpmTestFacade.createProcessInstance(task.getName());
          16            //設(shè)置創(chuàng)建這個(gè)子流程的流程實(shí)例ID
          17            processInstance.getContextInstance().setVariable("TaskInstanceID", taskInstance.getId());
          18            //子流程開(kāi)始流轉(zhuǎn)
          19            processInstance.signal();
          20        }

          21        
          22    }

          23}

                  再看其中一個(gè)子流程的定義:

           1<?xml version="1.0" encoding="UTF-8"?>
           2<process-definition  xmlns=""  name="sub1">
           3    <start-state name="start-state1">
           4        <transition to="Sub1Task"></transition>
           5    </start-state>
           6
           7    <task-node name="Sub1Task">
           8        <task name="SubTask1"></task>
           9        <transition to="end-state1"></transition>
          10    </task-node>
          11
          12    <end-state name="end-state1"></end-state>
          13
          14    <event type="process-start">
          15        <script name="ProcessStartScript">
          16            System.out.println(&quot;-------------------sub1流程啟動(dòng)------------------------------&quot;);
          17        </script>
          18    </event>
          19
          20    <event type="process-end">
          21        <action name="SubProcessEndAction" class="jbpmTest.bfzlc.action.SubProcessEndAction"></action>
          22    </event>
          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        //得到創(chuàng)建當(dāng)前子流程的那個(gè)TaskInstanceID
           6        String taskInstanceID = executionContext.getContextInstance().getVariable("TaskInstanceID").toString();
           7        
           8        //業(yè)務(wù)Service
           9        JbpmTestFacade jbpmTestFacade = ((JbpmTestFacade)SpringBeanUtil.getBean("jbpmTestFacade"));
          10        //取得創(chuàng)建當(dāng)前子流程的那個(gè)主流程taskInstance
          11        TaskInstance taskInstance = jbpmTestFacade.geTaskInstance(Long.valueOf(taskInstanceID));
          12        taskInstance.end();
          13    }

          14
          15}
             
               思路很清楚,代碼也很簡(jiǎn)單,按照這種方式我們可以讓子流程實(shí)現(xiàn)所有Task能實(shí)現(xiàn)的功能。

              文章原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處!
          posted on 2008-11-12 15:00 零全零美 閱讀(3323) 評(píng)論(6)  編輯  收藏 所屬分類: jbpm

          FeedBack:
          # re: [原創(chuàng)]JBPM實(shí)踐之:并發(fā)子流程的實(shí)現(xiàn)
          2008-11-25 16:30 | zhaoyta
          有問(wèn)題  回復(fù)  更多評(píng)論
            
          # re: [原創(chuàng)]JBPM實(shí)踐之:并發(fā)子流程的實(shí)現(xiàn)
          2008-11-25 16:31 | zhaoyta
          假如你主流程里的task是分配給一個(gè)人,子流程也有可能建立其他任務(wù)給這個(gè)人。
          這個(gè)時(shí)候這個(gè)人獲得了多個(gè)任務(wù),如果手動(dòng)把主流程的task結(jié)束了怎么辦

            回復(fù)  更多評(píng)論
            
          # re: [原創(chuàng)]JBPM實(shí)踐之:并發(fā)子流程的實(shí)現(xiàn)
          2008-11-25 17:39 | 昨夜流星
          @zhaoyta
          看來(lái)你還是沒(méi)有明白我文中所說(shuō)的思路啊,主流程中用于創(chuàng)建子流程的那個(gè)Task是不分配給任何人的,該任務(wù)的實(shí)例從Task-Node的Enter-action中被創(chuàng)建,然后會(huì)把taskInstanceID作為流程級(jí)變量放入該任務(wù)實(shí)例創(chuàng)建的子流程中,在該子流程的Process-end的action中從流程變量里取出該taskInstanceId,然后把該任務(wù)實(shí)例結(jié)束掉。  回復(fù)  更多評(píng)論
            
          # re: [原創(chuàng)]JBPM實(shí)踐之:并發(fā)子流程的實(shí)現(xiàn)
          2009-05-03 09:53 | zhengjj
          要是實(shí)現(xiàn)數(shù)量不定的并發(fā)子流程,需要如何實(shí)現(xiàn)?請(qǐng)給點(diǎn)提示  回復(fù)  更多評(píng)論
            
          # re: [原創(chuàng)]JBPM實(shí)踐之:并發(fā)子流程的實(shí)現(xiàn)
          2009-05-19 10:13 | shappy
          @zhengjj
          苯啊,通過(guò)流程變量或者其他變通的方式傳遞你需要建立的子流程數(shù),甚至不通過(guò)任務(wù)名來(lái)建立自流程,自己傳變量確定子流程的名稱和數(shù)量也可以嘛。樓主起了個(gè)思路,其他的就很好做了。  回復(fù)  更多評(píng)論
            
          # re: [原創(chuàng)]JBPM實(shí)踐之:并發(fā)子流程的實(shí)現(xiàn)
          2009-05-31 22:27 | 昨夜流星
          樓上正解,其實(shí)我也是提供了一個(gè)基本的思路而已!  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 高唐县| 普洱| 大宁县| 石林| 锡林浩特市| 榕江县| 沁源县| 丹阳市| 射洪县| 吉木乃县| 德格县| 衡山县| 安达市| 阿勒泰市| 佛山市| 开化县| 博湖县| 上虞市| 南澳县| 阿勒泰市| 瑞丽市| 和龙市| 夹江县| 成安县| 肇源县| 陆丰市| 布尔津县| 沛县| 涪陵区| 灵山县| 锡林郭勒盟| 罗田县| 徐闻县| 定边县| 松潘县| 和平县| 万安县| 玉门市| 铜梁县| 海门市| 和林格尔县|