jBPM-jPDL学习笔记 - 流程设计与控制- jBPM3.1.4 下载本文

53. } 54. /**

55. * 填写提交申请单 56. * @param money 57. */

58. protected void submitApplication(int money){ 59. System.out.println(\ation()==\

60. TaskInstance ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next() ;

61. System.out.println(\

62. ContextInstance ci = ti.getContextInstance(); 63. ci.setVariable(\64. ti.end(); 65. } 66. /**

67. * 部门经理审批 68. * @param pass 69. */

70. @SuppressWarnings(\

71. protected void approveByManager(boolean pass){ 72. System.out.println(\ager()==\

73. Iterator it = pi.getTaskMgmtInstance().getTaskInstances().iterator();

74. for( ;it.hasNext(); ){

75. TaskInstance ti = it.next();

76. if(ti.getActorId().equals(\77. List transitions = ti.getToken().getNode().getLeavingTransitions();

78. for(Transition t : transitions){

79. System.out.println(\Name());

80. }

81. assertEquals(\));

82. if(pass){

83. ti.end(\部门经理审批通过\84. }else{

85. ti.end(\部门经理驳回\86. }

87. return; 88. }

89. } 90. } 91. 92. /**

93. * 总经理审批 94. * @param pass 95. */

96. @SuppressWarnings(\

97. protected void approveByPresident(boolean pass){

98. System.out.println(\President()==\99.

100. Iterator it = pi.getTaskMgmtInstance().getTaskInstances().iterator(); 101.

102. for( ;it.hasNext(); ){ 103.

104. TaskInstance ti = it.next(); 105.

106. if(ti.getActorId().equals(\

107. List transitions = ti.getToken().getNode().getLeavingTransitions();

108. for(Transition t : transitions){ 109. System.out.println(\\

110. }

111. assertEquals(\());

112. if(pass){

113. ti.end(\总经理审批通过\114. }else{

115. ti.end(\总经理驳回\116. }

117. return; 118. } 119. } 120. } 121. /**

122. * 打印任务记录 123. */

124. @SuppressWarnings(\

125. protected void checkTasks(){

126. System.out.println(\sks()==\

127. Collection coll = pi.getTaskMgmtInstance().getTaskInstances();

128. System.out.println(\

129. for(TaskInstance ti : coll){

130. System.out.println(\

131. System.out.println(\\

132. System.out.println(\oString() +\133. }

134. System.out.println(\135. }

该案例是在没有数据库支持的情况下,对报销流程进行运行测试,测试逻辑如下:

1. 加载流程定义 Java代码

1. ProcessDefinition.parseXmlResource(\.xml\代码说明:

在没有数据库存储的情况下,流程定义通过ProcessDefinition类直接从processdefinition.xml文件中解析加载。

2. 实例化流程对象 Java代码

1. //生成实例

2. pi = pdf.createProcessInstance();

3. assertNotNull(\4. //设置流程发起人

5. pi.getContextInstance().createVariable(\6. //触发流程转向 7. pi.signal();

代码说明:

在获得流程定义的实例后,可以用它生成流程实例,使用如下的语句: pi = pdf.createProcessInstance();

流程实例拥有自己的ContextInstance环境变量对象。它实际上是一个HashMap,以key-value方式记录了流程的上下文变量值,代码中的

pi.getContextInstance().createVariable(\就是向环境变量中添加一个key为initiator的对象。

每个流程实例都拥有自己Token令牌对象,主流程有自己的RootToken,子流程也拥有自己的子Token。父流程的Token和子流程的Token相互关联,形成Token树。

Token对象表示流程运行的当前位置(运行到哪个节点了)。通过对Token对象的signal()方法调用,可以使流程向下运行。代码中的pi.signal();实际上是间接调用了pi.getRootToken().signal();它使得新建的流程继续向下个节点(即借款申请单填写)进发。

3. 员工发起借款申请 Java代码

1. /**

2. * 填写提交申请单 3. * @param money 4. */

5. protected void submitApplication(int money){

6. System.out.println(\cation()==\7.

8. TaskInstance ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next()

9. System.out.println(\10. ContextInstance ci = ti.getContextInstance(); 11. ci.setVariable(\12. ti.end();

代码说明:

在借款流程发起后,流程进入了申请单填写阶段。这个阶段是个人工的任务,需要用户的介入。因此,对于要借款的用户而言,首先是获取填写申请单的任务实例:

TaskInstance ti =

(TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next()

在这个测试类中,由于没有数据库。对流程实例的引用是依靠了类的全局标量pi。这里通过pi获取全部的任务列表。实际上有且仅有一个任务,就是我们刚刚发起的申请单填写任务。

接下来,我们获取流程的上下文变量,将申请借款的数额记录在上下文变量中ContextInstance ci = ti.getContextInstance(); ci.setVariable(\

最后,我们要结束当前任务,告诉流程继续下行,调用ti.end();这个方法的

本质依然是调用了token.signal(),它选择了一个默认的transition进行转向。这里要说明的是signal方法有多态的实现signal(Transition transition),是可以指定具体转向参数的。

4. 部门领导审批申请 Java代码

1. /**

2. * 部门经理审批 3. * @param pass 4. */

5. @SuppressWarnings(\

6. protected void approveByManager(boolean pass){ 7. System.out.println(\ager()==\

8. Iterator it = pi.getTaskMgmtInstance().getTaskInstances().iterator();

9. for( ;it.hasNext(); ){

10. TaskInstance ti = it.next();

11. if(ti.getActorId().equals(\12. List transitions = ti.getToken().getNode().getLeavingTransitions();

13. for(Transition t : transitions){

14. System.out.println(\Name());

15. }

16. assertEquals(\));

17. if(pass){

18. ti.end(\部门经理审批通过\19. }else{

20. ti.end(\部门经理驳回\21. }

22. return; 23. } 24. } 25.}

代码说明:

这里,流程进入了部门经理审批阶段。由于没有数据库支持,我们只能采取遍历任务列表,并比对委派者ID的方式来确定委派给部门经理的任务实例。(在后面的基于数据库的标准案例中,我们会看到如果根据用户的ID来获取分配给指定用户的任务)

ti.getActorId().equals(\比对任务的委派人。