Activiti动态修改流程

2,280 阅读1分钟

  Activiti支持动态生成和修改流程,即不通过图形化编辑器,而是使用程序来生成流程或者对现有流程进行修改。

  例如我们有如下流程,希望通过动态修改流程的方式,在User Task和End event直接插入一个service task。

  

图片描述


  程序修改流程的副作用在于,新生成的元素由于没有布局信息,在编辑器中是看不到的,效果如下图。

  

图片描述


  当然,也可以在修改流程的时候,进行重新layout,这样会影响原来的布局,效果如下图。

  

图片描述


  具体代码如下

  import java.io.FileInputStream;

  import java.io.InputStream;

  import java.nio.file.Files;

  import java.nio.file.Paths;

  import javax.xml.stream.XMLInputFactory;

  import org.activiti.bpmn.model.Process;

  import org.activiti.bpmn.BpmnAutoLayout;

  import org.activiti.bpmn.converter.BpmnXMLConverter;

  import org.activiti.bpmn.model.BpmnModel;

  import org.activiti.bpmn.model.SequenceFlow;

  import org.activiti.bpmn.model.ServiceTask;

  import org.activiti.bpmn.model.UserTask;

  public class Test {

  public static void main(String[] args) throws Exception {

  InputStream inputStream = new FileInputStream(

  E:\\workspace\\eclipse\\activiti\\src\\main\\resources\\before.bpmn);

  BpmnXMLConverter converter = new BpmnXMLConverter();

  XMLInputFactory factory = XMLInputFactory.newInstance();

  BpmnModel bpmnModel = converter.convertToBpmnModel(factory.createXMLStreamReader(inputStream));

  Process process = bpmnModel.getMainProcess();

  ServiceTask hookTask = new ServiceTask();

  hookTask.setName(拦截);

  hookTask.setId(hook);

  process.addFlowElement(hookTask);

  process.findFlowElementsOfType(UserTask.class).forEach(task - {

  task.getOutgoingFlows().forEach(flow - {

  SequenceFlow toHook = new SequenceFlow();

  toHook.setSourceRef(task.getId());

  toHook.setTargetRef(hook);

  process.addFlowElement(toHook);

  SequenceFlow fromHook = new SequenceFlow();

  fromHook.setSourceRef(hook);

  fromHook.setTargetRef(flow.getTargetRef());

  process.addFlowElement(fromHook);

  process.removeFlowElement(flow.getId());

  });

  });

  // 这行代码是重新布局

  new BpmnAutoLayout(bpmnModel).execute();

  Files.write(Paths.get(E:\\workspace\\eclipse\\activiti\\src\\main\\resources\\after.bpmn),

  converter.convertToXML(bpmnModel));

  }

  }