當前位置:
首頁 > 知識 > 技術分享:Activiti動態修改流程

技術分享: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));

}

}

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 千鋒JAVA開發學院 的精彩文章:

如何寫出 沒有 BUG 的代碼
Kotlin技術分享:中綴調用、解構聲明

TAG:千鋒JAVA開發學院 |