Wiki

Clone wiki

lmf / Module-Scheduler

How to use the LMF Scheduler (based on QuartzScheduler)

Introduction

The Linked Media Framework includes QuartzScheduler to provide a service for recurring tasks such as periodical updates of an RSS Feed.

A list of scheduled Triggers and Jobs is available via web service under the /quartz endpoint.

Usage

To use the scheduling service, just add

#!java
@Inject
private QuartzService quartzService;
to your service bean.

The QuartzService takes care of initialising the scheduler and acts as a proxy to the Quartz instance, exposing all public methods of the QuartzScheduler API

Jobs implementing the lmf.scheduler.api.DependencyInjectedJob-Interface will have all declared dependencies injected.

For detailed information on Quartz's Jobs and Triggers see the Quartz coockbook.

Example

Implement a Job

#!java
public class MyJob implements DependencyInjectedJob {

  /** We need the ResourceService, ... **/
  @Inject
  private ResourceService resourceService;

  /** most operations with resources must be wrapped in a transaction **/
  @Inject
  private TransactionServer transactionService;

  /** ...and some job-data **/
  private String targetUri, myVar;

  /** provide an injection hook for the rssUrl from JobData **/
  public void setTargetUri(String uri) {
    targetUri = uri;
  }
  /** ...and for myVar **/
  public void setMyVar(String var) {
    myVar = var;
  }

  /** this is the job-implementation **/
  @Override
  public void execute(JobExecutionContext context) throws JobExecutionException {
    /** start a transaction **/
    Transaction t = transactionService.getTransaction();
    transactionService.begin(t);

    /** load the resource **/
    KiWiUriResource r = resourceService.getUriResource(targetUri);

    /** ... do some magic here ... **/

    /** commit the transaction **/
    transactionService.commit(t);
  }
}

Schedule a Job

#!java
@Inject
private QuartzService quartzService;

private void scheduleMyJob() {
  /** (1) create the Job **/
  JobDetail job = JobBuilder.newJob(MyJob.class)
        /** unique identifier of this job (TestGroup.MyTestJob) **/
        .withIdentity("MyTestJob", "TestGroup")
        .withDescription("My first Test Job (a MyJob)")
        /** Provide some data **/
        .usingJobData("myVar", "Hello World")
        .build();

  /** (2) create a Schedule **/
  SimpleScheduleBuilder schedule = SimpleScheduleBuilder.repeatHourlyForever(3);
    /** also look at 
     - - CalendarIntervalScheduleBuilder,
     - - CronScheduleBuilder and
     - - DailyTimeIntervalScheduleBuilder
     **/

  /** (3) create a Trigger for MyTestJob **/
  Trigger trigger = TriggerBuilder.newTrigger()
        /** unique identifier of this trigger (TestGroup.MyTestTrigger) **/
        .withIdentity("MyTestTrigger", "TestGroup")
        .withDescription("every 3 hours, for one week")
        /** the job this trigger is for **/
        .forJob(job)
        /** provide some data, **/
        .usingJobData("targetUri", "http://example.com/resource/1234")
        /** ... and a schedule **/
        .withSchedule(schedule)
        .endAt(DateBuilder.futureDate(1, IntervalUnit.WEEK))
        .startNow()
        .build();

  /** (4) schedule trigger and job**/
  quartzService.scheduleJob(job, trigger);
}

Updated