jBPM实现中的关系并不总是双向的。如,从一个任务节点我们可以找到所有这 个节点定义的任务,但是从一个任务,并没有API可以完成找到包含它的任务节点 的工作;由某个任务实例,你可以得到一个任务,但是没有由某个任务得到所有 实例的API,诸如此类。
超时不是发生在任务自身,而是发生在任务节点上。由于某个节点可以关联多 个任务,并且jBPM关系实现并不是双向的(见上),因此要跟踪当前任务实例就 需要其他的支持手段。
以重新分配实现的上报的整个实现涉及3个处理器:
负责给任务分配参与者的分配处理器。这个处理器跟踪它是一个首次任务调用 还是一个上报任务调用。清单14给出了一个分配处理器的例子。
package com.sample.action;
import org.jbpm.graph.def.Node;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.taskmgmt.def.AssignmentHandler;
import org.jbpm.taskmgmt.exe.Assignable;
public class EscalationAssignmentHandler implements AssignmentHandler {
private static final long serialVersionUID = 1L;
@Override
public void assign(Assignable assignable, ExecutionContext context)
throws Exception {
Node task = context.getToken().getNode();
if(task != null){
String tName = task.getName();
String vName = tName + "escLevel";
Long escLevel = (Long)context.getVariable(vName);
if(escLevel == null){
// First time through
assignable.setActorId("admin");
}
else{
// Escalate
assignable.setActorId("bob");
}
}
}
}
使用jBpm支持高级用户交互模式(8)
时间:2011-07-08 infoq 译:胡键
清单14 分配处理器示例
这里我们尝试得到一个包含了给定任务上报次数的流程变量。如果变量未定义 ,则就分配“admin”为任务拥有者,否则任务就被分配给“bob”。在这个处理 器中可以使用任何其他的分配策略。
任务实例创建动作处理器(清单15),它保存流程实例上下文的任务实例 id
package com.sample.action;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.def.Node;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.taskmgmt.exe.TaskInstance;
public class TaskCreationActionHandler implements ActionHandler {
private static final long serialVersionUID = 1L;
@Override
public void execute(ExecutionContext context) throws Exception {
Node task = context.getToken().getNode();
TaskInstance current = context.getTaskInstance();
if((task == null) || (current == null))
return;
String tName = task.getName();
String iName = tName + "instance";
context.setVariable(iName, new Long(current.getId()));
}
}
清单15 任务实例创建处理器
任务节点计时器触发调用的超时处理器(清单16)。
package com.sample.action;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.def.GraphElement;
import org.jbpm.graph.exe.ExecutionContext;
import org.jbpm.taskmgmt.exe.TaskInstance;
public class EscalationActionHandler implements ActionHandler {
private static final long serialVersionUID = 1L;
private String escalation;
@Override
|