科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道在WLI81中实现流程回退

在WLI81中实现流程回退

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在 WLI81 中无法象 WLI70 中那样,在一个流程中后面的节点可以直接跳转到前面的流程。就好比在程序设计中, WLI70 中有 GOTO 语句,可以随意进行跳转,但整个程序结构不太好。而 WLI81 中,好像没有 GOTO 语句。

来源:dev2dev 2007年10月16日

关键字: BEA 应用 技术 中间件

  • 评论
  • 分享微博
  • 分享邮件

  概述

  在 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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章