由于项目需要做一个定时任务监控的功能,所以学习了一下Quartz的基本使用方法,以及对定时任务执行的使用方法,以下是详细的介绍
首先,创建一个PickNewsJob类实现Job接口
PickNewsJob.java
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class PickNewsJob implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("This is PickNewsJob`s execute method");
}
}
然后创建一个对Job的监听MonitorJobListener实现自JobListener
MonitorJobListener.java
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;
public class MonitorJobListener implements JobListener {
public static final String LISTENER_NAME = "JobListenerName";
@Override
public String getName() {
return LISTENER_NAME;
}
/**
* 定时任务开始执行
*/
@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...");
}
/**
* 执行被否决
*/
@Override
public void jobExecutionVetoed(JobExecutionContext context) {
System.out.println("jobExecutionVetoed");
}
/***
* 定时任务执行完毕
*/
@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 != null && !jobException.getMessage().equals("")) {
System.out.println("Exception thrown by: " + jobName
+ " Exception: " + jobException.getMessage());
}
}
}
再创建一个MainApp来测试监听是否有用
MainApp.java
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.JobListener;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.KeyMatcher;
public class MainApp {
public static void main(String[] args) throws SchedulerException {
//创建定时任务
JobDetail Job1 = JobBuilder.newJob(PickNewsJob.class)
.withIdentity("job1", "jgroup1").build();
//创建一个触发器,并将触发周期设置为1分钟
SimpleTrigger Trigger1 = TriggerBuilder
.newTrigger()
.withIdentity("trigger1","jgroup1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(1).repeatForever()).build();
//获取Scheduler工厂实例
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
JobListener myTriggerListener = new MonitorJobListener();
KeyMatcher<JobKey> tkeyMatcher2 = KeyMatcher.keyEquals(Job1.getKey());
//添加job的监听
scheduler.getListenerManager().addJobListener(myTriggerListener, tkeyMatcher2);
//添加定时任务
scheduler.scheduleJob(Job1, Trigger1);
//加载定时任务
scheduler.start();
}
}
最后在控制台输出的结果为:
jobToBeExecuted
Job : jgroup1.job1 is going to start…
This is PickNewsJob`s execute method
jobWasExecuted
Job : jgroup1.job1 is finished…
如果需要对触发器进行监控,只需要将稳中涉及到的JobListener的地方修改为TriggerListener,然后修改相应的内容即可。