In some cases, a plugin should perform a periodical background operation. Examples are import or synchronization plugins that automatically import/update content in XperienCentral from an external source. This task should be performed on fixed, configurable, dates and times.Tasks that consume a lot of CPU should be scheduled to run when website demand is low. This topic describes how to write such a scheduled task.
See Scheduling Jobs for information on the Cron format that XperienCentral uses to schedule regularly performed tasks.
In This Topic
A scheduled service is just a service component which invokes the schedule API. A service component can be built from the service component archetype — an example of such an implementation is described in Configuration Management.
CustomJobService is the interface that identifies this service and is registered as the interface
classname in the Activator. The
run method is the method that should be invoked on each moment according to the time schedule. The
onStop() methods are invoked for starting/stopping the plugin and are thus the most suitable locations to schedule/unscheduled the task.
Schedule a Task
To schedule tasks, use the
SchedulerService. This service provides the methods necessary for retrieving scheduled jobs and adding/removing new jobs to the schedule. The
SchedulerService will invoke your service according to the schedule you provide.
To add a new job to the scheduler service, use the method
addSchedulerJob(SchedulerJob schedulerJob). This method takes a
SchedulerJob as an input argument. An instance of a default job can be retrieved from the scheduler service by invoking
getSchedulerJob(). This scheduler job contains methods to set the schedule, name the job and invoke the scheduler.
The job is usually scheduled in the
onStart() method and removed in the
onStop() method. To cancel the job, the
removeSchedulerJob(String jobName) method with the name of the job can be invoked. The code snippet below shows an example of how to schedule the job. The schedule itself is defined by a Crontab expression. See also the XperienCentral JavaDoc for the
SchedulerJob for the exact syntax that you need to use for the expression.
run method will be invoked every 15 minutes. Concurrent runs are disabled, so if the
run method takes longer than 15 minutes, the next job will not be run. The name of the job is subject to the guidelines since only one job can use a certain name. Guideline G151 defines that this name must be prefixed by the plugin ID.
If you implement a schedule task, one of the first issues you will face is session management. If, for example, you try to create a media item using the
MediaRepositoryManagementService, the service will throw a "no authorization" exception. See Session Management for more information.
The Crontab schedule used to schedule the job must be configurable. To make the Crontab expression configurable, the Configuration Management should be used. The
scheduleJob method in the code example above should therefore retrieve the Crontab expression from the Configuration Management service and use that as input argument. If the Crontab expression is managed using the Configuration Management service, the schedule can be changed. However, in the code example above, a change in the schedule will not affect the jobs that are already scheduled unless the plugin is restarted manually. For that reason it is a good idea to reschedule the job if it is changed.
The implementation of the
ConfigurationManagementListener can register itself on changes in the configuration set that contain the schedule and reschedule the job when there is a change.
By default, jobs run concurrently. The
run method may be subsequently invoked by another thread before the the previous run has completed. You can disable concurrent runs on the
SchedulerJob instance using