You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2014/07/18 21:08:34 UTC
svn commit: r1611769 - in /sling/trunk/bundles/extensions/event/src:
main/java/org/apache/sling/event/impl/jobs/JobSchedulerImpl.java
test/java/org/apache/sling/event/it/TimedJobsTest.java
Author: cziegeler
Date: Fri Jul 18 19:08:33 2014
New Revision: 1611769
URL: http://svn.apache.org/r1611769
Log:
SLING-3699 : [Job Scheduling] A job scheduled using JobBuilder does not get removed if the JobConsumer returns JobResult.OK
Modified:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobSchedulerImpl.java
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/it/TimedJobsTest.java
Modified: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobSchedulerImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobSchedulerImpl.java?rev=1611769&r1=1611768&r2=1611769&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobSchedulerImpl.java (original)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/JobSchedulerImpl.java Fri Jul 18 19:08:33 2014
@@ -57,6 +57,7 @@ import org.apache.sling.event.impl.suppo
import org.apache.sling.event.jobs.Job;
import org.apache.sling.event.jobs.JobBuilder;
import org.apache.sling.event.jobs.ScheduleInfo;
+import org.apache.sling.event.jobs.ScheduleInfo.ScheduleType;
import org.apache.sling.event.jobs.ScheduledJobInfo;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
@@ -75,6 +76,8 @@ public class JobSchedulerImpl
private static final String PROPERTY_READ_JOB = "properties";
+ private static final String PROPERTY_SCHEDULE_INDEX = "index";
+
/** Default logger */
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@@ -262,10 +265,6 @@ public class JobSchedulerImpl
private void startScheduledJob(final ScheduledJobInfoImpl info) {
if ( !info.isSuspended() ) {
- // Create configuration for scheduled job
- final Map<String, Serializable> config = new HashMap<String, Serializable>();
- config.put(PROPERTY_READ_JOB, info);
-
logger.debug("Adding scheduled job: {}", info.getName());
int index = 0;
for(final ScheduleInfo si : info.getSchedules()) {
@@ -285,6 +284,10 @@ public class JobSchedulerImpl
options = this.scheduler.AT(((ScheduleInfoImpl)si).getNextScheduledExecution());
break;
}
+ // Create configuration for scheduled job
+ final Map<String, Serializable> config = new HashMap<String, Serializable>();
+ config.put(PROPERTY_READ_JOB, info);
+ config.put(PROPERTY_SCHEDULE_INDEX, index);
this.scheduler.schedule(this, options.name(name).config(config).canRunConcurrently(false));
index++;
}
@@ -307,6 +310,34 @@ public class JobSchedulerImpl
final ScheduledJobInfoImpl info = (ScheduledJobInfoImpl) context.getConfiguration().get(PROPERTY_READ_JOB);
this.jobManager.addJob(info.getJobTopic(), info.getJobProperties());
+ int index = (Integer)context.getConfiguration().get(PROPERTY_SCHEDULE_INDEX);
+ final Iterator<ScheduleInfo> iter = info.getSchedules().iterator();
+ ScheduleInfo si = iter.next();
+ for(int i=0; i<index; i++) {
+ si = iter.next();
+ }
+ // if scheduled once (DATE), remove from schedule
+ if ( si.getType() == ScheduleType.DATE ) {
+ if ( index == 0 && info.getSchedules().size() == 1 ) {
+ // remove
+ unschedule(info);
+ } else {
+ // update schedule list
+ final List<ScheduleInfoImpl> infos = new ArrayList<ScheduleInfoImpl>();
+ for(final ScheduleInfo i : info.getSchedules() ) {
+ if ( i != si ) { // no need to use equals
+ infos.add((ScheduleInfoImpl)i);
+ }
+ }
+ try {
+ // no need to pass job name, it's in the job properties already
+ this.writeJob(info.getJobTopic(), null,
+ info.getJobProperties(), info.getName(), info.isSuspended(), infos);
+ } catch ( final PersistenceException pe) {
+ logger.warn("Unable to update scheduled job", pe);
+ }
+ }
+ }
}
public void unschedule(final ScheduledJobInfoImpl info) {
Modified: sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/it/TimedJobsTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/it/TimedJobsTest.java?rev=1611769&r1=1611768&r2=1611769&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/it/TimedJobsTest.java (original)
+++ sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/it/TimedJobsTest.java Fri Jul 18 19:08:33 2014
@@ -83,10 +83,11 @@ public class TimedJobsTest extends Abstr
while ( counter.get() == 0 ) {
this.sleep(1000);
}
- assertEquals(1, this.getJobManager().getScheduledJobs().size()); // job is still scheduled
+ assertEquals(0, this.getJobManager().getScheduledJobs().size()); // job is not scheduled anymore
info.unschedule();
} finally {
ehReg.unregister();
}
}
+
}