我先簡(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("主流程啟動(dòng),并設(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é)點(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
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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("-------------------sub1流程啟動(dòng)------------------------------");
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)前子流程的那個(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
}

2

3

4








5

6

7

8

9

10

11

12

13

14

15

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