我先簡單的介紹一下實現(xiàn)思路:
1、數(shù)據(jù)庫中應(yīng)該有至少三個已經(jīng)發(fā)布過的流程定義(ProcessDefinition),發(fā)布的順序無所謂,一個主流程兩個子流程
2、我們在主流程中要實現(xiàn)并發(fā)子流程的環(huán)節(jié)放置TaskNode,設(shè)置create-tasks="false"、signal="last-wait"
3、我們想要實現(xiàn)幾個子流程的并發(fā)就在第二步放置的TaskNode中放置幾個Task,每個Task的名字都是要并發(fā)的子流程的名稱
4、在TaskNode的Node-Enter action中,我們手動為每一個Task創(chuàng)建一個任務(wù)實例,同時我們?nèi)〉肨ask的名字也就是要并發(fā)的子流程的名字,創(chuàng)建流程實例
5、為每個新創(chuàng)建的流程實例設(shè)置流程變量:TaskInstanceID表示創(chuàng)建當(dāng)前子流程的那個主流程任務(wù)實例ID,并使子流程開始流轉(zhuǎn)
6、子流程結(jié)束,取得流程變量TaskInstanceID,該流程變量TaskInstanceID是創(chuàng)建他的那個主流程的任務(wù)實例,得到該TaskInstance,并TaskInstance.end();
這個時候因為我們設(shè)置了TaskNode的Signal為"last-wait",所以當(dāng)所有的子流程均結(jié)束的時候,主流程才會繼續(xù),這樣我們也就實現(xiàn)了子流程的并發(fā)效果。很簡單的一個思路實現(xiàn)起來也并不復(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
我們要利用這個TaskNode實現(xiàn)并發(fā)子流程,create-tasks="true"是為了可以手動控制任務(wù)實例的創(chuàng)建,同時創(chuàng)建子流程,
10
signal="last-wait"是為了實現(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("主流程啟動,并設(shè)置主流程ID");
29
</script>
30
</event>
31
<event type="process-end">
32
<script name="SuperProcessEnd">
33
System.out.println("主流程結(jié)束");
34
</script>
35
</event>
36
</process-definition>

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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("-------------------sub1流程啟動------------------------------");
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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

下面是該子流程的ProcessEndAction:
1
public 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)前子流程的那個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)前子流程的那個主流程taskInstance
11
TaskInstance taskInstance = jbpmTestFacade.geTaskInstance(Long.valueOf(taskInstanceID));
12
taskInstance.end();
13
}
14
15
}

2

3

4








5

6

7

8

9

10

11

12

13

14

15

思路很清楚,代碼也很簡單,按照這種方式我們可以讓子流程實現(xiàn)所有Task能實現(xiàn)的功能。
文章原創(chuàng),轉(zhuǎn)載請注明出處!