use of io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder in project zeebe by camunda.
the class SubProcessBlockBuilder method buildFlowNodes.
@Override
public AbstractFlowNodeBuilder<?, ?> buildFlowNodes(final AbstractFlowNodeBuilder<?, ?> nodeBuilder) {
final SubProcessBuilder subProcessBuilderStart = nodeBuilder.subProcess(subProcessId);
AbstractFlowNodeBuilder<?, ?> workInProgress = subProcessBuilderStart.embeddedSubProcess().startEvent(subProcessStartEventId);
if (embeddedSubProcessBuilder != null) {
workInProgress = embeddedSubProcessBuilder.buildFlowNodes(workInProgress);
}
final var subProcessBuilderDone = workInProgress.endEvent(subProcessEndEventId).subProcessDone();
AbstractFlowNodeBuilder result = subProcessBuilderDone;
if (hasBoundaryEvents) {
final BoundaryEventBuilder boundaryEventBuilder = new BoundaryEventBuilder(subProcessId, subProcessBuilderDone);
if (hasBoundaryTimerEvent) {
result = boundaryEventBuilder.connectBoundaryTimerEvent(subProcessBoundaryTimerEventId);
}
}
return result;
}
use of io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder in project zeebe by zeebe-io.
the class SubProcessBlockBuilder method buildFlowNodes.
@Override
public AbstractFlowNodeBuilder<?, ?> buildFlowNodes(final AbstractFlowNodeBuilder<?, ?> nodeBuilder) {
final SubProcessBuilder subProcessBuilderStart = nodeBuilder.subProcess(subProcessId);
AbstractFlowNodeBuilder<?, ?> workInProgress = subProcessBuilderStart.embeddedSubProcess().startEvent(subProcessStartEventId);
if (embeddedSubProcessBuilder != null) {
workInProgress = embeddedSubProcessBuilder.buildFlowNodes(workInProgress);
}
final var subProcessBuilderDone = workInProgress.endEvent(subProcessEndEventId).subProcessDone();
AbstractFlowNodeBuilder result = subProcessBuilderDone;
if (hasBoundaryEvents) {
final BoundaryEventBuilder boundaryEventBuilder = new BoundaryEventBuilder(subProcessId, subProcessBuilderDone);
if (hasBoundaryTimerEvent) {
result = boundaryEventBuilder.connectBoundaryTimerEvent(subProcessBoundaryTimerEventId);
}
}
return result;
}
use of io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder in project zeebe by zeebe-io.
the class InterruptingEventSubprocessTest method shouldNotCloseEventSubscriptionsOfBoundaryEvent.
@Test
public void shouldNotCloseEventSubscriptionsOfBoundaryEvent() {
// given
final Consumer<EventSubProcessBuilder> eventSubprocess = eventSubProcess -> builder.apply(eventSubProcess.startEvent().interrupting(true)).serviceTask("event_sub_task", t -> t.zeebeJobType("event_sub_task"));
final Consumer<SubProcessBuilder> embeddedSubprocess = subProcess -> subProcess.embeddedSubProcess().eventSubProcess("event_sub_proc", eventSubprocess).startEvent().serviceTask("sub_task", t -> t.zeebeJobType(JOB_TYPE)).endEvent();
final BpmnModelInstance process = Bpmn.createExecutableProcess(PROCESS_ID).startEvent().subProcess("sub_proc", embeddedSubprocess).boundaryEvent().message(m -> m.name("boundary").zeebeCorrelationKeyExpression("key")).endEvent().done();
ENGINE.deployment().withXmlResource(process).deploy();
final long processInstanceKey = ENGINE.processInstance().ofBpmnProcessId(PROCESS_ID).withVariable("key", MESSAGE_CORRELATION_KEY).create();
RecordingExporter.jobRecords(JobIntent.CREATED).withProcessInstanceKey(processInstanceKey).withType(JOB_TYPE).await();
RecordingExporter.processMessageSubscriptionRecords(ProcessMessageSubscriptionIntent.CREATED).withProcessInstanceKey(processInstanceKey).withMessageName("boundary").await();
// when
triggerEventSubprocess.accept(processInstanceKey);
// then
final var serviceTaskActivated = RecordingExporter.processInstanceRecords(ProcessInstanceIntent.ELEMENT_ACTIVATED).withProcessInstanceKey(processInstanceKey).withElementType(BpmnElementType.SERVICE_TASK).withElementId("event_sub_task").getFirst();
assertThat(RecordingExporter.records().limit(r -> r.getPosition() >= serviceTaskActivated.getPosition()).processMessageSubscriptionRecords().withProcessInstanceKey(processInstanceKey).withMessageName("boundary")).extracting(Record::getIntent).describedAs("Expected the boundary event subscription to be open").contains(ProcessMessageSubscriptionIntent.CREATED).doesNotContain(ProcessMessageSubscriptionIntent.DELETED);
}
use of io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder in project zeebe by zeebe-io.
the class InterruptingEventSubprocessTest method shouldTriggerInterruptingEventSubprocessAndNonInterruptingBoundaryEvent.
@Test
public void shouldTriggerInterruptingEventSubprocessAndNonInterruptingBoundaryEvent() {
// given
final var boundaryEventMessageName = "boundary-" + helper.getMessageName();
final Consumer<EventSubProcessBuilder> eventSubprocess = eventSubProcess -> builder.apply(eventSubProcess.startEvent().interrupting(true)).serviceTask("event_sub_task", t -> t.zeebeJobType("event_sub_task"));
final Consumer<SubProcessBuilder> embeddedSubprocess = subProcess -> subProcess.embeddedSubProcess().eventSubProcess("event_sub_proc", eventSubprocess).startEvent().serviceTask("sub_task", t -> t.zeebeJobType(JOB_TYPE)).endEvent();
final BpmnModelInstance process = Bpmn.createExecutableProcess(PROCESS_ID).startEvent().subProcess("sub_proc", embeddedSubprocess).boundaryEvent().cancelActivity(false).message(m -> m.name(boundaryEventMessageName).zeebeCorrelationKeyExpression("key")).endEvent().done();
ENGINE.deployment().withXmlResource(process).deploy();
final long processInstanceKey = ENGINE.processInstance().ofBpmnProcessId(PROCESS_ID).withVariable("key", MESSAGE_CORRELATION_KEY).create();
RecordingExporter.jobRecords(JobIntent.CREATED).withProcessInstanceKey(processInstanceKey).withType(JOB_TYPE).await();
RecordingExporter.processMessageSubscriptionRecords(ProcessMessageSubscriptionIntent.CREATED).withProcessInstanceKey(processInstanceKey).withMessageName(boundaryEventMessageName).await();
// when
triggerEventSubprocess.accept(processInstanceKey);
RecordingExporter.processInstanceRecords(ProcessInstanceIntent.ELEMENT_ACTIVATED).withProcessInstanceKey(processInstanceKey).withElementType(BpmnElementType.SERVICE_TASK).withElementId("event_sub_task").await();
ENGINE.message().withName(boundaryEventMessageName).withCorrelationKey(MESSAGE_CORRELATION_KEY).publish();
RecordingExporter.processInstanceRecords(ProcessInstanceIntent.ELEMENT_COMPLETED).withProcessInstanceKey(processInstanceKey).withElementType(BpmnElementType.BOUNDARY_EVENT).await();
ENGINE.job().ofInstance(processInstanceKey).withType("event_sub_task").complete();
// then
assertThat(RecordingExporter.processInstanceRecords().withProcessInstanceKey(processInstanceKey).limitToProcessInstanceCompleted()).extracting(r -> r.getValue().getBpmnElementType(), Record::getIntent).containsSubsequence(tuple(BpmnElementType.EVENT_SUB_PROCESS, ProcessInstanceIntent.ELEMENT_ACTIVATED), tuple(BpmnElementType.BOUNDARY_EVENT, ProcessInstanceIntent.ELEMENT_ACTIVATED), tuple(BpmnElementType.BOUNDARY_EVENT, ProcessInstanceIntent.ELEMENT_COMPLETED), tuple(BpmnElementType.EVENT_SUB_PROCESS, ProcessInstanceIntent.ELEMENT_COMPLETED), tuple(BpmnElementType.PROCESS, ProcessInstanceIntent.ELEMENT_COMPLETED));
}
use of io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder in project zeebe by zeebe-io.
the class InterruptingEventSubprocessTest method shouldTriggerEmbeddedInterruptingEventSubprocessOnlyOnce.
@Test
public void shouldTriggerEmbeddedInterruptingEventSubprocessOnlyOnce() {
// given
final Consumer<EventSubProcessBuilder> eventSubprocess = eventSubProcess -> builder.apply(eventSubProcess.startEvent().interrupting(true)).serviceTask("event_sub_task", t -> t.zeebeJobType("event_sub_task"));
final Consumer<SubProcessBuilder> embeddedSubprocess = subProcess -> subProcess.embeddedSubProcess().eventSubProcess("event_sub_proc", eventSubprocess).startEvent().parallelGateway("fork").serviceTask("sub_task1", t -> t.zeebeJobType(JOB_TYPE)).endEvent().moveToNode("fork").serviceTask("sub_task2", t -> t.zeebeJobType(JOB_TYPE)).endEvent();
final BpmnModelInstance process = Bpmn.createExecutableProcess(PROCESS_ID).startEvent().subProcess("sub_proc", embeddedSubprocess).endEvent().done();
ENGINE.deployment().withXmlResource(process).deploy();
final long processInstanceKey = ENGINE.processInstance().ofBpmnProcessId(PROCESS_ID).withVariable("key", MESSAGE_CORRELATION_KEY).create();
assertThat(RecordingExporter.jobRecords(JobIntent.CREATED).withProcessInstanceKey(processInstanceKey).withType(JOB_TYPE).limit(2).count()).describedAs("Await until both tasks are activated").isEqualTo(2);
// when
triggerEventSubprocess.accept(processInstanceKey);
ENGINE.job().ofInstance(processInstanceKey).withType("event_sub_task").complete();
// then
assertThat(RecordingExporter.processInstanceRecords().withProcessInstanceKey(processInstanceKey).limitToProcessInstanceCompleted().withElementType(BpmnElementType.EVENT_SUB_PROCESS).withIntent(ProcessInstanceIntent.ELEMENT_ACTIVATED)).describedAs("Expected to activate the event subprocess only once").hasSize(1);
assertThat(RecordingExporter.processInstanceRecords().withProcessInstanceKey(processInstanceKey).limitToProcessInstanceCompleted()).extracting(r -> r.getValue().getBpmnElementType(), Record::getIntent).containsSubsequence(tuple(BpmnElementType.SERVICE_TASK, ProcessInstanceIntent.ELEMENT_ACTIVATED), tuple(BpmnElementType.SERVICE_TASK, ProcessInstanceIntent.ELEMENT_ACTIVATED), tuple(BpmnElementType.SERVICE_TASK, ProcessInstanceIntent.ELEMENT_TERMINATED), tuple(BpmnElementType.SERVICE_TASK, ProcessInstanceIntent.ELEMENT_TERMINATED), tuple(BpmnElementType.EVENT_SUB_PROCESS, ProcessInstanceIntent.ELEMENT_ACTIVATED), tuple(BpmnElementType.EVENT_SUB_PROCESS, ProcessInstanceIntent.ELEMENT_COMPLETED), tuple(BpmnElementType.PROCESS, ProcessInstanceIntent.ELEMENT_COMPLETED));
}
Aggregations