一,start
start活动的意义在于指定了一个流程实例应该从哪里开始,即流程定义的入口。
start的子元素:
name:活动的名称,在启动活动没有内部转移时,name名称是可选的。
transition:用来指定流出的转移,指向流程的下一个活动。
二,end
end活动的意义在于结束了一个流程实例,即流程定义的结束点。
一个流程可以有多个end ,这样就很容易显示出流程处理实例的不同结果。如:
特殊的end-cancel和end-error。在一些特定的流程里,需要区分到底是为什么结束的,怎么结束的。如差旅费报销申请流程,可以被批准而正常结束;也可以被领导不批准而被取消。在一般的流程里一般不区分end和end-cancel,但是如果做的在精细点,可以让不同的结果,流向不同的结束。
三,state
state活动作为一个等待状态的活动。流程处理的流向会在外部触发器调用提供的API之前一直等待。
四,实例
1.序列状态节点
流程定义
state.jpdl.xml 如下:
<?xml version="1.0" encoding="UTF-8"?>
<process name="state" xmlns="http://jbpm.org/4.4/jpdl">
<start g="28,95,48,48" name="start1">
<transition g="-10,-10" name="to a" to="a"/>
</start>
<end g="540,94,48,48" name="end1"/>
<state g="123,96,92,52" name="a">
<transition g="-15,-13" name="to b" to="b"/>
</state>
<state g="267,92,92,52" name="b">
<transition g="-13,-19" name="to c" to="c"/>
</state>
<state g="395,90,92,52" name="c">
<transition g="-23,-13" name="to end1" to="end1"/>
</state>
</process>
state节点的测试类:TestState
package com.itstudio.jbpm.p;
import org.jbpm.api.Configuration;
import org.jbpm.api.Execution;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.HistoryService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
public class TestState {
public static final Configuration configuration = new Configuration();
public static final ProcessEngine processEngine=configuration.buildProcessEngine();
public static final RepositoryService repositoryService= processEngine.getRepositoryService();
public static final ExecutionService executionService=processEngine.getExecutionService();
/**
* @param args
*/
//发布流程
public void depoly(){
repositoryService.createDeployment()
.addResourceFromClasspath("com/itstudio/jbpm/p/state.jpdl.xml").deploy();
System.out.println("发布成功!");
}
public void test(){
//启动流程
ProcessInstance processInstance = executionService.startProcessInstanceByKey("state");
System.out.println("流程实例Id:" + processInstance.getId());
System.out.println("流程定义Id:" + processInstance.getProcessDefinitionId());
ProcessInstance processInstanceA = executionService.signalExecutionById(processInstance.getId(),"to a");
System.out.println("是否位于a节点:"+processInstanceA.isActive("a"));
System.out.println("a处流程是否结束---->"+processInstanceA.isEnded());
System.out.println("向下执行...");
ProcessInstance processInstanceB = executionService.signalExecutionById(processInstanceA.getId());
System.out.println("是否位于b节点:"+processInstanceB.isActive("b"));
System.out.println("b处流程是否结束---->"+processInstanceB.isEnded());
System.out.println("向下执行...");
ProcessInstance processInstanceC = executionService.signalExecutionById(processInstanceB.getId());
System.out.println("是否位于c节点:"+processInstanceC.isActive("c"));
System.out.println("c处流程是否结束---->"+processInstanceC.isEnded());
System.out.println("向下执行...");
ProcessInstance endInstance = executionService.signalExecutionById(processInstanceC.getId());
System.out.println("当前流程是否结束---->"+endInstance.isEnded());
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestState t = new TestState();
t.depoly();
t.test();
}
}
运行结果:
2.可选择状态节点
流程定义:
teststate.jpdl.xml 如下:
<?xml version="1.0" encoding="UTF-8"?>
<process name="teststate" xmlns="http://jbpm.org/4.4/jpdl">
<start name="start1" g="23,164,48,48">
<transition name="to A" to="A" g="-18,-18"/>
</start>
<state name="A" g="125,163,92,52">
<transition name="to B" to="B" g="-6,-23"/>
<transition name="to C" to="C" g="-5,-13"/>
</state>
<state name="B" g="276,106,92,52">
<transition name="to end1" to="end1" g="-29,-14"/>
</state>
<state name="C" g="282,207,92,52">
<transition name="to end1" to="end1" g="-27,-10"/>
</state>
<end name="end1" g="471,166,48,48"/>
</process>
测试类:TestStateDemo
package com.itstudio.jbpm.p;
import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
public class TestStateDemo {
public static final Configuration configuration = new Configuration();
public static final ProcessEngine processEngine=configuration.buildProcessEngine();
public static final RepositoryService repositoryService= processEngine.getRepositoryService();
public static final ExecutionService executionService=processEngine.getExecutionService();
/**
* @param args
*/
public void deploy(){//发布流程
repositoryService.createDeployment()
.addResourceFromClasspath("com/itstudio/jbpm/p/teststate.jpdl.xml").deploy();
System.out.println("发布成功!");
}
public void test(){
ProcessInstance processInstance = executionService.startProcessInstanceByKey("teststate");
System.out.println("流程实例Id:" + processInstance.getId());
System.out.println("流程定义Id:" + processInstance.getProcessDefinitionId());
ProcessInstance instanceA = executionService.signalExecutionById(processInstance.getId());
System.out.println("是否位于A节点---->"+instanceA.isActive("A"));
System.out.println("A处流程是否结束---->"+instanceA.isEnded());
System.out.println("向下执行...");
ProcessInstance instanceB = executionService.signalExecutionById(instanceA.getId(),"to B");
System.out.println("是否位于B节点---->"+instanceB.isActive("B"));
System.out.println("B处流程是否结束---->"+instanceB.isEnded());
System.out.println("向下执行...");
ProcessInstance endInstance = executionService.signalExecutionById(instanceB.getId());
System.out.println("流程是否结束----->"+endInstance.isEnded());
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestStateDemo demo = new TestStateDemo();
demo.deploy();
demo.test();
}
}
运行结果:
By Mr.Z