|
至此,图6中所实现的流程实现还需要一点修改就能满足我们的基本实现。首先,timing out节点可以决定继续等待,或则采取一个纠正动作,不过这两种情况的最终结果都是控制权转移到Starting pipeline节点上;另外,这个timing out节点还必须要知晓脚本是否正在运行(继续等待动作)还是不在运行(启动脚本)。该逻辑的最简单实现方式是引入流程变量(见列表3):
String state = (String)executionContext.getVariable(processName);
if(state != null){
if("completed".equals(state)){
executionContext.leaveNode(completeTransition);
return;
}
else{
executionContext.leaveNode(waitTransition);
return;
}
}
executionContext.setVariable(processName, "started");
…………
列表3 执行路径选择
其次,在本例中,通过流程实例/令牌的的“盲”信令(signaling)来完成执行的做法是不成立的。原因有以下两个方面:
因为本例中的Running Pipeline状态有多个迁移(transition),REST API应该具备选择特定的迁移(transition)作为流程或令牌的信令结果的能力。
当回调处理器被调用时,图6中的例子无法保证流程正处于Running Pipeline状态。譬如,它可能正处于Timing out节点。这就意味着REST API应该具备只针对特定流程状态发出信令的能力。
我们可以对列表1中的REST API做些修改让它支持流程实例或令牌信令的上面所描述的两个参数(见列表4)
@POST
@Path("instance/{id}/signal")
public Response signalProcess(
@PathParam("id") String id,
@QueryParam("transition") String transition.
@QueryParam("state") String state
)
……………………
@POST
@Path("token/{id}/signal")
public Response signalToken(
@PathParam("id")String id,
@QueryParam("transition") String transition,
@QueryParam("state") String state
)
……………………
列表4 扩展的REST API
由于可以使用jBPM的API获得特定流程实例的当前节点,并根据要求触发相应的迁移,因此扩展实现是相当直截了当的。 |
|