.     WfExecutionObject

WfExecutionObject 是一个抽象类 , 它定义了一些的共有的属性和方法 ; 该类的两个主要派生类为 WfProcess WfActivity; 它的执行步骤在介绍 WfProcess WfActivity 时我在对其进行详细说明 , 这里主要介绍一下它的主要属性和方法 ( 参考 ofbiz 实现 ):

(1)     key() 方法

该方法返回当前可执行对象的唯一标识 , 这里主要是 WfProcess WfActivity id;

public String key() throws WfException {

        if (activityId != null)

            return activityId;

        else

            return processId;

}

(2)     processContext()

该方法用于获取当前执行流程的相关数据 ; 在可执行流程刚刚创建时 , 会把它所需的上下文信息 ( 主要是名值对 ) xml 的格式保存到数据库中 (RuntimeData); 这样在运行时可以随时从 RuntimeData 取出上下文信息 ;

  运行时的对象信息是保存在 WorkEffort , 通过 WorkEffort 可以找到具体的 RuntimeData 数据 ;

(3)     state 属性

执行对象状态 ( WfProcess 的流程状态没有关系 ) 的演变是它的核心部分 ; 各个状态之间可以用一个层次结构来表示 ;

                               状态组成图

      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

  从上面这张图可以很方便的推出各种实现 , 比如当 open 状态时候 , 我们可以知道目前只可有两种状态需要我们继续关注 not_running running, 实现代码如下

    public List whileOpenType() throws WfException {

        String[] list = {"running", "not_running"};

 

        return Arrays.asList(list);

}

另外一个重点就是状态的演变 , 很显然状态的演变有一定的约束 ; 比如它只能从 open->closed, 而不能反过来 ; 另外 open 状态下的子状态又可以互相进行演变 ; 状态迁移图如下

                        状态迁移图

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

从上图我们可以根据当前执行对象的状态推出可以演变的子状态集合 ; 比如如当前状态为 open.running, 那么它可以迁移的子状态有 open.not_running.suspended 以及 closed 下的三个子状态 closed.completed,closed.terminated,closed.aborted, 而不能迁移到 open.not_running.not_started 状态 ;

需要说明的一点是 , 按照 WF 规范迁移到 closed 状态 , 是指可以演变到 closed 下面三个子状态的任何其中一个去 , 但不同的实现却可以根据具体情况来进行设定 ; 比如 ofbiz 的实现中 ,not_started suspended 状态只能迁移到 closed 下的 aborted, 而不能迁移到 completed teminated 状态下 ;

根据当前状态获取可以下一步的子状态集合功能就是 validStates() 方法的实现了 ;

(4)validStates()

根据当前状态获取可以下一步的子状态集合 , 从上面的迁移图我们可以很容易实现该方法 ; 如下为 ofbiz 的参考实现

public List validStates() throws WfException {

        String statesArr[] = {"open.running", "open.not_running.not_started", "open.not_running.suspended",

                "closed.completed", "closed.terminated", "closed.aborted"};

        ArrayList possibleStates = new ArrayList(Arrays.asList(statesArr));

        String currentState = state();

 

        if (currentState.startsWith("closed"))

            return new ArrayList();

        if (!currentState.startsWith("open"))

            throw new WfException("Currently in an unknown state.");

        if (currentState.equals("open.running")) {

            possibleStates.remove("open.running");

            possibleStates.remove("open.not_running.not_started");

            return possibleStates;

        }

        if (currentState.equals("open.not_running.not_started")) {

            possibleStates.remove("open.not_running.not_started");

            possibleStates.remove("open.not_running.suspended");

            possibleStates.remove("closed.completed");

            possibleStates.remove("closed.terminated");           

            return possibleStates;

        }

        if (currentState.equals("open.not_running.suspended")) {

            possibleStates.remove("open.not_running.suspended");

            possibleStates.remove("open.not_running.not_started");

            possibleStates.remove("closed.complete");

            possibleStates.remove("closed.terminated");           

            return possibleStates;

        }

        return new ArrayList();

}

(5)changeState(String state)

该方法的功能比较简单 , 就是根据指定的状态进行状态的迁移 ; 需要注意的是在状态转变前必须调用上面的 validStates(), 判断该迁移是否在允许的设定内 ;