.
???
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(),
判断该迁移是否在允许的设定内
;