技術分享: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));
}
}
※如何寫出 沒有 BUG 的代碼
※Kotlin技術分享:中綴調用、解構聲明
TAG:千鋒JAVA開發學院 |