From e3e6ff2f91f0e729e8bf856dc4f8ee16e8c7c4ae Mon Sep 17 00:00:00 2001 From: zero88 Date: Tue, 12 Dec 2023 16:37:10 +0700 Subject: [PATCH] refactor(TriggerContext): Add `executed` state --- .../zero88/schedulerx/impl/AbstractScheduler.java | 2 +- .../schedulerx/impl/TriggerContextFactory.java | 15 +++++++++++++-- .../schedulerx/trigger/TriggerCondition.java | 4 ++++ .../zero88/schedulerx/trigger/TriggerContext.java | 5 +++++ .../zero88/schedulerx/SchedulingAsserter.java | 2 +- .../predicate/JsonSchemaMessageFilterTest.java | 4 +--- 6 files changed, 25 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/io/github/zero88/schedulerx/impl/AbstractScheduler.java b/core/src/main/java/io/github/zero88/schedulerx/impl/AbstractScheduler.java index eae64b6..4acf4f5 100644 --- a/core/src/main/java/io/github/zero88/schedulerx/impl/AbstractScheduler.java +++ b/core/src/main/java/io/github/zero88/schedulerx/impl/AbstractScheduler.java @@ -302,7 +302,7 @@ protected final void onMisfire(@NotNull TriggerTransitionContext triggerContext) protected final void onResult(@NotNull ExecutionContext executionContext, @Nullable Throwable asyncCause) { final ExecutionContextInternal ctx = (ExecutionContextInternal) executionContext; - final TriggerTransitionContext triggerContext = ctx.triggerContext(); + final TriggerTransitionContext triggerContext = TriggerContextFactory.executed(ctx.triggerContext()); final Instant finishedAt = state.markFinished(triggerContext.tick()); log(finishedAt, "On result", triggerContext.tick(), ctx.round()); if (asyncCause instanceof TimeoutException) { diff --git a/core/src/main/java/io/github/zero88/schedulerx/impl/TriggerContextFactory.java b/core/src/main/java/io/github/zero88/schedulerx/impl/TriggerContextFactory.java index b3a8e2b..1b9cc26 100644 --- a/core/src/main/java/io/github/zero88/schedulerx/impl/TriggerContextFactory.java +++ b/core/src/main/java/io/github/zero88/schedulerx/impl/TriggerContextFactory.java @@ -77,13 +77,23 @@ private TriggerContextFactory() { } return transition(ctx, TriggerStatus.READY, null, null); } + /** + * Transition trigger context to {@link TriggerStatus#EXECUTED} state. + * + * @param ctx the current trigger context + */ + public static @NotNull TriggerTransitionContext executed(@NotNull TriggerTransitionContext ctx) { + return transition(ctx, TriggerStatus.EXECUTED, null, null); + } + /** * Transition trigger context to {@link TriggerStatus#SKIPPED} state. * * @param ctx the current trigger context * @param reason the transition reason */ - public static @NotNull TriggerTransitionContext skip(@NotNull TriggerTransitionContext ctx, @NotNull String reason) { + public static @NotNull TriggerTransitionContext skip(@NotNull TriggerTransitionContext ctx, + @NotNull String reason) { return transition(ctx, TriggerStatus.SKIPPED, reason, null); } @@ -105,7 +115,8 @@ private TriggerContextFactory() { } * @param ctx the current trigger context * @param reason the transition reason */ - public static @NotNull TriggerTransitionContext stop(@NotNull TriggerTransitionContext ctx, @Nullable String reason) { + public static @NotNull TriggerTransitionContext stop(@NotNull TriggerTransitionContext ctx, + @Nullable String reason) { return transition(ctx, TriggerStatus.STOPPED, reason, null); } diff --git a/core/src/main/java/io/github/zero88/schedulerx/trigger/TriggerCondition.java b/core/src/main/java/io/github/zero88/schedulerx/trigger/TriggerCondition.java index 8600ac3..de93a66 100644 --- a/core/src/main/java/io/github/zero88/schedulerx/trigger/TriggerCondition.java +++ b/core/src/main/java/io/github/zero88/schedulerx/trigger/TriggerCondition.java @@ -45,6 +45,10 @@ enum TriggerStatus { * Identify the trigger is satisfied every predicate then ready to execute the task */ READY, + /** + * Identify the trigger is already run + */ + EXECUTED, /** * Identify the trigger is skipped to execute the task */ diff --git a/core/src/main/java/io/github/zero88/schedulerx/trigger/TriggerContext.java b/core/src/main/java/io/github/zero88/schedulerx/trigger/TriggerContext.java index ae93e61..8fd2e4c 100644 --- a/core/src/main/java/io/github/zero88/schedulerx/trigger/TriggerContext.java +++ b/core/src/main/java/io/github/zero88/schedulerx/trigger/TriggerContext.java @@ -49,6 +49,11 @@ public interface TriggerContext extends HasTriggerType { */ default boolean isReady() { return TriggerStatus.READY == condition().status(); } + /** + * Check whether the trigger is executed or not. + */ + default boolean isExecuted() { return TriggerStatus.EXECUTED == condition().status(); } + /** * Check whether the trigger is skipped or not. */ diff --git a/core/src/testFixtures/java/io/github/zero88/schedulerx/SchedulingAsserter.java b/core/src/testFixtures/java/io/github/zero88/schedulerx/SchedulingAsserter.java index 8733eee..57b838b 100644 --- a/core/src/testFixtures/java/io/github/zero88/schedulerx/SchedulingAsserter.java +++ b/core/src/testFixtures/java/io/github/zero88/schedulerx/SchedulingAsserter.java @@ -109,7 +109,7 @@ public void onEach(@NotNull ExecutionResult result) { Assertions.assertNotNull(result.firedAt()); Assertions.assertNotNull(result.triggeredAt()); Assertions.assertNotNull(result.triggerContext()); - Assertions.assertTrue(result.triggerContext().isReady()); + Assertions.assertTrue(result.triggerContext().isExecuted()); Assertions.assertNotNull(result.executedAt()); Assertions.assertNotNull(result.finishedAt()); Assertions.assertNull(result.rescheduledAt()); diff --git a/ext/src/test/java/io/github/zero88/schedulerx/ext/trigger/predicate/JsonSchemaMessageFilterTest.java b/ext/src/test/java/io/github/zero88/schedulerx/ext/trigger/predicate/JsonSchemaMessageFilterTest.java index 4b3df98..6fffef8 100644 --- a/ext/src/test/java/io/github/zero88/schedulerx/ext/trigger/predicate/JsonSchemaMessageFilterTest.java +++ b/ext/src/test/java/io/github/zero88/schedulerx/ext/trigger/predicate/JsonSchemaMessageFilterTest.java @@ -77,9 +77,7 @@ void test_event_trigger_can_handle_msg_with_various_datatype(Vertx vertx, VertxT .setTask(NoopTask.create(totalEvent)) .build() .start(); - data.forEach(d -> { - vertx.eventBus().publish(address, d); - }); + data.forEach(d -> vertx.eventBus().publish(address, d)); } }