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