Commit 528e2c81 authored by Kristel Meikas's avatar Kristel Meikas
Browse files

Merge branch 'develop' into 'master'

Release: merge 'develop' into 'master' created by Kristel Meikas

See merge request teis/scheduler-service!39
parents 7c0dfe4c da835087
......@@ -4,6 +4,8 @@ stages:
- deploy
- cve-test
image: docker.repo.tehik.ee/gradle:jdk17
variables:
USE_POSTGRES: "true"
USE_RABBIT: "true"
......
# Changelog
## [2.0.0] - 2022-08-12
* Upgraded to java 17, gradle 7.4.2, spring boot 2.6.8 and others; uses TEIS Gradle plugin 2.3.0
## [1.18.0] - 2022-04-08
* TEIS-2907: added statistics.startTortiQuery job
......
......@@ -17,34 +17,27 @@ buildscript {
// Check for updates every build
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
}
apply plugin: 'ee.sm.ti.teis'
allprojects {
group = "${theGroup}"
version = "${theVersion}"
apply from: this.getClass().getClassLoader().getResource('teis.sonarqube.gradle')
}
subprojects {
apply plugin: 'ee.sm.ti.teis'
functionalities{
base
}
repositories {
mavenLocal()
maven {
url "${gradle.ext.artifactoryUrl}/${gradle.ext.artifactoryRepoKey}"
credentials {
username = "${gradle.ext.artifactoryUser}"
password = "${gradle.ext.artifactoryPass}"
}
}
jcenter()
}
group = "${theGroup}"
version = "${theVersion}"
sourceCompatibility = 11
targetCompatibility = 11
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
jar {
manifest {
attributes('Implementation-Title': project.name,
......@@ -52,5 +45,5 @@ allprojects {
}
}
apply from: this.getClass().getClassLoader().getResource('teis.test-sonar.gradle')
apply from: this.getClass().getClassLoader().getResource('teis.test-jacoco.gradle')
}
theGroup=ee.sm.ti.teis
theVersion=1.18.0
commonsVersion=1.34.0
commonApiGatewayVersion=1.34.0
adminApiGatewayVersion=1.14.3
pluginVersion=1.5.0
theVersion=2.0.0
commonsVersion=2.6.0
commonApiGatewayVersion=2.5.0
adminApiGatewayVersion=2.0.0
pluginVersion=2.3.0
#Mon Aug 12 17:49:46 EEST 2019
distributionUrl=https\://repo.tehik.ee/artifactory/gradle-distributions/gradle-5.6.4-bin.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
distributionUrl=https\://repo.tehik.ee/artifactory/gradle-distributions/gradle-7.4.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
description = """scheduler-service-lib"""
apply plugin: 'io.spring.dependency-management'
functionalities{
library
}
description = """scheduler-service-lib"""
dependencyManagement {
imports {
mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
}
}
dependencies {
implementation "ee.sm.ti.teis:domain-request-lib:${commonsVersion}"
implementation 'javax.persistence:javax.persistence-api:2.2'
implementation 'javax.persistence:javax.persistence-api'
}
apply from: this.getClass().getClassLoader().getResource('teis.publishLib.gradle')
......@@ -2,25 +2,25 @@ package ee.sm.ti.teis.scheduler.job.executor;
import ee.sm.ti.teis.domainrequest.SystemJobFinishedEventDto;
import ee.sm.ti.teis.domainrequest.SystemJobStartedEventDto;
import ee.sm.ti.teis.exceptions.TeisRestException;
import ee.sm.ti.teis.scheduler.domain.SystemJob;
import ee.sm.ti.teis.scheduler.message.SystemJobFinishedRequest;
import ee.sm.ti.teis.scheduler.message.SystemJobStartedRequest;
import ee.sm.ti.teis.servicerequest.RequestMetaDTO;
import ee.sm.ti.teis.types.enums.SystemJobResponseCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import java.time.LocalDateTime;
import java.util.UUID;
import static ee.sm.ti.teis.types.enums.SystemJobResponseCode.*;
@Slf4j
public abstract class SystemJobExecutor {
private static final String WARNING_MESSAGE_PREFIX = "Warning! ";
private final RabbitTemplate msRabbitTemplate;
public SystemJobExecutor(RabbitTemplate msRabbitTemplate) {
protected SystemJobExecutor(RabbitTemplate msRabbitTemplate) {
this.msRabbitTemplate = msRabbitTemplate;
}
......@@ -41,22 +41,17 @@ public abstract class SystemJobExecutor {
try {
String result = executeInternal(systemJob, requestMetaDto);
if (isWarningMessage(result)) {
systemJob.setResponseCode(SystemJobResponseCode.WARNINGS);
systemJob.setResponseCode(WARNINGS);
log.warn("System job execution with warnings. {}", result);
} else {
systemJob.setResponseCode(SystemJobResponseCode.SUCCESS);
systemJob.setResponseCode(SUCCESS);
log.info("System job execution success. {}", result);
}
systemJob.setResponseMessage(result);
} catch (Exception e) {
log.error("System job execution failed.", e);
systemJob.setResponseCode(SystemJobResponseCode.FAILED);
// FIXME: remove if clause, after TeisRestException returns message from getMessage() method in commons-public version 1.6.0
if (e instanceof TeisRestException && ((TeisRestException) e).getError() != null) {
systemJob.setResponseMessage(((TeisRestException) e).getError().getMessage());
} else {
systemJob.setResponseMessage(e.getMessage());
}
systemJob.setResponseCode(FAILED);
systemJob.setResponseMessage(e.getMessage());
}
systemJob.setFinishedAt(LocalDateTime.now());
notifyJobFinishedEvent(systemJob, requestMetaDto);
......@@ -77,4 +72,5 @@ public abstract class SystemJobExecutor {
requestDTO.setPayload(payload, requestMetaDto);
msRabbitTemplate.convertAndSend(requestDTO.routingKey(), requestDTO);
}
}
package ee.sm.ti.teis.scheduler.job.executor;
import ee.sm.ti.teis.AbstractDTO;
import ee.sm.ti.teis.ErrorDTO;
import ee.sm.ti.teis.exceptions.TeisRestException;
import ee.sm.ti.teis.scheduler.domain.SystemJob;
import ee.sm.ti.teis.scheduler.message.SystemJobFinishedRequest;
import ee.sm.ti.teis.servicerequest.RequestMetaDTO;
import ee.sm.ti.teis.servicerequest.UserType;
import ee.sm.ti.teis.types.enums.SystemJobResponseCode;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
......@@ -16,17 +17,19 @@ import org.springframework.amqp.rabbit.core.RabbitTemplate;
import java.util.UUID;
import static ee.sm.ti.teis.errors.CommonErrorCode.SYSTEM_ERROR;
import static ee.sm.ti.teis.scheduler.job.executor.SystemJobExecutor.composeWarningMessage;
import static ee.sm.ti.teis.types.enums.SystemJobResponseCode.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
@ExtendWith(MockitoExtension.class)
public class SystemJobExecutorTest {
class SystemJobExecutorTest {
private static final String JOB_ID = "testJob";
private static final String JOB2_ID = "testJob2";
private static final String JOB3_ID = "testJob3";
@Mock
RabbitTemplate msRabbitTemplate;
@Captor
......@@ -35,8 +38,7 @@ public class SystemJobExecutorTest {
ArgumentCaptor<String> routingKeyCaptor;
@Test
public void should_sendStartedAndFinishedNotifications_success() {
void execute_noWarningsOrErrors_shouldSendStartedAndFinishedNotifications_success() {
SystemJobExecutor testJob = new TestJob(msRabbitTemplate);
SystemJob systemJob = SystemJob.builder().id(JOB_ID).build();
testJob.execute(systemJob, createRequestMeta());
......@@ -60,13 +62,12 @@ public class SystemJobExecutorTest {
assertThat(finishedEventMessage.getPayload().getId()).isEqualTo(JOB_ID);
assertThat(finishedEventMessage.getPayload().getStartedAt()).isNotNull();
assertThat(finishedEventMessage.getPayload().getFinishedAt()).isNotNull();
assertThat(finishedEventMessage.getPayload().getResponseCode()).isEqualTo(SystemJobResponseCode.SUCCESS);
assertThat(finishedEventMessage.getPayload().getResponseCode()).isEqualTo(SUCCESS);
assertThat(finishedEventMessage.getPayload().getResponseMessage()).isEqualTo("Done");
}
@Test
public void correctResultType_when_job_executed_with_warnings() {
void execute_executedWithWarnings_correctResultType() {
SystemJobExecutor testJob = new TestJobWithWarnings(msRabbitTemplate);
SystemJob systemJob = SystemJob.builder().id(JOB2_ID).build();
testJob.execute(systemJob, createRequestMeta());
......@@ -80,20 +81,38 @@ public class SystemJobExecutorTest {
assertThat(finishedEventMessage.getPayload().getId()).isEqualTo(JOB2_ID);
assertThat(finishedEventMessage.getPayload().getStartedAt()).isNotNull();
assertThat(finishedEventMessage.getPayload().getFinishedAt()).isNotNull();
assertThat(finishedEventMessage.getPayload().getResponseCode()).isEqualTo(SystemJobResponseCode.WARNINGS);
assertThat(finishedEventMessage.getPayload().getResponseCode()).isEqualTo(WARNINGS);
assertThat(finishedEventMessage.getPayload().getResponseMessage()).isEqualTo("Warning! Done with warnings");
}
@Test
void test_is_warning_message() {
void execute_executeInternalThrowsException_errorMessageSetAsResponseMessage() {
SystemJobExecutor testJob = new TestJobWithError(msRabbitTemplate);
SystemJob systemJob = SystemJob.builder().id(JOB3_ID).build();
testJob.execute(systemJob, createRequestMeta());
verify(msRabbitTemplate, times(2)).convertAndSend(routingKeyCaptor.capture(), systemJobRequestCaptor.capture());
// started notification
assertThat(routingKeyCaptor.getAllValues().get(0)).containsIgnoringCase("started");
// finished notification
assertThat(routingKeyCaptor.getAllValues().get(1)).containsIgnoringCase("finished");
SystemJobFinishedRequest finishedEventMessage = (SystemJobFinishedRequest) systemJobRequestCaptor.getAllValues().get(1);
assertThat(finishedEventMessage.getPayload().getId()).isEqualTo(JOB3_ID);
assertThat(finishedEventMessage.getPayload().getStartedAt()).isNotNull();
assertThat(finishedEventMessage.getPayload().getFinishedAt()).isNotNull();
assertThat(finishedEventMessage.getPayload().getResponseCode()).isEqualTo(FAILED);
assertThat(finishedEventMessage.getPayload().getResponseMessage()).isEqualTo("Something went horribly wrong!");
}
@Test
void isWarningMessage_success() {
SystemJobExecutor testJob = new TestJob(msRabbitTemplate);
assertThat(testJob.isWarningMessage("Some message")).isFalse();
assertThat(testJob.isWarningMessage("Warning! Some message")).isTrue();
}
@Test
void test_compose_warning_message() {
SystemJobExecutor testJob = new TestJob(msRabbitTemplate);
void composeWarningMessage_success() {
assertThat(composeWarningMessage("Some message")).isEqualTo("Warning! Some message");
}
......@@ -120,6 +139,7 @@ public class SystemJobExecutorTest {
protected String getJobId() {
return JOB_ID;
}
}
public class TestJobWithWarnings extends SystemJobExecutor {
......@@ -137,5 +157,28 @@ public class SystemJobExecutorTest {
protected String getJobId() {
return JOB2_ID;
}
}
public class TestJobWithError extends SystemJobExecutor {
public TestJobWithError(RabbitTemplate msRabbitTemplate) {
super(msRabbitTemplate);
}
@Override
protected String executeInternal(SystemJob payload, RequestMetaDTO requestMetaDto) {
ErrorDTO errorDTO = new ErrorDTO();
errorDTO.setCode(SYSTEM_ERROR.getCode());
errorDTO.setMessage("Something went horribly wrong!");
throw new TeisRestException(errorDTO);
}
@Override
protected String getJobId() {
return JOB2_ID;
}
}
}
......@@ -10,24 +10,17 @@ apply from: this.getClass().getClassLoader().getResource('teis.integrationTest.g
apply from: this.getClass().getClassLoader().getResource('teis.microservice.gradle')
dependencies {
compile project(':scheduler-service-lib')
implementation project(':scheduler-service-lib')
implementation "ee.sm.ti.teis:service-request-lib:${commonsVersion}"
implementation "ee.sm.ti.teis:domain-request-lib:${commonsVersion}"
implementation "ee.sm.ti.teis:service-common-lib:${commonsVersion}"
implementation "ee.sm.ti.teis:admin-api-gateway-lib:${adminApiGatewayVersion}"
implementation "ee.sm.ti.teis:bpm-lib:${commonsVersion}"
implementation 'org.springframework.boot:spring-boot-starter-quartz:2.3.4.RELEASE'
implementation 'org.springframework.boot:spring-boot-starter-quartz'
testImplementation "org.camunda.bpm.extension.mockito:camunda-bpm-mockito:4.10.0"
integTestImplementation "ee.sm.ti.teis:service-request-lib:${commonsVersion}"
integTestImplementation "ee.sm.ti.teis:service-common-lib:${commonsVersion}"
integTestImplementation "ee.sm.ti.teis:admin-api-gateway-lib:${adminApiGatewayVersion}"
integTestImplementation "ee.sm.ti.teis:bpm-lib:${commonsVersion}"
integTestImplementation 'org.springframework.boot:spring-boot-starter-quartz:2.3.4.RELEASE'
integTestImplementation 'org.camunda.bpm.springboot:camunda-bpm-spring-boot-starter-webapp:3.2.1'
testImplementation "org.camunda.bpm.extension.mockito:camunda-bpm-mockito:5.16.0"
}
// Define the main class for the application
......
......@@ -20,7 +20,7 @@ import static java.util.UUID.randomUUID;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.util.CollectionUtils.isEmpty;
public class AdminJobListenerTest extends SchedulerAppTestBase {
class AdminJobListenerTest extends SchedulerAppTestBase {
@Autowired
AdminJobListener listener;
......@@ -34,7 +34,7 @@ public class AdminJobListenerTest extends SchedulerAppTestBase {
}
@Test
public void getSystemJobDefinitions_success() {
void getSystemJobDefinitions_success() {
GetSystemJobDefinitionsRequest request = new GetSystemJobDefinitionsRequest();
requestMetaDTO.setPrivileges(List.of(TI_VIEW_SYSTEM_JOBS.name()));
request.setPayload(null, requestMetaDTO);
......@@ -50,7 +50,7 @@ public class AdminJobListenerTest extends SchedulerAppTestBase {
}
@Test
public void getSystemJobExecutions_success() {
void getSystemJobExecutions_success() {
GetSystemJobsRequest request = new GetSystemJobsRequest();
request.setPayload("violationacts.createPreceptTasks", requestMetaDTO);
......@@ -58,4 +58,5 @@ public class AdminJobListenerTest extends SchedulerAppTestBase {
assertThat(response.getPayload()).isEmpty();
}
}
......@@ -8,14 +8,17 @@ import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class JobDefinitionServiceTest extends SchedulerAppTestBase {
class JobDefinitionServiceTest extends SchedulerAppTestBase {
@Autowired
JobDefinitionService jobDefinitionService;
@Test
public void should_notReturnDisabledJobs() {
void should_notReturnDisabledJobs() {
List<JobDefinitionEntity> jobs = jobDefinitionService.getActiveJobs();
assertThat(jobs).allSatisfy(job -> assertThat(job.getId()).isNotEqualTo("scheduler.disabledJob"));
assertThat(jobs)
.isNotEmpty()
.allSatisfy(job -> assertThat(job.getId()).isNotEqualTo("scheduler.disabledJob"));
}
}
package ee.sm.ti.teis.scheduler.job.definition;
import ee.sm.ti.teis.SchedulerAppTestBase;
import org.junit.jupiter.api.Test;
import org.quartz.SchedulerException;
......@@ -8,18 +7,19 @@ import org.springframework.beans.factory.annotation.Autowired;
import static org.assertj.core.api.Assertions.assertThat;
public class JobSchedulerServiceTest extends SchedulerAppTestBase {
class JobSchedulerServiceTest extends SchedulerAppTestBase {
@Autowired
JobSchedulerService jobSchedulerService;
@Test
public void pingJobSchedulerJob_isCreated() throws SchedulerException {
void pingJobSchedulerJob_isCreated() throws SchedulerException {
assertThat(jobSchedulerService.findAllScheduledJobs()).contains("scheduler.pingTestJob");
}
@Test
public void atLeastTwoJobs_areCreated() throws SchedulerException {
assertThat(jobSchedulerService.findAllScheduledJobs().size()).isGreaterThan(1);
void atLeastTwoJobs_areCreated() throws SchedulerException {
assertThat(jobSchedulerService.findAllScheduledJobs()).hasSizeGreaterThanOrEqualTo(1);
}
}
......@@ -9,11 +9,11 @@ import ee.sm.ti.teis.scheduler.job.execution.JobExecutionEntity;
import ee.sm.ti.teis.scheduler.job.execution.JobExecutionRepository;
import ee.sm.ti.teis.types.enums.SystemJobResponseCode;
import ee.sm.ti.teis.types.enums.SystemJobStatus;
import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import javax.transaction.Transactional;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.UUID;
......@@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.testcontainers.shaded.com.google.common.collect.ImmutableList.of;
@Transactional
public class JobProcessingServiceTest extends SchedulerAppTestBase {
class JobProcessingServiceTest extends SchedulerAppTestBase {
private static final String JOB_ID = "scheduler.pingTestJob";
......@@ -37,7 +37,7 @@ public class JobProcessingServiceTest extends SchedulerAppTestBase {
JobExecutionRepository jobExecutionRepository;
@Test
public void startJob_success() {
void startJob_success() {
UUID executionId = UUID.randomUUID();
LocalDateTime initTime = LocalDateTime.now();
SystemJob systemJob = SystemJob.builder().id(JOB_ID).executionId(executionId).build();
......@@ -51,14 +51,14 @@ public class JobProcessingServiceTest extends SchedulerAppTestBase {
}
@Test
public void startJob_throwsException_when_jobNotFound() {
void startJob_throwsException_when_jobNotFound() {
UUID executionId = UUID.randomUUID();
SystemJob systemJob = SystemJob.builder().id("unknown job").executionId(executionId).build();
assertThrows(TeisResourceNotFoundException.class, () -> jobProcessingService.startJob(systemJob));
}
@Test
public void startedJob_success() {
void startedJob_success() {
UUID executionId = UUID.randomUUID();
LocalDateTime initTime = LocalDateTime.now();
SystemJob systemJob = SystemJob.builder().id(JOB_ID).executionId(executionId).build();
......@@ -73,7 +73,7 @@ public class JobProcessingServiceTest extends SchedulerAppTestBase {
}
@Test
public void finishedJob_success() {
void finishedJob_success() {
UUID executionId = UUID.randomUUID();
LocalDateTime initTime = LocalDateTime.now();
SystemJob systemJob = SystemJob.builder().id(JOB_ID).executionId(executionId).build();
......@@ -92,7 +92,7 @@ public class JobProcessingServiceTest extends SchedulerAppTestBase {
}
@Test
public void timeoutStartJob_success() {
void timeoutStartJob_success() {
UUID executionId = UUID.randomUUID();
SystemJob systemJob = SystemJob.builder().id(JOB_ID).executionId(executionId).build();
jobProcessingService.startJob(systemJob);
......@@ -107,7 +107,7 @@ public class JobProcessingServiceTest extends SchedulerAppTestBase {
}
@Test
public void timeoutFinishJob_success() {
void timeoutFinishJob_success() {
UUID executionId = UUID.randomUUID();
LocalDateTime initTime = LocalDateTime.now();
SystemJob systemJob = SystemJob.builder().id(JOB_ID).executionId(executionId).build();
......@@ -138,4 +138,5 @@ public class JobProcessingServiceTest extends SchedulerAppTestBase {
assertThat(jobDefinitionEntity.getStatus()).isEqualTo(status);
return jobDefinitionEntity;
}
}
......@@ -21,7 +21,7 @@ import static ee.sm.ti.teis.servicerequest.UserType.SYSTEM;
import static java.util.UUID.randomUUID;
import static org.assertj.core.api.Assertions.assertThat;
public class SystemJobEventsListenerTest extends SchedulerAppTestBase {
class SystemJobEventsListenerTest extends SchedulerAppTestBase {
private static final RequestMetaDTO SYSTEM_REQUEST_META_DTO = RequestMetaDTO.builder()
.requestId(randomUUID().toString())
......@@ -43,7 +43,7 @@ public class SystemJobEventsListenerTest extends SchedulerAppTestBase {
JobDefinitionService jobDefinitionService;
@Test
public void sendStartedEvent_success() throws InterruptedException {
void sendStartedEvent_success() throws InterruptedException {
// launch job
SystemJob systemJob = jobLauncherService.launchJob(JOB_ID, SYSTEM_REQUEST_META_DTO);
JobDefinitionEntity jobDefinitionEntity = jobDefinitionService.getJob(JOB_ID);
......@@ -83,4 +83,5 @@ public class SystemJobEventsListenerTest extends SchedulerAppTestBase {
assertThat(jobExecutionEntity.getResponseCode()).isEqualTo(SystemJobResponseCode.SUCCESS);
assertThat(jobExecutionEntity.getResponseMessage()).isEqualTo("OK");
}
}
......@@ -14,6 +14,10 @@ camunda:
schema-update: false
schema-name: camunda
table-prefix: camunda.
generic-properties:
properties:
historyCleanupBatchWindowStartTime: ${CAMUNDA_HISTORY_CLEANUP_START_TIME:21:00}
historyCleanupBatchWindowEndTime: ${CAMUNDA_HISTORY_CLEANUP_END_TIME:23:00}
spring:
profiles:
active: ${ENV_GLOBAL_PROFILES:local},${ENV_APP_PROFILES:app}
......@@ -23,7 +27,6 @@ spring:
# FIXME: use owner user, because quartz requires create privileges. Move quartz tables to different schema.
username: ${DB_OWNER_USERNAME}
password: ${DB_OWNER_PASSWORD}
initialization-mode: never
hikari:
maximum-pool-size: 10
liquibase:
......@@ -55,7 +58,6 @@ spring:
isClustered: true
clusterCheckinInterval: 1000
misfireThreshold: 1000
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
useProperties: true
tablePrefix: qrtz_
......
......@@ -5,7 +5,7 @@
<include file="classpath:common/db/changelog/common-master.xml"/>
<includeAll path="domain" relativeToChangelogFile="true"/>
<include file="classpath:common/db/changelog/camunda-7-10.xml"/>
<include file="classpath:common/db/changelog/camunda.xml"/>
<include file="classpath:org/quartz/impl/jdbcjobstore/liquibase.quartz.init.xml"/>
<includeAll path="data" relativeToChangelogFile="true"/>
......
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_178v17s" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.4.1">
<bpmn:process id="ExecuteSystemJob_process" name="The process controls the execution of system jobs" isExecutable="true">
<bpmn:process id="ExecuteSystemJob_process" name="The process controls the execution of system jobs" isExecutable="true" camunda:historyTimeToLive="14">
<bpmn:startEvent id="ExecuteStartJob_process" name="Start job execution process">
<bpmn:outgoing>executeStartJob_sequenceFlow</bpmn:outgoing>
<bpmn:messageEventDefinition id="MessageEventDefinition_13kusgp" messageRef="Message_1t9w9ht" />
......