SLING-8944 - Start in idle status to make sure we become ready if no activity happens
diff --git a/src/main/java/org/apache/sling/distribution/journal/impl/subscriber/SubscriberIdle.java b/src/main/java/org/apache/sling/distribution/journal/impl/subscriber/SubscriberIdle.java
index 784c33d..250ffda 100644
--- a/src/main/java/org/apache/sling/distribution/journal/impl/subscriber/SubscriberIdle.java
+++ b/src/main/java/org/apache/sling/distribution/journal/impl/subscriber/SubscriberIdle.java
@@ -50,6 +50,7 @@
public SubscriberIdle(BundleContext context, int idleMillis) {
this.idleMillis = idleMillis;
executor = Executors.newScheduledThreadPool(1);
+ idle();
this.reg = context.registerService(SystemReadyCheck.class, this, new Hashtable<>());
}
@@ -68,9 +69,7 @@
* Called when processing of a message starts
*/
public synchronized void busy() {
- if (schedule != null) {
- schedule.cancel(false);
- }
+ cancelSchedule();
}
/**
@@ -78,11 +77,17 @@
*/
public synchronized void idle() {
if (!isReady.get()) {
- busy();
+ cancelSchedule();
schedule = executor.schedule(this::ready, idleMillis, TimeUnit.MILLISECONDS);
}
}
+ private void cancelSchedule() {
+ if (schedule != null) {
+ schedule.cancel(false);
+ }
+ }
+
private void ready() {
isReady.set(true);
}
diff --git a/src/test/java/org/apache/sling/distribution/journal/impl/subscriber/SubscriberIdleTest.java b/src/test/java/org/apache/sling/distribution/journal/impl/subscriber/SubscriberIdleTest.java
index a424671..ef5f0d7 100644
--- a/src/test/java/org/apache/sling/distribution/journal/impl/subscriber/SubscriberIdleTest.java
+++ b/src/test/java/org/apache/sling/distribution/journal/impl/subscriber/SubscriberIdleTest.java
@@ -51,6 +51,16 @@
assertState("State should not be reset once it reached GREEN", State.GREEN);
idle.close();
}
+
+ @Test
+ public void testStartIdle() throws InterruptedException {
+ BundleContext context = Mockito.mock(BundleContext.class);
+ idle = new SubscriberIdle(context , IDLE_MILLIES);
+ assertState("Initial state", State.RED);
+ Thread.sleep(IDLE_MILLIES * 2);
+ assertState("State after time over idle limit", State.GREEN);
+ idle.close();
+ }
private void assertState(String message, State expectedState) {
assertThat(message, idle.getStatus().getState(), equalTo(expectedState));