Создание модели
|
Этот раздел перенесён из документации Camunda 7 и в дальнейшем будет доработан с учётом особенностей OpenBPM Engine |
Чтобы создать новую BPMN модель с нуля, вам необходимо создать пустой экземпляр BPMN модели, используя следующий метод:
BpmnModelInstance modelInstance = Bpmn.createEmptyModel();
Следующим шагом будет создание элемента определений BPMN. Установите целевое пространство имен на него и добавьте его к только что созданному экземпляру модели.
Definitions definitions = modelInstance.newInstance(Definitions.class);
definitions.setTargetNamespace("http://camunda.org/examples");
modelInstance.setDefinitions(definitions);
Обычно бывает желательно добавить процесс к модели. Для этого необходимо пройти те же три шага, что и при создании элемента определений BPMN:
-
Создать новый экземпляр элемента BPMN
-
Установить атрибуты и дочерние элементы на экземпляре элемента
-
Добавить только что созданный экземпляр элемента к соответствующему родительскому элементу
Process process = modelInstance.newInstance(Process.class);
process.setId("process");
definitions.addChildElement(process);
Чтобы упростить эту повторяющуюся процедуру, вы можете использовать вспомогательный метод, например, вот такой:
protected <T extends BpmnModelElementInstance> T createElement(BpmnModelElementInstance parentElement, String id, Class<T> elementClass) {
T element = parentElement.getModelInstance().newInstance(elementClass);
element.setAttributeValue("id", id, true);
parentElement.addChildElement(element);
return element;
}
После того как вы создали элементы вашего процесса, такие как стартовое событие, задачи, шлюзы и событие окончания, вам необходимо соединить элементы с потоками последовательностей. Опять-таки, здесь присутствуют те же три шага создания элемента, и данную процедуру можно упростить через следующий вспомогательный метод.
public SequenceFlow createSequenceFlow(Process process, FlowNode from, FlowNode to) {
String identifier = from.getId() + "-" + to.getId();
SequenceFlow sequenceFlow = createElement(process, identifier, SequenceFlow.class);
process.addChildElement(sequenceFlow);
sequenceFlow.setSource(from);
from.getOutgoing().add(sequenceFlow);
sequenceFlow.setTarget(to);
to.getIncoming().add(sequenceFlow);
return sequenceFlow;
}
Валидируйте модель согласно спецификации BPMN 2.0 и сконвертируйте ее в XML строку или сохраните ее в файл или в стрим.
// validate the model
Bpmn.validateModel(modelInstance);
// convert to string
String xmlString = Bpmn.convertToString(modelInstance);
// write to output stream
OutputStream outputStream = new OutputStream(...);
Bpmn.writeModelToStream(outputStream, modelInstance);
// write to file
File file = new File(...);
Bpmn.writeModelToFile(file, modelInstance);
Пример 1: создание простого процесса с одной пользовательской задачей
Используя вышеприведенные вспомогательные методы, можно очень легко создавать простые процессы. Прежде всего, создайте процесс со стартовым событием, пользовательской задачей и конечным событием.

Следующий код создает такой процесс, используя вспомогательные методы, приведенные выше (без DI элементов).
// create an empty model
BpmnModelInstance modelInstance = Bpmn.createEmptyModel();
Definitions definitions = modelInstance.newInstance(Definitions.class);
definitions.setTargetNamespace("http://camunda.org/examples");
modelInstance.setDefinitions(definitions);
// create the process
Process process = createElement(definitions, "process-with-one-task", Process.class);
// create start event, user task and end event
StartEvent startEvent = createElement(process, "start", StartEvent.class);
UserTask task1 = createElement(process, "task1", UserTask.class);
task1.setName("User Task");
EndEvent endEvent = createElement(process, "end", EndEvent.class);
// create the connections between the elements
createSequenceFlow(process, startEvent, task1);
createSequenceFlow(process, task1, endEvent);
// validate and write model to file
Bpmn.validateModel(modelInstance);
File file = File.createTempFile("bpmn-model-api-", ".bpmn");
Bpmn.writeModelToFile(file, modelInstance);
Пример 2: создание простого процесса с двумя параллельными задачами
Даже более сложные процессы могут создаваться в несколько строчек кода, используя стандартный API модели BPMN.

// create an empty model
BpmnModelInstance modelInstance = Bpmn.createEmptyModel();
Definitions definitions = modelInstance.newInstance(Definitions.class);
definitions.setTargetNamespace("http://camunda.org/examples");
modelInstance.setDefinitions(definitions);
// create elements
StartEvent startEvent = createElement(process, "start", StartEvent.class);
ParallelGateway fork = createElement(process, "fork", ParallelGateway.class);
ServiceTask task1 = createElement(process, "task1", ServiceTask.class);
task1.setName("Service Task");
UserTask task2 = createElement(process, "task2", UserTask.class);
task2.setName("User Task");
ParallelGateway join = createElement(process, "join", ParallelGateway.class);
EndEvent endEvent = createElement(process, "end", EndEvent.class);
// create flows
createSequenceFlow(process, startEvent, fork);
createSequenceFlow(process, fork, task1);
createSequenceFlow(process, fork, task2);
createSequenceFlow(process, task1, join);
createSequenceFlow(process, task2, join);
createSequenceFlow(process, join, endEvent);
// validate and write model to file
Bpmn.validateModel(modelInstance);
File file = File.createTempFile("bpmn-model-api-", ".bpmn");
Bpmn.writeModelToFile(file, modelInstance);
Лицензия и атрибуция
Эта документация была создана на базе материала "Camunda 7 Docs" от Camunda, находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License .
Оригинал документации: https://docs.camunda.org