又有客户提出自由流需求,真晕,自由流不就等于没流程吗?还是劝他定个流程吧,上系统了不就是规范公司的流程吗?呵呵
虽然客户赞同我们的说法,不过私下来还是讨论尝试了对自由流的控制.最早的一个想法是建立几个孤立的没有联系的节点.让客户选择下一步要去的节点,(相当于选择转向).程序根据选择,创建这个节点上的任务.客户操作完任务,程序在负责关上这个任务.
这样是可以达到效果的.不过就是太不 'jbpm' 了.因为把流程的流转环境被去掉了.所以又想了个'jbpm'点的方法.要想从一个节点到另一个节点.必然要有'转向'连接两个节点.自由流不能在流程没跑起来前知道每个节点的下 一步到哪.只能在运行过程中知道,那我们就当知道的时候在创建两个节点间的转向呗.看看下面的测试代码
package org.jbpm.tutorial.action;
import junit.framework.TestCase;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ProcessInstance;
public class FreeProcessTest extends TestCase {
public void testTransitionAction() {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
"<process-definition>" +
" <start-state>" +
" <transition to='a' />" +
" </start-state>" +
" <state name='a'>" +
" </state>" +
" <state name='b'>" +
" <transition to='c'/>" +
" </state>" +
" <state name='c'>" +
" </state>" +
" <end-state name='end' />" +
"</process-definition>"
);
// 创建流程实例
ProcessInstance processInstance =
new ProcessInstance(processDefinition);
// 流转一步到节点a
processInstance.signal();
assertSame(processDefinition.getNode("a"),
processInstance.getRootToken().getNode());
//假定客户要从a到c,动态创建a到c的转向
Transition leavingTransition=new Transition("a to c");//构建一个a到c的转向
//指定该转向的目的节点是c
leavingTransition.setTo(processInstance.getProcessDefinition().getNode("c"));
//为当前节点添加这个转向.
processInstance.getRootToken().getNode().addLeavingTransition(leavingTransition);
//调用这个转向流转流程
processInstance.signal("a to c");
//删除这个临时创建的转向
processInstance.getRootToken().getNode().removeLeavingTransition(leavingTransition);
//测试是否到达c节点了
assertSame(processDefinition.getNode("c"),
processInstance.getRootToken().getNode());
// 假定客户要从c到b,动态创建c到b的转向
leavingTransition=new Transition("c to b");
leavingTransition.setTo(processInstance.getProcessDefinition().getNode("b"));
processInstance.getRootToken().getNode().addLeavingTransition(leavingTransition);
processInstance.signal("c to b");
processInstance.getRootToken().getNode().removeLeavingTransition(leavingTransition);
assertSame(processDefinition.getNode("b"),
processInstance.getRootToken().getNode());
// 假定客户要从b到c,不用动态创建,已经定义了
processInstance.signal();
assertSame(processDefinition.getNode("c"),
processInstance.getRootToken().getNode());
// 假定客户要从c到end,动态创建c到end的转向
leavingTransition=new Transition("c to end");
leavingTransition.setTo(processInstance.getProcessDefinition().getNode("end"));
processInstance.getRootToken().getNode().addLeavingTransition(leavingTransition);
processInstance.signal("c to end");
processInstance.getRootToken().getNode().removeLeavingTransition(leavingTransition);
assertSame(processDefinition.getNode("end"),
processInstance.getRootToken().getNode());
}
}
测试通过!这个够'jbpm'了吧.