<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    零全零美(www.zzgwt.com)
    生活中的很多事情,并不像If...Else那么簡單!
    posts - 96,comments - 52,trackbacks - 0
             關于JBPM中并發子流程的實現方式,網上有很多的說法,但是好像每種辦法都有這樣那樣的缺點,要么實現太復雜,要么就是會使Token無法繼續流轉。這里我介紹一種我的并發子流程的實現方式:使用TaskNode使任務并行的方式,模擬實現JBPM子流程的并發執行。
     我先簡單的介紹一下實現思路:
             1、數據庫中應該有至少三個已經發布過的流程定義(ProcessDefinition),發布的順序無所謂,一個主流程兩個子流程
             2、我們在主流程中要實現并發子流程的環節放置TaskNode,設置create-tasks="false"、signal="last-wait"
             3、我們想要實現幾個子流程的并發就在第二步放置的TaskNode中放置幾個Task,每個Task的名字都是要并發的子流程的名稱
             4、在TaskNode的Node-Enter action中,我們手動為每一個Task創建一個任務實例,同時我們取得Task的名字也就是要并發的子流程的名字,創建流程實例
             5、為每個新創建的流程實例設置流程變量:TaskInstanceID表示創建當前子流程的那個主流程任務實例ID,并使子流程開始流轉
             6、子流程結束,取得流程變量TaskInstanceID,該流程變量TaskInstanceID是創建他的那個主流程的任務實例,得到該TaskInstance,并TaskInstance.end();
             這個時候因為我們設置了TaskNode的Signal為"last-wait",所以當所有的子流程均結束的時候,主流程才會繼續,這樣我們也就實現了子流程的并發效果。很簡單的一個思路實現起來也并不復雜. 
        
        首先讓我們看一下主流程的流程定義:
     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            我們要利用這個TaskNode實現并發子流程,create-tasks="true"是為了可以手動控制任務實例的創建,同時創建子流程,
    10            signal="last-wait"是為了實現當所有子流程均已完成,主流程才能繼續運行的效果
    11        </description>
    12        <task name="sub1">
    13            <description>要并發的子流程之一</description>
    14        </task>
    15        <task name="sub2">
    16            <description>要并發的子流程之二</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;主流程啟動,并設置主流程ID&quot;);
    29        </script>
    30    </event>
    31    <event type="process-end">
    32        <script name="SuperProcessEnd">
    33            System.out.println(&quot;主流程結束&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        //取得本節點所有的Task
     5        Set<Task> tasks = ((TaskNode)executionContext.getNode()).getTasks();
     6        
     7        TaskMgmtInstance tgmt = executionContext.getTaskMgmtInstance();
     8        
     9        for (Task task : tasks) {
    10            //為每一個Task創建實例
    11            TaskInstance taskInstance = tgmt.createTaskInstance(task, executionContext);
    12            //業務Service
    13            JbpmTestFacade jbpmTestFacade = ((JbpmTestFacade)SpringBeanUtil.getBean("jbpmTestFacade"));
    14            //根據Task的名字,為每一個Task創建相應的子流程
    15            ProcessInstance processInstance = jbpmTestFacade.createProcessInstance(task.getName());
    16            //設置創建這個子流程的流程實例ID
    17            processInstance.getContextInstance().setVariable("TaskInstanceID", taskInstance.getId());
    18            //子流程開始流轉
    19            processInstance.signal();
    20        }

    21        
    22    }

    23}

            再看其中一個子流程的定義:

     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流程啟動------------------------------&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()+"結束");
     5        //得到創建當前子流程的那個TaskInstanceID
     6        String taskInstanceID = executionContext.getContextInstance().getVariable("TaskInstanceID").toString();
     7        
     8        //業務Service
     9        JbpmTestFacade jbpmTestFacade = ((JbpmTestFacade)SpringBeanUtil.getBean("jbpmTestFacade"));
    10        //取得創建當前子流程的那個主流程taskInstance
    11        TaskInstance taskInstance = jbpmTestFacade.geTaskInstance(Long.valueOf(taskInstanceID));
    12        taskInstance.end();
    13    }

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

        文章原創,轉載請注明出處!
    posted on 2008-11-12 15:00 零全零美 閱讀(3318) 評論(6)  編輯  收藏 所屬分類: jbpm

    FeedBack:
    # re: [原創]JBPM實踐之:并發子流程的實現
    2008-11-25 16:30 | zhaoyta
    有問題  回復  更多評論
      
    # re: [原創]JBPM實踐之:并發子流程的實現
    2008-11-25 16:31 | zhaoyta
    假如你主流程里的task是分配給一個人,子流程也有可能建立其他任務給這個人。
    這個時候這個人獲得了多個任務,如果手動把主流程的task結束了怎么辦

      回復  更多評論
      
    # re: [原創]JBPM實踐之:并發子流程的實現
    2008-11-25 17:39 | 昨夜流星
    @zhaoyta
    看來你還是沒有明白我文中所說的思路啊,主流程中用于創建子流程的那個Task是不分配給任何人的,該任務的實例從Task-Node的Enter-action中被創建,然后會把taskInstanceID作為流程級變量放入該任務實例創建的子流程中,在該子流程的Process-end的action中從流程變量里取出該taskInstanceId,然后把該任務實例結束掉。  回復  更多評論
      
    # re: [原創]JBPM實踐之:并發子流程的實現
    2009-05-03 09:53 | zhengjj
    要是實現數量不定的并發子流程,需要如何實現?請給點提示  回復  更多評論
      
    # re: [原創]JBPM實踐之:并發子流程的實現
    2009-05-19 10:13 | shappy
    @zhengjj
    苯啊,通過流程變量或者其他變通的方式傳遞你需要建立的子流程數,甚至不通過任務名來建立自流程,自己傳變量確定子流程的名稱和數量也可以嘛。樓主起了個思路,其他的就很好做了。  回復  更多評論
      
    # re: [原創]JBPM實踐之:并發子流程的實現
    2009-05-31 22:27 | 昨夜流星
    樓上正解,其實我也是提供了一個基本的思路而已!  回復  更多評論
      
    主站蜘蛛池模板: 成人免费无码大片A毛片抽搐色欲 成人免费无码大片a毛片 | 亚洲熟妇无码一区二区三区导航 | 中文字幕久精品免费视频| 久久久影院亚洲精品| 一个人免费观看视频www| 一区二区三区在线免费| 亚洲国产精品国自产电影| 四虎影视免费在线| 伊人免费在线观看高清版| 亚洲一区二区影视| 亚洲综合av永久无码精品一区二区 | 中文字幕免费在线观看| 亚洲Av永久无码精品黑人| 亚洲AV电影院在线观看| 国产精品免费_区二区三区观看| 久久久久久久久久免免费精品 | 精品国产免费一区二区三区| 亚洲AV第一页国产精品| 国产免费小视频在线观看| 未满十八18禁止免费无码网站| 亚洲色精品三区二区一区| 亚洲男同帅GAY片在线观看| 日韩精品无码人妻免费视频| 国产午夜无码精品免费看| 亚洲av无码成人精品区一本二本| 亚洲一区二区三区香蕉| 国产不卡免费视频| 国产成人精品免费视频大| 国产高清视频免费在线观看| 亚洲精品无播放器在线播放| 亚洲美女人黄网成人女| 中文字幕精品亚洲无线码一区 | 亚洲午夜精品一级在线播放放| 四虎永久在线观看免费网站网址| 一区二区三区视频免费观看| 亚洲国产精华液2020| 91嫩草亚洲精品| 亚洲午夜视频在线观看| 亚洲无线码在线一区观看| 亚洲av无码专区在线观看素人| 久久久久免费看黄A片APP|