You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by jo...@apache.org on 2022/06/08 15:37:27 UTC

[sling-org-apache-sling-event] branch master updated: SLING-11379 do not register the same job over and over (#22)

This is an automated email from the ASF dual-hosted git repository.

joerghoh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-event.git


The following commit(s) were added to refs/heads/master by this push:
     new 3b1d07a  SLING-11379 do not register the same job over and over (#22)
3b1d07a is described below

commit 3b1d07a7f6bca249cf74f2a9ba460da5374c6405
Author: Jörg Hoh <jo...@users.noreply.github.com>
AuthorDate: Wed Jun 8 17:37:23 2022 +0200

    SLING-11379 do not register the same job over and over (#22)
    
    * SLING-11379 avoid registering the same scheduled job
---
 .../sling/event/impl/jobs/JobBuilderImpl.java      |  3 +-
 .../jobs/scheduling/JobScheduleBuilderImpl.java    | 39 +++++++++++++++++++++-
 .../org/apache/sling/event/it/SchedulingIT.java    |  8 ++++-
 3 files changed, 46 insertions(+), 4 deletions(-)

diff --git a/src/main/java/org/apache/sling/event/impl/jobs/JobBuilderImpl.java b/src/main/java/org/apache/sling/event/impl/jobs/JobBuilderImpl.java
index a662066..aee4e46 100644
--- a/src/main/java/org/apache/sling/event/impl/jobs/JobBuilderImpl.java
+++ b/src/main/java/org/apache/sling/event/impl/jobs/JobBuilderImpl.java
@@ -20,7 +20,6 @@ package org.apache.sling.event.impl.jobs;
 
 import java.util.List;
 import java.util.Map;
-import java.util.UUID;
 
 import org.apache.sling.event.impl.jobs.scheduling.JobScheduleBuilderImpl;
 import org.apache.sling.event.jobs.Job;
@@ -64,7 +63,7 @@ public class JobBuilderImpl implements JobBuilder {
         return new JobScheduleBuilderImpl(
                 this.topic,
                 this.properties,
-                UUID.randomUUID().toString(),
+                null, // correct value is calculated later
                 this.jobManager.getJobScheduler());
     }
 }
diff --git a/src/main/java/org/apache/sling/event/impl/jobs/scheduling/JobScheduleBuilderImpl.java b/src/main/java/org/apache/sling/event/impl/jobs/scheduling/JobScheduleBuilderImpl.java
index 7e46985..27f83c7 100644
--- a/src/main/java/org/apache/sling/event/impl/jobs/scheduling/JobScheduleBuilderImpl.java
+++ b/src/main/java/org/apache/sling/event/impl/jobs/scheduling/JobScheduleBuilderImpl.java
@@ -19,18 +19,23 @@
 package org.apache.sling.event.impl.jobs.scheduling;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.sling.event.impl.support.ScheduleInfoImpl;
 import org.apache.sling.event.jobs.JobBuilder.ScheduleBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.apache.sling.event.jobs.ScheduledJobInfo;
 
 /**
  * The builder implementation for scheduled jobs.
  */
 public final class JobScheduleBuilderImpl implements ScheduleBuilder {
+    
+    private final Logger logger = LoggerFactory.getLogger(JobScheduleBuilderImpl.class);
 
     private final String topic;
 
@@ -104,9 +109,13 @@ public final class JobScheduleBuilderImpl implements ScheduleBuilder {
 
     @Override
     public ScheduledJobInfo add(final List<String> errors) {
+        String finalScheduleName = scheduleName;
+        if (scheduleName == null) {
+            finalScheduleName = deriveScheduleName();
+        }
         return this.jobScheduler.addScheduledJob(topic,
                 properties,
-                scheduleName,
+                finalScheduleName,
                 suspend,
                 schedules,
                 errors);
@@ -117,4 +126,32 @@ public final class JobScheduleBuilderImpl implements ScheduleBuilder {
         this.suspend = true;
         return this;
     }
+
+    /**
+     * In case a scheduleName was not provided we calculate on based on the available
+     * data so we can detect duplicates.
+     * @return a value which is identical for identical jobs
+     */
+    private String deriveScheduleName() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("topic=").append(topic)
+            .append(",suspend=").append(suspend)
+            .append(",");
+
+        if (properties != null) {
+            // sort the properties and flatten them into a string
+            List<String> keys = new ArrayList<>(properties.keySet());
+            Collections.sort(keys);
+            for (String key: keys) {
+                sb.append(key).append("=").append(properties.get(key)).append(",");
+            }
+        }
+        // append all schedules
+        sb.append("schedules=").append(schedules);
+        String scheduleName = sb.toString();
+
+        String hashCode = String.valueOf(scheduleName.hashCode());
+        logger.debug("calculated scheduleName={}, hash={}", scheduleName, hashCode);
+        return hashCode;
+    }
 }
diff --git a/src/test/java/org/apache/sling/event/it/SchedulingIT.java b/src/test/java/org/apache/sling/event/it/SchedulingIT.java
index c13b57b..d192eb3 100644
--- a/src/test/java/org/apache/sling/event/it/SchedulingIT.java
+++ b/src/test/java/org/apache/sling/event/it/SchedulingIT.java
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.event.it;
 
+import java.util.Collections;
 import java.util.Date;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -77,6 +78,9 @@ public class SchedulingIT extends AbstractJobHandlingIT {
         assertNotNull(info2);
         final ScheduledJobInfo info3 = jobManager.createJob(TOPIC).schedule().weekly(3, 19, 12).add();
         assertNotNull(info3);
+        // This is a duplicate and won't be scheduled, as it is identical to the 3rd job
+        final ScheduledJobInfo info4 = jobManager.createJob(TOPIC).schedule().weekly(3, 19, 12).add();
+        assertNotNull(info4);
 
         assertEquals(3, jobManager.getScheduledJobs().size()); // scheduled jobs
         info3.unschedule();
@@ -106,7 +110,9 @@ public class SchedulingIT extends AbstractJobHandlingIT {
         });
         for(int i=0; i<NUM_ITERATIONS; i++) {
             logger.info("schedulingLoadTest: loop-" + i);
-            jobManager.createJob(ownTopic).schedule().at(new Date(System.currentTimeMillis() + 2500)).add();
+            jobManager.createJob(ownTopic)
+                .properties(Collections.singletonMap("prop", i))
+                .schedule().at(new Date(System.currentTimeMillis() + 2500)).add();
             Thread.sleep(1);
         }
         logger.info("schedulingLoadTest: done, letting jobs be triggered, currently at {} jobs, {} schedules", counter.get(), jobManager.getScheduledJobs().size());