Goal
Create a sample Sling Scheduler
Package Install | Github
http://localhost:4502/system/console/configMgr/apps.experienceaem.assets.SampleScheduler
Solution
1) Create Scheduler configuration apps.experienceaem.assets.SampleSchedulerConfiguration
package apps.experienceaem.assets;
import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.AttributeType;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;
@ObjectClassDefinition(
name = "Experience AEM: SlingSchedulerConfiguration",
description = "Sling scheduler configuration"
)
public @interface SampleSchedulerConfiguration {
@AttributeDefinition(
name = "Scheduler name",
description = "Name of the scheduler",
type = AttributeType.STRING)
public String schedulerName() default "Custom Sling Scheduler Configuration";
@AttributeDefinition(
name = "Enabled",
description = "True, if scheduler service is enabled",
type = AttributeType.BOOLEAN)
public boolean enabled() default false;
@AttributeDefinition(
name = "Cron Expression",
description = "Cron expression used by the scheduler",
type = AttributeType.STRING)
public String cronExpression() default "0/10 * * * * ?"; // runs every 10 seconds
@AttributeDefinition(
name = "Custom Path Parameter",
description = "Custom path parameter to be used by the scheduler",
type = AttributeType.STRING)
public String customPathParameter() default "/content/dam";
}
2) Create Scheduler class apps.experienceaem.assets.SampleScheduler implementing Runnable.class
package apps.experienceaem.assets;
import org.apache.sling.commons.scheduler.ScheduleOptions;
import org.apache.sling.commons.scheduler.Scheduler;
import org.osgi.service.component.annotations.*;
import org.osgi.service.metatype.annotations.Designate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component(immediate = true, service = Runnable.class)
@Designate(ocd = SampleSchedulerConfiguration.class)
public class SampleScheduler implements Runnable {
private static final Logger LOGGER = LoggerFactory.getLogger(SampleScheduler.class);
private String customPathParameter;
private int schedulerId;
@Reference
private Scheduler scheduler;
@Activate
protected void activate(SampleSchedulerConfiguration config) {
schedulerId = config.schedulerName().hashCode();
customPathParameter = config.customPathParameter();
addScheduler(config);
}
@Deactivate
protected void deactivate(SampleSchedulerConfiguration config) {
removeScheduler();
}
@Modified
protected void modified(SampleSchedulerConfiguration config) {
removeScheduler();
schedulerId = config.schedulerName().hashCode();
addScheduler(config);
}
private void removeScheduler() {
scheduler.unschedule(String.valueOf(schedulerId));
}
/**
* This method adds the scheduler
*
* @param config
*/
private void addScheduler(SampleSchedulerConfiguration config) {
if(config.enabled()) {
ScheduleOptions scheduleOptions = scheduler.EXPR(config.cronExpression());
scheduleOptions.name(config.schedulerName());
scheduleOptions.canRunConcurrently(false);
scheduler.schedule(this, scheduleOptions);
LOGGER.info("Experience AEM Scheduler added");
} else {
LOGGER.info("Experience AEM Scheduler disabled");
}
}
public void run() {
LOGGER.info("Experience AEM, customPathParameter {}", customPathParameter);
}
}