Activti跳过中间节点的helloworld实例程序

时间:2023-12-15 11:17:56

http://blog.csdn.net/songzheng_741/article/details/17289633

此实例是一个最简单的在运行时人为动态改变流程运转的实例,意在为任意流、驳回等功能抛砖引玉.

定义一个最简单的流程,它只有一个“开始事件”、一个“ServiceTask”、一个“结束事件”.

Activti跳过中间节点的helloworld实例程序

我们现在的要实现的是直接跳过ServiceTask。

ServiceTask的实现类只是简单的在控制台输出一条语句.

[java] view
plain
copyActivti跳过中间节点的helloworld实例程序Activti跳过中间节点的helloworld实例程序
  1. public class Log implements JavaDelegate {
  2. public void execute(DelegateExecution execution) throws Exception {
  3. System.err.println("如果我出现了,就说明我没被忽略");
  4. }
  5. }

控制流向的代码如下

[java] view
plain
copyActivti跳过中间节点的helloworld实例程序Activti跳过中间节点的helloworld实例程序
  1. System.out.println("直接跳过ServiceTask的流程开始..................");
  2. RepositoryService repositoryService = activitiRule.getRepositoryService();
  3. ProcessDefinition processDefinition =
  4. repositoryService.createProcessDefinitionQuery().deploymentId("1").singleResult();
  5. ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
  6. .getDeployedProcessDefinition(processDefinition.getId());
  7. List<ActivityImpl> activities = processDefinitionEntity.getActivities();
  8. ActivityImpl start = null;
  9. ActivityImpl task = null;
  10. ActivityImpl end = null;
  11. for (ActivityImpl activity : activities) {
  12. if (activity.getId().equals("startevent1")) {
  13. start = activity;
  14. }
  15. if (activity.getId().equals("usertask1")) {
  16. task = activity;
  17. }
  18. if (activity.getId().equals("endevent1")) {
  19. end = activity;
  20. }
  21. }
  22. //清除原先的路径
  23. List<PvmTransition> cacheTran = start.getOutgoingTransitions();
  24. start.getOutgoingTransitions().clear();
  25. //创建新路径
  26. TransitionImpl tran = start.createOutgoingTransition();
  27. tran.setDestination(end);
  28. RuntimeService runtimeService = activitiRule.getRuntimeService();
  29. runtimeService.startProcessInstanceById(processDefinitionEntity.getProcessDefinition().getId());
  30. //恢复原来路径
  31. start.getOutgoingTransitions().clear();
  32. for (PvmTransition transition : cacheTran) {
  33. start.createOutgoingTransition().setDestination((ActivityImpl) transition.getDestination());
  34. }

这样ServiceTask将被跳过不会自动执行

当注释掉

start.getOutgoingTransitions().clear();

serviceTask将被执行.

Activti跳过中间节点的helloworld实例程序

这种方法只会影响一个流程实例的流程定义的内存镜像,其他流程不会受到影响.