又有客户提出自由流需求,真晕,自由流不就等于没流程吗?还是劝他定个流程吧,上系统了不就是规范公司的流程吗?呵呵
虽然客户赞同我们的说法,不过私下来还是讨论尝试了对自由流的控制.最早的一个想法是建立几个孤立的没有联系的节点.让客户选择下一步要去的节点,(相当于选择转向).程序根据选择,创建这个节点上的任务.客户操作完任务,程序在负责关上这个任务.
这样是可以达到效果的.不过就是太不 '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);
-
-
- processInstance.signal();
- assertSame(processDefinition.getNode("a"),
- processInstance.getRootToken().getNode());
-
-
- Transition leavingTransition=new Transition("a to c");
-
- leavingTransition.setTo(processInstance.getProcessDefinition().getNode("c"));
-
- processInstance.getRootToken().getNode().addLeavingTransition(leavingTransition);
-
- processInstance.signal("a to c");
-
- processInstance.getRootToken().getNode().removeLeavingTransition(leavingTransition);
-
-
- assertSame(processDefinition.getNode("c"),
- processInstance.getRootToken().getNode());
-
-
- 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());
-
-
- processInstance.signal();
- assertSame(processDefinition.getNode("c"),
- processInstance.getRootToken().getNode());
-
-
- 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'了吧.