Search in sources :

Example 1 with SubProcessBuilder

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;
}
Also used : AbstractFlowNodeBuilder(io.camunda.zeebe.model.bpmn.builder.AbstractFlowNodeBuilder) SubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder)

Example 2 with SubProcessBuilder

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;
}
Also used : AbstractFlowNodeBuilder(io.camunda.zeebe.model.bpmn.builder.AbstractFlowNodeBuilder) SubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder)

Example 3 with SubProcessBuilder

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);
}
Also used : TimerIntent(io.camunda.zeebe.protocol.record.intent.TimerIntent) JobBatchRecordValue(io.camunda.zeebe.protocol.record.value.JobBatchRecordValue) ProcessInstanceIntent(io.camunda.zeebe.protocol.record.intent.ProcessInstanceIntent) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) RunWith(org.junit.runner.RunWith) Bpmn(io.camunda.zeebe.model.bpmn.Bpmn) MessageSubscriptionIntent(io.camunda.zeebe.protocol.record.intent.MessageSubscriptionIntent) Function(java.util.function.Function) Record(io.camunda.zeebe.protocol.record.Record) ProcessMessageSubscriptionIntent(io.camunda.zeebe.protocol.record.intent.ProcessMessageSubscriptionIntent) Duration(java.time.Duration) Map(java.util.Map) EngineRule(io.camunda.zeebe.engine.util.EngineRule) BpmnModelInstance(io.camunda.zeebe.model.bpmn.BpmnModelInstance) VariableDocumentUpdateSemantic(io.camunda.zeebe.protocol.record.value.VariableDocumentUpdateSemantic) ProcessBuilder(io.camunda.zeebe.model.bpmn.builder.ProcessBuilder) ClassRule(org.junit.ClassRule) Parameterized(org.junit.runners.Parameterized) Before(org.junit.Before) EventSubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.EventSubProcessBuilder) ProcessMetadataValue(io.camunda.zeebe.protocol.record.value.deployment.ProcessMetadataValue) Assertions.tuple(org.assertj.core.api.Assertions.tuple) Test(org.junit.Test) BrokerClassRuleHelper(io.camunda.zeebe.test.util.BrokerClassRuleHelper) Assertions(io.camunda.zeebe.protocol.record.Assertions) RecordingExporter(io.camunda.zeebe.test.util.record.RecordingExporter) Consumer(java.util.function.Consumer) List(java.util.List) Rule(org.junit.Rule) ProcessInstanceRecordValue(io.camunda.zeebe.protocol.record.value.ProcessInstanceRecordValue) BpmnElementType(io.camunda.zeebe.protocol.record.value.BpmnElementType) SubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder) StartEventBuilder(io.camunda.zeebe.model.bpmn.builder.StartEventBuilder) JobIntent(io.camunda.zeebe.protocol.record.intent.JobIntent) EventSubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.EventSubProcessBuilder) SubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder) BpmnModelInstance(io.camunda.zeebe.model.bpmn.BpmnModelInstance) EventSubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.EventSubProcessBuilder) Test(org.junit.Test)

Example 4 with SubProcessBuilder

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));
}
Also used : TimerIntent(io.camunda.zeebe.protocol.record.intent.TimerIntent) JobBatchRecordValue(io.camunda.zeebe.protocol.record.value.JobBatchRecordValue) ProcessInstanceIntent(io.camunda.zeebe.protocol.record.intent.ProcessInstanceIntent) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) RunWith(org.junit.runner.RunWith) Bpmn(io.camunda.zeebe.model.bpmn.Bpmn) MessageSubscriptionIntent(io.camunda.zeebe.protocol.record.intent.MessageSubscriptionIntent) Function(java.util.function.Function) Record(io.camunda.zeebe.protocol.record.Record) ProcessMessageSubscriptionIntent(io.camunda.zeebe.protocol.record.intent.ProcessMessageSubscriptionIntent) Duration(java.time.Duration) Map(java.util.Map) EngineRule(io.camunda.zeebe.engine.util.EngineRule) BpmnModelInstance(io.camunda.zeebe.model.bpmn.BpmnModelInstance) VariableDocumentUpdateSemantic(io.camunda.zeebe.protocol.record.value.VariableDocumentUpdateSemantic) ProcessBuilder(io.camunda.zeebe.model.bpmn.builder.ProcessBuilder) ClassRule(org.junit.ClassRule) Parameterized(org.junit.runners.Parameterized) Before(org.junit.Before) EventSubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.EventSubProcessBuilder) ProcessMetadataValue(io.camunda.zeebe.protocol.record.value.deployment.ProcessMetadataValue) Assertions.tuple(org.assertj.core.api.Assertions.tuple) Test(org.junit.Test) BrokerClassRuleHelper(io.camunda.zeebe.test.util.BrokerClassRuleHelper) Assertions(io.camunda.zeebe.protocol.record.Assertions) RecordingExporter(io.camunda.zeebe.test.util.record.RecordingExporter) Consumer(java.util.function.Consumer) List(java.util.List) Rule(org.junit.Rule) ProcessInstanceRecordValue(io.camunda.zeebe.protocol.record.value.ProcessInstanceRecordValue) BpmnElementType(io.camunda.zeebe.protocol.record.value.BpmnElementType) SubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder) StartEventBuilder(io.camunda.zeebe.model.bpmn.builder.StartEventBuilder) JobIntent(io.camunda.zeebe.protocol.record.intent.JobIntent) EventSubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.EventSubProcessBuilder) SubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder) BpmnModelInstance(io.camunda.zeebe.model.bpmn.BpmnModelInstance) EventSubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.EventSubProcessBuilder) Test(org.junit.Test)

