Search

Sunday, May 21, 2017

Quartz 2.x JobListener Example

In this tutorial, we will show you how to create a JobListener, to keep track the running jobs status, like when the job is finished.


1. Quartz Job

Job, print a simple message, and throw a JobExecutionException for testing.
File : HelloJob.java
package com.javakernel.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job
{
 public void execute(JobExecutionContext context)
 throws JobExecutionException {

  System.out.println("Hello Quartz! 123");

  //Throw exception for testing
  throw new JobExecutionException("Testing Exception");
 }

}

2. JobListener

To create a JobListener, just implements the JobListener interface, and override all the interface’s methods. 
File : HelloJobListener.java
package com.javakernel.quartz.listener;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;

public class HelloJobListener implements JobListener {

 public static final String LISTENER_NAME = "dummyJobListenerName";

 @Override
 public String getName() {
  return LISTENER_NAME; //must return a name
 }

 // Run this if job is about to be executed.
 @Override
 public void jobToBeExecuted(JobExecutionContext context) {

  String jobName = context.getJobDetail().getKey().toString();
  System.out.println("jobToBeExecuted");
  System.out.println("Job : " + jobName + " is going to start...");

 }

 // No idea when will run this?
 @Override
 public void jobExecutionVetoed(JobExecutionContext context) {
  System.out.println("jobExecutionVetoed");
 }

 //Run this after job has been executed
 @Override
 public void jobWasExecuted(JobExecutionContext context,
   JobExecutionException jobException) {
  System.out.println("jobWasExecuted");

  String jobName = context.getJobDetail().getKey().toString();
  System.out.println("Job : " + jobName + " is finished...");

  if (!jobException.getMessage().equals("")) {
   System.out.println("Exception thrown by: " + jobName
    + " Exception: " + jobException.getMessage());
  }

 }

}
Note
No idea what is “jobExecutionVetoed” and when will it triggered? Do comment if you know this, thanks.

3. CronTrigger

Example to attach above HelloJobListener to scheduler, and monitor the job’s states.
File : CronTriggerExample.java
package com.javakernel.quartz;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.KeyMatcher;

import com.javakernel.quartz.listener.HelloJobListener;

public class CronTriggerExample {
    public static void main( String[] args ) throws Exception
    {

 JobKey jobKey = new JobKey("dummyJobName", "group1");
     JobDetail job = JobBuilder.newJob(HelloJob.class)
  .withIdentity(jobKey).build();

     Trigger trigger = TriggerBuilder
  .newTrigger()
  .withIdentity("dummyTriggerName", "group1")
  .withSchedule(
   CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
  .build();

     Scheduler scheduler = new StdSchedulerFactory().getScheduler();

     //Listener attached to jobKey
     scheduler.getListenerManager().addJobListener(
      new HelloJobListener(), KeyMatcher.keyEquals(jobKey)
     );

     //Listener attached to group named "group 1" only.
     //scheduler.getListenerManager().addJobListener(
     // new HelloJobListener(), GroupMatcher.jobGroupEquals("group1")
     //);

     scheduler.start();
     scheduler.scheduleJob(job, trigger);

    }
}
Run CronTriggerExample.java, here’s the output.
jobToBeExecuted
Job : group1.dummyJobName is going to start...
Hello Quartz! 123
jobWasExecuted
Job : group1.dummyJobName is started and finished...
Exception thrown by: group1.dummyJobName Exception: Testing Exception

jobToBeExecuted
Job : group1.dummyJobName is going to start...
Hello Quartz! 123
jobWasExecuted
Job : group1.dummyJobName is started and finished...
Exception thrown by: group1.dummyJobName Exception: Testing Exception

No comments:

Post a Comment

Featured Post

ClassNotFoundException vs. NoClassDefFoundError

This is a very common question in Java interviews. Here we will learn to distinguish between two similar, but different problems that ca...