Activiti动态修改流程

  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));

  }

  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值