I am trying to implement simple scheduler for my project requirement, my project is using Adobe AEM
. As of now I gone through Adobe site and tried to implement the
You missed to set immediate = true
. This starts/activates an component/service automatically with the bundle-start. Otherwise the service is only started, if another (already started) service requests this service (or has a dependency).
In OSGi all services are lazy started, and stopped as soon as nobody needs them. I agree, it could be improved, if the scheduler service would automatically start all services that it would trigger. But that's the way it is.
This is a working example.
@Component(immediate = true, metatype = true)
@Service({ Runnable.class, AnotherServiceInterface.class})
@Properties({
// run every 5 seconds
@Property(name = "scheduler.period", longValue = 5),
// no concurrent execution
@Property(name = "scheduler.concurrent", propertyPrivate = true, boolValue = false)
})
Following solution worked as required, here three cases are handled
addJob()
: executes the job every minuteaddPeriodicJob()
: executes the job every 3 minuteswith fireJobAt()
: executes the job at a specific date (date of deployment + delay of 30 seconds)
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.sling.commons.scheduler.Scheduler;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component
public class ScheduledPeriodicJob {
/** Default log. */
protected final Logger log = LoggerFactory.getLogger(this.getClass());
/** The scheduler for rescheduling jobs. */
@Reference
private Scheduler scheduler;
protected void activate(ComponentContext componentContext) throws Exception {
//case 1: with addJob() method: executes the job every minute
String schedulingExpression = "0 * * * * ?";
String jobName1 = "case1";
Map<String, Serializable> config1 = new HashMap<String, Serializable>();
boolean canRunConcurrently = true;
final Runnable job1 = new Runnable() {
public void run() {
log.info("\n\nExecuting");
log.info("\n\nExecuting");
log.info("\n\nExecuting");
log.info("\n\nExecuting");
log.info("\n\nExecuting");
log.info("\n\nExecuting");
log.info("\n\nExecuting");
log.info("\n\nExecuting");
log.info("\n\nExecuting");
}
};
try {
this.scheduler.addJob(jobName1, job1, config1, schedulingExpression, canRunConcurrently);
} catch (Exception e) {
job1.run();
}
//case 2: with addPeriodicJob(): executes the job every 3 minutes
String jobName2 = "case2";
long period = 180;
Map<String, Serializable> config2 = new HashMap<String, Serializable>();
final Runnable job2 = new Runnable() {
public void run() {
log.info("\nExecuting 2");
log.info("\nExecuting 2");
log.info("\nExecuting 2");
log.info("\nExecuting 2");
log.info("\nExecuting 2");
log.info("\nExecuting 2");
log.info("\nExecuting 2");
log.info("\nExecuting 2");
}
};
try {
this.scheduler.addPeriodicJob(jobName2, job2, config2, period, canRunConcurrently);
} catch (Exception e) {
job2.run();
}
//case 3: with fireJobAt(): executes the job at a specific date (date of deployment + delay of 30 seconds)
String jobName3 = "case3";
final long delay = 30*1000;
final Date fireDate = new Date();
fireDate.setTime(System.currentTimeMillis() + delay);
Map<String, Serializable> config3 = new HashMap<String, Serializable>();
final Runnable job3 = new Runnable() {
public void run() {
log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
log.info("\nExecuting at date: {} with a delay of: {} seconds", fireDate, delay/1000);
}
};
try {
this.scheduler.fireJobAt(jobName3, job3, config3, fireDate);
} catch (Exception e) {
job3.run();
}
}
protected void deactivate(ComponentContext componentContext) {
log.info("Deactivateddbye!");
}
}
Below is pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd ">
<modelVersion>4.0.0</modelVersion>
<!-- ====================================================================== -->
<!-- P A R E N T P R O J E C T D E S C R I P T I O N -->
<!-- ====================================================================== -->
<parent>
<groupId>com.adobe.cq</groupId>
<artifactId>schedule</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- ====================================================================== -->
<!-- P R O J E C T D E S C R I P T I O N -->
<!-- ====================================================================== -->
<artifactId>schedule-bundle</artifactId>
<packaging>bundle</packaging>
<name>My Project Bundle</name>
<dependencies>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.scr.annotations</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.tagic</groupId>
<artifactId>logger</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/logger-0.0.1-SNAPSHOT.jar</systemPath>
</dependency>
<dependency>
<groupId>com.tagic</groupId>
<artifactId>org.apache.sling.commons.scheduler</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/org.apache.sling.commons.scheduler-2.3.3-R1232965.jar</systemPath>
</dependency>
</dependencies>
<!-- ====================================================================== -->
<!-- B U I L D D E F I N I T I O N -->
<!-- ====================================================================== -->
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-scr-plugin</artifactId>
<executions>
<execution>
<id>generate-scr-descriptor</id>
<goals>
<goal>scr</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>com.adobe.cq.schedule-bundle</Bundle-SymbolicName>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.sling</groupId>
<artifactId>maven-sling-plugin</artifactId>
<configuration>
<slingUrl>http://${crx.host}:${crx.port}/apps/myproject/install</slingUrl>
<usePut>true</usePut>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<excludePackageNames>
*.impl
</excludePackageNames>
</configuration>
</plugin>
</plugins>
</build>
</project>