TranstionInstance.java
/* 触发弧线
* @see org.fireflow.kernel.IEdgeInstance#take(org.fireflow.kernel.IToken)
*/
public boolean take(IToken token) throws KernelException {
//触发弧线taking事件
EdgeInstanceEvent e = new EdgeInstanceEvent(this);
e.setToken(token);
e.setEventType(EdgeInstanceEvent.ON_TAKING_THE_TOKEN);
for (int i = 0; this.eventListeners != null && i < this.eventListeners.size(); i++) {
IEdgeInstanceEventListener listener = this.eventListeners.get(i);
//调用TransitionInstanceExtension监听器来计算弧线上的条件表达式,在后面有说明
listener.onEdgeInstanceEventFired(e);
}
//获取到流向哪个节点
INodeInstance nodeInst = this.getLeavingNodeInstance();
//设置弧线上的权值,对于同步器到环节,权值没有什么作用,而对于activity到同步器,权值作用于同步器的汇聚算法
token.setValue(this.getWeight());
boolean alive = token.isAlive();
//下一个节点触发,
//如果是同步器到activity
//详看是开源工作流Fireflow源码分析之ActivityInstance fired
//如果是activity到同步器
//详看是开源工作流Fireflow源码分析之SynchronizerInstance fired
nodeInst.fire(token);
return alive;
}
/* 获取转移线上的权值
* @see org.fireflow.kernel.IEdgeInstance#getWeight()
*/
public int getWeight() {
if (weight == 0) {
if (enteringNodeInstance instanceof StartNodeInstance) {
weight=1;
return weight;
//如果前驱结点是开始节点,那么权值规定为1
} else if (leavingNodeInstance instanceof EndNodeInstance) {
weight=1;
return weight;
//如果后继结点为结束节点,那么权值规定为1
} else if (leavingNodeInstance instanceof ActivityInstance) {
SynchronizerInstance synchronizerInstance = (SynchronizerInstance) enteringNodeInstance;
int weight = synchronizerInstance.getVolume() / enteringNodeInstance.getLeavingTransitionInstances().size();
return weight;//s->t (s)
//如果弧线的后继结点 是 activity结点,那么弧线的权值=前驱同步器结点的容量/输出弧线的数量
} else if (leavingNodeInstance instanceof SynchronizerInstance) {
SynchronizerInstance synchronizerInstance = (SynchronizerInstance) leavingNodeInstance;
int weight = synchronizerInstance.getVolume() / leavingNodeInstance.getEnteringTransitionInstances().size();
return weight;
//如果后继结点是同步器节点,那么权值=同步器的容量/同步器的输入弧线的数量 // t-s
}
}
return weight;
}
TransitionInstanceExtension.java
/* TransitionInstance的监听器的监听方法
* @see org.fireflow.kernel.event.IEdgeInstanceEventListener#onEdgeInstanceEventFired(org.fireflow.kernel.event.EdgeInstanceEvent)
*/
public void onEdgeInstanceEventFired(EdgeInstanceEvent e) throws KernelException {
//如果当前事件是taking
if (e.getEventType() == EdgeInstanceEvent.ON_TAKING_THE_TOKEN) {
IToken token = e.getToken();
//取到事件的发生源
ITransitionInstance transInst = (ITransitionInstance) e.getSource();
//取到事件的发生条件
String condition = transInst.getTransition().getCondition();
//计算条件
calculateTheAliveValue(token, condition);
//如果系统设置为允许保存运行轨迹
if (rtCtx.isEnableTrace() && token.isAlive()) {
Transition transition = transInst.getTransition();
IWFElement fromNode = transition.getFromNode();
int minorNumber = 1;
//如果是环节到同步器
if (fromNode instanceof Activity){
minorNumber=2;
}else{
minorNumber =1;
}
//创建一个运行轨迹实例
ProcessInstanceTrace trace = new ProcessInstanceTrace();
//设置流程实例
trace.setProcessInstanceId(e.getToken().getProcessInstanceId());
//设置步骤
trace.setStepNumber(e.getToken().getStepNumber());
//设置事件的发生类型
trace.setType(ProcessInstanceTrace.TRANSITION_TYPE);
//设置from节点
trace.setFromNodeId(transInst.getTransition().getFromNode().getId());
//设置to节点
trace.setToNodeId(transInst.getTransition().getToNode().getId());
//设置转移张的id
trace.setEdgeId(transInst.getTransition().getId());
trace.setMinorNumber(minorNumber);
rtCtx.getPersistenceService().saveOrUpdateProcessInstanceTrace(trace);
}
}
}
/**
* 计算value值
* @param token
* @param condition
* @throws EngineException
*/
public void calculateTheAliveValue(IToken token, String condition)throws EngineException {
if (!token.isAlive()) {
return;//如果token是dead状态,表明synchronizer的joinpoint是dead状态,不需要重新计算。
}
//1、如果没有转移条件,默认为true
if (condition == null || condition.trim().equals("")) {
token.setAlive(true);
return;
}
//2、default类型的不需要计算其alive值,该值由synchronizer决定
if (condition.trim().equals(ConditionConstant.DEFAULT)) {
return;
}
try{
//3、计算EL表达式
//表达式的变量用的是流程变量,表达式是在流程定义的时候就设置好
boolean alive = determineTheAliveOfToken(token.getProcessInstance().getProcessInstanceVariables(), condition);
token.setAlive(alive);
}catch(Exception ex){
throw new EngineException(token.getProcessInstanceId(),token.getProcessInstance().getWorkflowProcess(),token.getNodeId(),ex.getMessage());
}
}
/**
* 执行分支判断策略,即设置token的alive属性 首先,如果this.alive==false,则所有的token的Alive属性皆为false
* 然后,如果在nexttransitionList中有值,则直接执行列表中的tansition
* 否则,通过计算Transition的表达式来确定下一个transition,
* vars:表达式变量
* condition:表达式
* @param transInst
* @return
*/
private boolean determineTheAliveOfToken(Map<String ,Object> vars, String condition) throws Exception{
//注意这里调用spring中定义的的表达式解析器,
IConditionResolver elResolver = this.rtCtx.getConditionResolver();
//通过计算transition上的表达式来确定alive的值
Boolean b = elResolver.resolveBooleanExpression(vars, condition);
return b;
}