扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
概述
在 WLI81 中无法象 WLI70 中那样,在一个流程中后面的节点可以直接跳转到前面的流程。就好比在程序设计中, WLI70 中有 GOTO 语句,可以随意进行跳转,但整个程序结构不太好。而 WLI81 中,好像没有 GOTO 语句。虽然结构比较好,但有时候也确实不方便。但就象程序设计中可以用 WHILE , SWITCH 等语句代替 GOTO 语句。在 WLI81 中也可以通过 WHILE , SWITCH 等来实现流程的跳转。下面我们通过一个例子来说明。
例子流程说明
某单位有一个采购流程如下图所示,该流程说明如下:
先由采购人员填写申请材料,提交科长审批
如果科长审批通过,再由处长审批,
如果科长审批不通过,重新填写申请材料。
如果处长审批通过,再由局长审批,
如果处长审批不通过,再由科长重新审批。
如果局长审批通过,则流程结束
如果局长审批不通过,再由处长审批。
所以该流程在执行过程中,需要从后面的节点跳到前面的节点,并重新执行。在 WLI81 中可以通过 SWITCH 结合 DO WHILE 来实现这样的流程。
在WLI81中实现该流程
在 WLI81 中,整个流程如下图所示:在 SWITCH 中有T1,T2,T3三个分支,分别代表科长,处长,局长审批 3 个任务。在 SWITCH 执行完毕后,进入下面的“审批是否都已结束”子流程。在该子流程中根据审批是通过还是不通过,决定下一步要执行的子流程(是T1,T2,T3,还是结束)。 在 SWITCH 外面有个 DO WHILE 条件。只有局长审批通过,该 DO WHILE 的条件才会为假,从而结束整个流程。
在上面流程中 “初始化任务”节点的代码如下:为简单起见,T1,T2,T3中的任务我们采用 assignTaskToUser 方式指派给系统的管理员: weblogic. 定义一个 boolean 型全局变量 overProcess 。当它为 true 时,整个流程结束。nextProcess 全局变量指定下一个要执行的分支,初始是T1。以后有可能是T1,T2,T3。
“初始化任务”节点的代码如下:
this.taskName=""
this.assigner="weblogic";
this.overProcess=false;
if (this.nextProcess==null) nextProcess="T1";
在T1分支的 assign task 的代码如下:
System.out.println("***enterT1branch*****");
this.taskName="task1";
同理:在T2分支的 assign task 的代码如下:
System.out.println("***enterT2branch*****");
this.taskName="task2";
在T3分支的 assign task 的代码如下:
System.out.println("***enterT3branch*****");
this.taskName="task3";
在T1的 task1CreateTaskByName 代码如下:在T2,T3中,把 task1 改为 task2,task3 ,其他一样。
public void task1CreateTaskByName() throws Exception
{
//#START: CODE GENERATED - PROTECTED SECTION - you can safely add code above this comment in this method. #//
// input transform
// return method call
this.retTaskName = task1.createTaskByName(this.taskName);
// output transform
// output assignments
//#END : CODE GENERATED - PROTECTED SECTION - you can safely add code below this comment in this method. #//
}
在T1的AssignTaskToUser 代码如下,在T2 ,T3中,把task1改为task2,task3,其他一样
public void task1AssignTaskToUser() throws Exception
{
//#START: CODE GENERATED - PROTECTED SECTION - you can safely add code above this comment in this method. #//
// input transform
// method call
task1.assignTaskToUser(this.assigner);
// output transform
// output assignments
//#END : CODE GENERATED - PROTECTED SECTION - you can safely add code below this comment in this method. #//
在T1分支的 onTaskCompleted 的代码如下:
public void task1_onTaskCompleted(com.bea.xml.XmlObject response)
{
//#START: CODE GENERATED - PROTECTED SECTION - you can safely add code above this comment in this method. #//
// input transform
// parameter assignment
this.taskResponse = response;
//#END : CODE GENERATED - PROTECTED SECTION - you can safely add code below this comment in this method. #//
System.out.println("T1 : task1_onTaskCompleted=" + response);
String s= response.toString();
if(s.equals(""))
{
approved=true;
}
else
{
approved=false;
}
task1=null;
}
在T1分支的 onTaskAborted 的代码如下:
public void task1_onTaskAborted(com.bea.xml.XmlObject response)
{
//#START: CODE GENERATED - PROTECTED SECTION - you can safely add code above this comment in this method. #//
// input transform
// parameter assignment
this.taskResponse = response;
//#END : CODE GENERATED - PROTECTED SECTION - you can safely add code below this comment in this method. #/
System.out.println("T1 task1_onTaskAborted=" + response);
task1=null;
}
这样如果T1审批通过,approved=true; “同意”节点的判断代码为
public boolean ifApproved()
public boolean ifApproved()
{
return approved;
}
这将执行“继续下一任务” 节点。该节点的代码为:
public void nextProcess() throws java.lang.Exception
{
int tmpProcessID;
tmpProcessID=Integer.parseInt(nextProcess.substring(1))+1;
nextProcess=nextProcess.substring(0,1)+tmpProcessID;
if(nextProcess.equals("T0")) nextProcess="T1";
System.out.println(" 继续:下一个任务为 : "+nextProcess);
}
这样 nextProcess 的值为T2,在 SWITCH 中的代码为:
public String taskProcess()
{
if (this.nextProcess==null)
nextProcess="T1";
return nextProcess;
}
所以下一步执行T2分支。
如果T1审批没有通过,则 approved=false, 执行的是“回退到上一个任务”节点。该节点的代码为:
public String taskProcess()
{
if (this.nextProcess==null)
nextProcess="T1";
return nextProcess;
}
这样,下是一个要执行的分支还是T1,如果是在执行T2时审批没有通过,那么下一步要执行的将是T1,
T2 分支 onTaskCompleted()和onTaskAborted()代码与T1分支一样,只不过把 task1 改为 task2 。
在T3分支的 onTaskCompleted 的代码如下:
如果T3审批通过,则 this.overProcess=true; 语句将使“继续”条件判断为假,从而执行“结束流程“分支,,整个 DO WHILE 的条件也为假。整个 DO WHILE 结束。流程结束。
public void task3_onTaskCompleted(com.bea.xml.XmlObject response)
{
//#START: CODE GENERATED - PROTECTED SECTION - you can safely add code above this comment in this method. #//
// input transform
// parameter assignment
this.taskResponse = response;
//#END : CODE GENERATED - PROTECTED SECTION - you can safely add code below this comment in this method. #//
System.out.println("T3task3_onTaskCompleted=" + response);
String s=response.toString();
if(s.equals("
{
approved=true;
this.overProcess=true;
System.out.println("exit do while loop");
}
else
{
approved=false;
}
task3=null;
}
在T3分支的 onTaskAborted ()代码与T1分支一样,只不过把 task1 改为 task3 。
注意:在 onTaskCompleted()和onTaskAborted()中的 task1=null; task2=null; task3=null; 使的该 TASK 可以重新被指派并执行。如果没有把他们设置为 null ,在重新执行时,会报错。
T1 分支如下图所示,T2,T3分支和T1一样。
DO WHILE 循环, SWITCH 循环, “继续”判断节点,“同意” 判断节点的条件分别如下:
测试该流程
可以通过 WLI81 带的 WORKLIST 来测试该流程,但 Response XML 为:
在 CONSOLE 上可以看到执行了哪个分支。如下所示
以上例子,我们通过 DO WHILE 和 SWITCH 实现了流程的回退,但每次都是回退到上一个节点。稍微修改就可以实现回退到流程中的任意一个节点。
流程中处理异常的几种方法
在实现的项目中需要进行流程的回退,异常处理的例子很多,大概有以下几种方法:
1.在流程中直接调转
采用上面介绍的结合 DO WHILE 和 SWITCH 实现。
2.补偿流程
有些回退可以通过定义一个补偿流程来实现。如一个转帐流程。如果转帐失败,可以启动一个补偿流程,进行反向操作,对转帐操作失败的帐户。把转出的钱加回去。把转入的钱减掉。当然也可以把整个转帐操作放到一个全局事务中,但如果转帐操作要跨越多个系统,采用补偿流程可能比全局事务更好。
3.拆分子流程
一个业务流程可以拆分成几个不同的原子流程。如转帐主流程可以拆分成两个原子流程,从一个帐户取款,往另一个帐户存款。转帐主流程由这两个原子流程组成。
当取款,存款原子流程在转帐主流程中是同时开始的两个异步流程时:
如果是取款失败。调用一个存款原子流程,如果是存款失败。调用一个取款原子流程。
当取款,存款原子流程是等取款原子流程成功后,再执行存款原子流程的话。那么:
如果是取款失败。流程直接结束就可以,如果是存款失败。调用一个取款原子流程。
4.在 Exception Handle 中处理
当执行到流程的某个节点需要进行回退或其他异常处理时,抛出一个 EXCEPITON ,在流程的 Exception Handle path 中进行回退等处理。也可以才 Exception Handle path 调用补偿流程或原子流程进行回退处理。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者