跳到导航
dev2dev.bea.com.cn
首页 资源中心 dev2dev学堂 在线技术论坛 专家Blog User Group CodeShare
dev2dev 首页 > 资源中心 > 技术文章
在WLI81中实现流程回退

时间:2007-03-19
作者:徐春金
浏览次数:
本文关键字:javasoa集成流程WebLogic Integration异常处理
文章工具
推荐给朋友 推荐给朋友
打印文章 打印文章

概述

  在 WLI81 中无法象 WLI70 中那样,在一个流程中后面的节点可以直接跳转到前面的流程。就好比在程序设计中, WLI70 中有 GOTO 语句,可以随意进行跳转,但整个程序结构不太好。而 WLI81 中,好像没有 GOTO 语句。虽然结构比较好,但有时候也确实不方便。但就象程序设计中可以用 WHILE , SWITCH 等语句代替 GOTO 语句。在 WLI81 中也可以通过 WHILE , SWITCH 等来实现流程的跳转。下面我们通过一个例子来说明。

例子流程说明

  某单位有一个采购流程如下图所示,该流程说明如下:

  先由采购人员填写申请材料,提交科长审批

  如果科长审批通过,再由处长审批,

  如果科长审批不通过,重新填写申请材料。

  如果处长审批通过,再由局长审批,

  如果处长审批不通过,再由科长重新审批。

  如果局长审批通过,则流程结束

  如果局长审批不通过,再由处长审批。

  所以该流程在执行过程中,需要从后面的节点跳到前面的节点,并重新执行。在 WLI81 中可以通过 SWITCH 结合 DO WHILE 来实现这样的流程。

在WLI81中实现流程回退图-1

在WLI81中实现该流程

  在 WLI81 中,整个流程如下图所示:在 SWITCH 中有T1,T2,T3三个分支,分别代表科长,处长,局长审批 3 个任务。在 SWITCH 执行完毕后,进入下面的“审批是否都已结束”子流程。在该子流程中根据审批是通过还是不通过,决定下一步要执行的子流程(是T1,T2,T3,还是结束)。 在 SWITCH 外面有个 DO WHILE 条件。只有局长审批通过,该 DO WHILE 的条件才会为假,从而结束整个流程。

在WLI81中实现流程回退图-2

  在上面流程中 “初始化任务”节点的代码如下:为简单起见,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/>")) 
    { 
     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一样。

在WLI81中实现流程回退图-3

DO WHILE 循环, SWITCH 循环, “继续”判断节点,“同意” 判断节点的条件分别如下:

在WLI81中实现流程回退图-4

测试该流程

  可以通过 WLI81 带的 WORKLIST 来测试该流程,但 Response XML 为: <approved/> 表示审批通过,其他的表示审批没通过。

在WLI81中实现流程回退图-5

  在 CONSOLE 上可以看到执行了哪个分支。如下所示

在WLI81中实现流程回退图-6

  以上例子,我们通过 DO WHILE 和 SWITCH 实现了流程的回退,但每次都是回退到上一个节点。稍微修改就可以实现回退到流程中的任意一个节点。

流程中处理异常的几种方法

  在实现的项目中需要进行流程的回退,异常处理的例子很多,大概有以下几种方法:

1.在流程中直接调转

  采用上面介绍的结合 DO WHILE 和 SWITCH 实现。

2.补偿流程

  有些回退可以通过定义一个补偿流程来实现。如一个转帐流程。如果转帐失败,可以启动一个补偿流程,进行反向操作,对转帐操作失败的帐户。把转出的钱加回去。把转入的钱减掉。当然也可以把整个转帐操作放到一个全局事务中,但如果转帐操作要跨越多个系统,采用补偿流程可能比全局事务更好。

3.拆分子流程

  一个业务流程可以拆分成几个不同的原子流程。如转帐主流程可以拆分成两个原子流程,从一个帐户取款,往另一个帐户存款。转帐主流程由这两个原子流程组成。

  当取款,存款原子流程在转帐主流程中是同时开始的两个异步流程时:

  如果是取款失败。调用一个存款原子流程,如果是存款失败。调用一个取款原子流程。

  当取款,存款原子流程是等取款原子流程成功后,再执行存款原子流程的话。那么:

  如果是取款失败。流程直接结束就可以,如果是存款失败。调用一个取款原子流程。

在WLI81中实现流程回退图-7

4.在 Exception Handle 中处理

  当执行到流程的某个节点需要进行回退或其他异常处理时,抛出一个 EXCEPITON ,在流程的 Exception Handle path 中进行回退等处理。也可以才 Exception Handle path 调用补偿流程或原子流程进行回退处理。

 作者简介
dev2dev ID: xcjing,BEA 资深技术顾问,加入BEA中国多年,在门户技术、RFID解决方案上有着丰富的经验。
dot dot dot

dot
  作者其它文章
您对本文的评价
您对这篇文章的看法如何?
太棒了!5分 不错啊 4分 一般般 3分 有待提高 2分 不好 1分

   
相关技术