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());