From 0dc9a632b474c802f16caf32be50dc0a4ea46b1c Mon Sep 17 00:00:00 2001 From: musketyr Date: Thu, 28 Nov 2024 17:20:54 +0100 Subject: [PATCH] test that non-existing job won't keep the executor forever --- .../worker/runner/JobExecutionRecorder.java | 26 ++++++++++++++++--- .../worker/runner/JobRunnerSpec.groovy | 10 ++++++- .../com/agorapulse/worker/runner/TestJob.java | 5 ++++ .../src/test/resources/application-test.yml | 9 +++++++ 4 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 libs/micronaut-worker-runner/src/test/resources/application-test.yml diff --git a/libs/micronaut-worker-runner/src/test/groovy/com/agorapulse/worker/runner/JobExecutionRecorder.java b/libs/micronaut-worker-runner/src/test/groovy/com/agorapulse/worker/runner/JobExecutionRecorder.java index 1460cd36..80dfce9f 100644 --- a/libs/micronaut-worker-runner/src/test/groovy/com/agorapulse/worker/runner/JobExecutionRecorder.java +++ b/libs/micronaut-worker-runner/src/test/groovy/com/agorapulse/worker/runner/JobExecutionRecorder.java @@ -20,14 +20,20 @@ import com.agorapulse.worker.event.JobExecutionFinishedEvent; import com.agorapulse.worker.event.JobExecutionResultEvent; import com.agorapulse.worker.event.JobExecutionStartedEvent; +import io.micronaut.core.annotation.NonNull; +import io.micronaut.runtime.context.scope.Refreshable; +import io.micronaut.runtime.context.scope.refresh.RefreshEvent; +import io.micronaut.runtime.context.scope.refresh.RefreshEventListener; import io.micronaut.runtime.event.annotation.EventListener; import jakarta.inject.Singleton; import java.util.ArrayList; import java.util.List; +import java.util.Set; @Singleton -public class JobExecutionRecorder { +@Refreshable +public class JobExecutionRecorder implements RefreshEventListener { private final List startedEvents = new ArrayList<>(); private final List finishedEvents = new ArrayList<>(); @@ -48,18 +54,30 @@ public void onJobResult(JobExecutionResultEvent event) { resultEvents.add(event); } - public final List getStartedEvents() { + public List getStartedEvents() { return List.copyOf(startedEvents); } - public final List getFinishedEvents() { + public List getFinishedEvents() { return List.copyOf(finishedEvents); } - public final List getResultEvents() { + public List getResultEvents() { return List.copyOf(resultEvents); } + @Override + public @NonNull Set getObservedConfigurationPrefixes() { + return Set.of(); + } + + @Override + public void onApplicationEvent(RefreshEvent event) { + startedEvents.clear(); + finishedEvents.clear(); + resultEvents.clear(); + } + @Override public String toString() { return "JobExecutionRecorder{startedEvents=%s, finishedEvents=%s, resultEvents=%s}".formatted(startedEvents, finishedEvents, resultEvents); diff --git a/libs/micronaut-worker-runner/src/test/groovy/com/agorapulse/worker/runner/JobRunnerSpec.groovy b/libs/micronaut-worker-runner/src/test/groovy/com/agorapulse/worker/runner/JobRunnerSpec.groovy index 851053d6..791abb7f 100644 --- a/libs/micronaut-worker-runner/src/test/groovy/com/agorapulse/worker/runner/JobRunnerSpec.groovy +++ b/libs/micronaut-worker-runner/src/test/groovy/com/agorapulse/worker/runner/JobRunnerSpec.groovy @@ -42,6 +42,14 @@ class JobRunnerSpec extends Specification { exitHandler.success } + void 'non-existing job will not hang forever'() { + when: + JobRunner runner = new JobRunner(context) + runner.run('test-job-one', 'test-job-zero', 'test-job-hundred') + then: + 'test-job-one' in recorder.finishedEvents*.name + } + void 'runner waits until all events are generated'() { when: JobRunner runner = new JobRunner(context) @@ -105,7 +113,7 @@ class JobRunnerSpec extends Specification { } @Property(name = 'worker.jobs.test-job-three.enabled', value = 'true') - @Property(name = 'worker.jobs.test-job-three.initial-delay', value = '20ms') + @Property(name = 'worker.jobs.test-job-three.initial-delay', value = '5s') void 'only selected jobs are executed ignoring the enabled setting'() { when: JobRunner runner = new JobRunner(context) diff --git a/libs/micronaut-worker-runner/src/test/groovy/com/agorapulse/worker/runner/TestJob.java b/libs/micronaut-worker-runner/src/test/groovy/com/agorapulse/worker/runner/TestJob.java index 2cbf70af..3481982e 100644 --- a/libs/micronaut-worker-runner/src/test/groovy/com/agorapulse/worker/runner/TestJob.java +++ b/libs/micronaut-worker-runner/src/test/groovy/com/agorapulse/worker/runner/TestJob.java @@ -28,6 +28,11 @@ @Singleton public class TestJob { + @Job("testJobZero") + public void recordingJobZero() { + // do nothing + } + @Job("test-job-one") public void recordingJobOne() { // do nothing diff --git a/libs/micronaut-worker-runner/src/test/resources/application-test.yml b/libs/micronaut-worker-runner/src/test/resources/application-test.yml new file mode 100644 index 00000000..87e3811b --- /dev/null +++ b/libs/micronaut-worker-runner/src/test/resources/application-test.yml @@ -0,0 +1,9 @@ +worker: + jobs: + test-job-zero: + fork: 1 + cron: '0 0 4 * * *' #Every day at 4am + enabled: true + producer: + queue-name: report_FacebookCompetitorSynchronize + queue-type: sqs