Example 5 with SubProcessBuilder

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));
}
Also used : TimerIntent(io.camunda.zeebe.protocol.record.intent.TimerIntent) JobBatchRecordValue(io.camunda.zeebe.protocol.record.value.JobBatchRecordValue) ProcessInstanceIntent(io.camunda.zeebe.protocol.record.intent.ProcessInstanceIntent) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) RunWith(org.junit.runner.RunWith) Bpmn(io.camunda.zeebe.model.bpmn.Bpmn) MessageSubscriptionIntent(io.camunda.zeebe.protocol.record.intent.MessageSubscriptionIntent) Function(java.util.function.Function) Record(io.camunda.zeebe.protocol.record.Record) ProcessMessageSubscriptionIntent(io.camunda.zeebe.protocol.record.intent.ProcessMessageSubscriptionIntent) Duration(java.time.Duration) Map(java.util.Map) EngineRule(io.camunda.zeebe.engine.util.EngineRule) BpmnModelInstance(io.camunda.zeebe.model.bpmn.BpmnModelInstance) VariableDocumentUpdateSemantic(io.camunda.zeebe.protocol.record.value.VariableDocumentUpdateSemantic) ProcessBuilder(io.camunda.zeebe.model.bpmn.builder.ProcessBuilder) ClassRule(org.junit.ClassRule) Parameterized(org.junit.runners.Parameterized) Before(org.junit.Before) EventSubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.EventSubProcessBuilder) ProcessMetadataValue(io.camunda.zeebe.protocol.record.value.deployment.ProcessMetadataValue) Assertions.tuple(org.assertj.core.api.Assertions.tuple) Test(org.junit.Test) BrokerClassRuleHelper(io.camunda.zeebe.test.util.BrokerClassRuleHelper) Assertions(io.camunda.zeebe.protocol.record.Assertions) RecordingExporter(io.camunda.zeebe.test.util.record.RecordingExporter) Consumer(java.util.function.Consumer) List(java.util.List) Rule(org.junit.Rule) ProcessInstanceRecordValue(io.camunda.zeebe.protocol.record.value.ProcessInstanceRecordValue) BpmnElementType(io.camunda.zeebe.protocol.record.value.BpmnElementType) SubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder) StartEventBuilder(io.camunda.zeebe.model.bpmn.builder.StartEventBuilder) JobIntent(io.camunda.zeebe.protocol.record.intent.JobIntent) EventSubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.EventSubProcessBuilder) SubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder) BpmnModelInstance(io.camunda.zeebe.model.bpmn.BpmnModelInstance) EventSubProcessBuilder(io.camunda.zeebe.model.bpmn.builder.EventSubProcessBuilder) Test(org.junit.Test)

Aggregations

SubProcessBuilder (io.camunda.zeebe.model.bpmn.builder.SubProcessBuilder)17 EngineRule (io.camunda.zeebe.engine.util.EngineRule)14 Bpmn (io.camunda.zeebe.model.bpmn.Bpmn)14 BpmnModelInstance (io.camunda.zeebe.model.bpmn.BpmnModelInstance)14 Assertions (io.camunda.zeebe.protocol.record.Assertions)14 Record (io.camunda.zeebe.protocol.record.Record)14 JobIntent (io.camunda.zeebe.protocol.record.intent.JobIntent)14 ProcessInstanceIntent (io.camunda.zeebe.protocol.record.intent.ProcessInstanceIntent)14 BpmnElementType (io.camunda.zeebe.protocol.record.value.BpmnElementType)14 RecordingExporter (io.camunda.zeebe.test.util.record.RecordingExporter)14 Duration (java.time.Duration)14 Consumer (java.util.function.Consumer)14 Assertions.assertThat (org.assertj.core.api.Assertions.assertThat)14 Assertions.tuple (org.assertj.core.api.Assertions.tuple)14 ClassRule (org.junit.ClassRule)14 Rule (org.junit.Rule)14 Test (org.junit.Test)14 EventSubProcessBuilder (io.camunda.zeebe.model.bpmn.builder.EventSubProcessBuilder)11 ProcessBuilder (io.camunda.zeebe.model.bpmn.builder.ProcessBuilder)11 StartEventBuilder (io.camunda.zeebe.model.bpmn.builder.StartEventBuilder)11