是.jpdl.xml的根元素,可以指定的属性有:
属性名 |
作用说明 |
name |
流程定义的名称,用于显示。 |
key |
流程定义的key,用于查询。 如未指定,则默认为name的值。 |
version |
版本,如果指定,则不能与已有的流程定义的版本重复;如未指定,则此key的流程定义的第1个为版本1,以后的是版本递增(每次加1) |
|
|
1, 一个活动中可以指定0个或多个Transition。
a) Start活动中只能有一个Transition。
b) End活动中没有Transition。
c) 其他活动中有1条或多条Transition
2, 如果只有一个,则可以不指定名称(名称是null);如果有多个,则要分别指定唯一的名称。
publicclass ProcessTest {
privatestatic ProcessEngine processEngine = Configuration.getProcessEngine();
@Test
publicvoid testProcess() throws Exception {
// 部署流程定义
InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml");//当前的class路径下
String deploymentId = processEngine.getRepositoryService()//
.createDeployment()//
.addResourceFromInputStream("test.jpdl.xml", in)//
.deploy();
System.out.println("部署流程定义完毕:deploymentId = " + deploymentId);
// 启动流程实例
ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");
System.out.println("流程实例启动完毕:processInstanceId = " + pi.getId());
Task task = processEngine.getTaskService()//
.createTaskQuery()// 获取本流程实例中当前情况下仅有的一个任务
.processInstanceId(pi.getId())//
.uniqueResult();
String transitionName1 = "to 部门经理审批";
String transitionName2 = "to 总经理审批";
// 完成第一步“提交申请”的任务,要使用指定的Transition离开当前活动
processEngine.getTaskService().completeTask(task.getId(),transitionName2); // 使用指定名称的Transition离开本活动
}
}
// 向后执行一步
@Test
publicvoid testSignalExecution() throws Exception {
String executionId = "test.130001";
processEngine.getExecutionService().signalExecutionById(executionId,trsitionName);
//如果有多个Transition,可以指定路径执行
}
代表流程的开始边界,一个流程有且只能有一个Start活动。开始活动只能指定一个Transition。在流程实例启动后,会自动的使用这个唯一的Transition离开开始活动,到一下个活动。
不能有Transition指向开始活动。
代表流程的结束边界,可以有多个,也可以没有。如果有多个,则到达任一个结束活动,整个流程就都结束了;如果没有,则到达最后那个没有Transition的活动,流程就结束了。
功能:等待。
分配任务:
1, actor=#{String型的变量}
任务的执行者动态指定,从流程变量中获取
public class ProcessTest {
privatestatic ProcessEngine processEngine = Configuration.getProcessEngine();
@Test
publicvoid testProcess() throws Exception {
//部署流程定义
InputStreamin = this.getClass().getResourceAsStream("test.jpdl.xml");
StringdeploymentId = processEngine.getRepositoryService()//
.createDeployment()//
.addResourceFromInputStream("test.jpdl.xml",in)//
.deploy();
System.out.println("部署流程定义完毕:deploymentId = " +deploymentId);
//启动流程实例
Map<String,Object> variables = new HashMap<String, Object>();
variables.put("manager","王经理");//程序中动态地来指定办理人
ProcessInstancepi = processEngine.getExecutionService().startProcessInstanceByKey("test",variables);
System.out.println("流程实例启动完毕:processInstanceId = "+ pi.getId());
}
}
2, AssignmentHandler,需要在<task>元素中写<assignment-handlerclass="AssignmentHandlerImpl"/>子元素。
a) 指定的类要实现AssignmentHandler接口
b) 在其中可以使用Assignable.setAssignee(String),分配个人任务。
<task name="审批2"g="80,113,92,52">
<assignment-handlerclass="cn.itcast.h_task.AssignmentHandlerImpl"></assignment-handler>
<transitionname="to 审批"to="审批"g="-47,-17" />
</task>
publicclass AssignmentHandlerImpl implements AssignmentHandler {
// 计算此任务的办理人,并分配任务
@Override
publicvoid assign(Assignable assignable, OpenExecution execution) throws Exception {
System.out.println("--->AssignmentHandlerImpl.assign()");
// 计算办理人
String userId = "李经理--";
// 分配个人任务
assignable.setAssignee(userId); // 指定个人任务的办理人
// // 分配组任务
//assignable.addCandidateUser("小A"); // 添加一个候选人(组任务)
//assignable.addCandidateUser("小B"); // 添加一个候选人(组任务)
//assignable.addCandidateUser("小C"); // 添加一个候选人(组任务)
}
}
1,使用expression,如:expr="#{'to state2'}"
2,使用Handler,要实现DecisionHandler接口
3,如果同时配置了expression与Handler,则expression有效,忽略Handler。
publicclass DecisionHandlerImpl implements DecisionHandler {
// 计算并返回所要使用的Transition的名称
//从OpenExecution获取到执行的上下文供你调用,最后返回transition的名字
@Override
public String decide(OpenExecution execution) {
System.out.println("--->DecisionHandlerImpl.decide()");
String user = (String) execution.getVariable("申请人");
if ("员工".equals(user)) {
return"to 部门经理审批";
} else {
return"to 总经理审批";
}
}
}
publicclass ProcessTest {
privatestatic ProcessEngine processEngine = Configuration.getProcessEngine();
@Test
publicvoid testProcess() throws Exception {
// 部署流程定义
InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml");
String deploymentId = processEngine.getRepositoryService()//
.createDeployment()//
.addResourceFromInputStream("test.jpdl.xml", in)//
.deploy();
System.out.println("部署流程定义完毕:deploymentId = " + deploymentId);
// 启动流程实例
ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");
System.out.println("流程实例启动完毕:processInstanceId = " + pi.getId());
// 完成第一步“提交申请”的任务,要使用指定的Transition离开当前活动
Task task = processEngine.getTaskService()//
.createTaskQuery()// 获取本流程实例中当前情况下仅有的一个任务
.processInstanceId(pi.getId())//
.uniqueResult();
Map<String, Object> variables = new HashMap<String,Object>();
variables.put("申请人", "员工");
// variables.put("申请人", "部门经理");
//如果transition有名字,那么就必须指定名字
processEngine.getTaskService().completeTask(task.getId(), variables);
}
}
这是多个分支并行(同时)执行的,并且所有的分支Execution都到Join活动后才离向后执行。
publicclass ProcessTest {
privatestatic ProcessEngine processEngine = Configuration.getProcessEngine();
@Test
publicvoid testProcess() throws Exception {
// 部署流程定义
InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml");
String deploymentId = processEngine.getRepositoryService()//
.createDeployment()//
.addResourceFromInputStream("test.jpdl.xml", in)//
.deploy();
System.out.println("部署流程定义完毕:deploymentId = " + deploymentId);
// 启动流程实例
ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");
System.out.println("流程实例启动完毕:processInstanceId = " + pi.getId());
System.out.println("正在执行的活动:" + pi.findActiveActivityNames());
}
}
1,在<custom>元素中指定class属性为指定的类。
2,这个类要实现ExternalActivityBehaviour接口,其中有两个方法:
1,execute(ActivityExecution),节点的功能代码
2,signal(ActivityExecution, String,Map),在当前节点等待时,外部发信号时的行为
3,在execute()方法中,可以调用以下方法对流程进行控制
1,ActivityExecution.waitForSignal(),在当前节点等待。
2,ActivityExecution.takeDefaultTransition(),使用默认的Transition离开,当前节点中定义的第一个为默认的。
3,ActivityExecution.take(StringtransitionName),使用指定的Transition离开
4,ActivityExecution.end(),结束流程实例
4,也可以实现ActivityBehaviour接口,只有一个方法execute(ActivityExecution),这样就不能等待,否则signal时会有类转换异常。
1, 在根元素中,或在节点元素中,使用<on event="">元素指定事件,其中event属性代表事件的类型。
2, 在<on>中用子元素<event-listener class="EventListenerImpl" />,指定处理的类,要求指定的类要实现EventListener接口
3, 事件类型:
a) <on>元素放在根元素(<process>)中,可以指定event为start或end,表示流程的开始与结束。
b) <on>元素放在节点元素中,可以指定event为start或end,表示节点的进入与离开
c) 在Start节点中只有end事件,在End节点中只有start事件。
d) 在<transition>元素中直接写<event-listener class="">,就是配置事件。(因为在这里只有一个事件,所以不用写on与类型)
e) 在<task>元素中还可以配置assign事件,是在分配任务时触发的。