我自己测试过的代码
<span style="white-space:pre"> </span> SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
// scheduler.getContext().put("java.sql.Connection",connection);
// //如果需要像Connection这种不能序列化的参数,可以通过这个传递
// 在job中Connection con =
// (Connection)jobExecutionContext.getScheduler().getContext().get("java.sql.Connection");
// 能序列化的东西使用JobDetail.getJobDataMap().put("orderId", orderId);就可以 了
sched.start();
// define the job and tie it to our HelloJob class
JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("myJob", "group1").build();
job.getJobDataMap().put("orderId", orderId);
Date start = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(start);
calendar.add(Calendar.DAY_OF_MONTH, 7);
// calendar.add(Calendar.SECOND, 5);
start = calendar.getTime();
// Trigger the job to run now, and then every 40 seconds
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()).startAt(start).build();
// Tell quartz to schedule the job using our trigger
sched.scheduleJob(job, trigger);
public class SimpleJob implements Job{
private static Logger logger = LoggerFactory.getLogger(SimpleJob.class);
/**
* @param paramJobExecutionContext
* @throws JobExecutionException
* @see org.quartz.Job#execute(org.quartz.JobExecutionContext)
*/
@Override
public void execute(JobExecutionContext paramJobExecutionContext) throws JobExecutionException{
String orderId = paramJobExecutionContext.getJobDetail().getJobDataMap().getString("orderId");
Order order = OrderService.service.findByOrderId(orderId);
order.set(Order.ORDER_STATUS, Constant.OrderStatus.FINISHED);
OrderService.service.updateOrderStatus(order);
logger.info("orderId= " + orderId + " is updated to finished");
}
}
1、开始时间 startAt
- SchedulerFactory sf = new StdSchedulerFactory();
- Scheduler sched = sf.getScheduler();
- Date runTime = DateBuilder.evenSecondDate(new Date());
- JobDetail job = JobBuilder.newJob(Job1.class).withIdentity("job1", "group1").build();
- Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1","group1")
- .startAt(runTime)
- .build();
- sched.scheduleJob(job, trigger);
- sched.start();
2、简单触发器 withSchedule
SimpleScheduleBuilder.simpleSchedule() 可以设置间隔、重复次数
- SchedulerFactory sf = new StdSchedulerFactory();
- Scheduler sched = sf.getScheduler();
- JobDetail job = JobBuilder.newJob(Job2.class).withIdentity("job2", "group2").build();
- Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger2","group2")
- .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
- .build();
- sched.scheduleJob(job, trigger);
- sched.start();
3、Cron触发器
CronScheduleBuilder.cronSchedule("0/5 * * * * ?") 使用Unix cron表达式
- SchedulerFactory sf = new StdSchedulerFactory();
- Scheduler sched = sf.getScheduler();
- JobDetail job = JobBuilder.newJob(Job3.class).withIdentity("job3", "group3").build();
- Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger3","group3")
- .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
- .build();
- sched.scheduleJob(job, trigger);
- sched.start();
4、结束时间 endAt
- SchedulerFactory sf = new StdSchedulerFactory();
- Scheduler sched = sf.getScheduler();
- Date runTime = DateBuilder.evenSecondDate(new Date());
- Date endTime = DateBuilder.evenMinuteDate(new Date());
- JobDetail job = JobBuilder.newJob(Job4.class).withIdentity("job4", "group4").build();
- Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger4","group4")
- .startAt(runTime)
- .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
- .endAt(endTime)
- .build();
- sched.scheduleJob(job, trigger);
- sched.start();
5、作业监听器 addJobListener
- JobKey jobKey = new JobKey("dummyJobName", "group5");
- JobDetail job = JobBuilder.newJob(Job5.class).withIdentity(jobKey).build();
- Trigger trigger = TriggerBuilder.newTrigger().withIdentity(
- "dummyTriggerName", "group5").withSchedule(
- CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();
- Scheduler scheduler = new StdSchedulerFactory().getScheduler();
- // Listener attached to jobKey
- scheduler.getListenerManager().addJobListener(new Job5Listener(),
- 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);
6、启动多个作业 scheduleJob
- JobKey jobKeyA = new JobKey("job6A", "group6");
- JobDetail jobA = JobBuilder.newJob(Job6A.class).withIdentity(jobKeyA).build();
- JobKey jobKeyB = new JobKey("job6B", "group6");
- JobDetail jobB = JobBuilder.newJob(Job6B.class).withIdentity(jobKeyB).build();
- JobKey jobKeyC = new JobKey("job6C", "group6");
- JobDetail jobC = JobBuilder.newJob(Job6C.class).withIdentity(jobKeyC).build();
- Trigger trigger1 = TriggerBuilder.newTrigger().withIdentity(
- "dummyTriggerName1", "group6").withSchedule(
- CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();
- Trigger trigger2 = TriggerBuilder.newTrigger().withIdentity(
- "dummyTriggerName2", "group6").withSchedule(
- CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();
- Trigger trigger3 = TriggerBuilder.newTrigger().withIdentity(
- "dummyTriggerName3", "group6").withSchedule(
- CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();
- Scheduler scheduler = new StdSchedulerFactory().getScheduler();
- scheduler.start();
- scheduler.scheduleJob(jobA, trigger1);
- scheduler.scheduleJob(jobB, trigger2);
- scheduler.scheduleJob(jobC, trigger3);
7、列举所有作业 getJobKeys
- Scheduler scheduler = new StdSchedulerFactory().getScheduler();
- for (String groupName : scheduler.getJobGroupNames()) {
- for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName))) {
- String jobName = jobKey.getName();
- String jobGroup = jobKey.getGroup();
- List<Trigger> triggers = (List<Trigger>) scheduler.getTriggersOfJob(jobKey);
- Date nextFireTime = triggers.get(0).getNextFireTime();
- System.out.println("[jobName] : " + jobName + " [groupName] : " + jobGroup + " - " + nextFireTime);
- }
- }
8、手动触发作业 triggerJob
- SchedulerFactory sf = new StdSchedulerFactory();
- Scheduler sched = sf.getScheduler();
- Date runTime = DateBuilder.evenSecondDate(new Date());
- JobDetail job = JobBuilder.newJob(Job8.class).withIdentity("job8", "group8").build();
- Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger8","group8")
- .startAt(runTime)
- .build();
- sched.scheduleJob(job, trigger);
- sched.start();
- sched.triggerJob(new JobKey("job8", "group8"));
- sched.triggerJob(new JobKey("job8", "group8"));
9、传递参数 usingJobData
- SchedulerFactory sf = new StdSchedulerFactory();
- Scheduler sched = sf.getScheduler();
- Date runTime = DateBuilder.evenSecondDate(new Date());
- JobDetail job = JobBuilder.newJob(Job9.class).withIdentity("job9", "group9")
- .usingJobData("jobSays", "Hello Quartz!")
- .build();
- Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger9","group9")
- .startAt(runTime)
- .build();
- sched.scheduleJob(job, trigger);
- sched.start();
10、取消/删除作业
- // removes the given trigger
- sched.unscheduleJob(new TriggerKey("job10", "group10"));
- // removes all triggers to the given job
- sched.deleteJob(new JobKey("job10", "group10"));
11、作业出错时自动再执行
一直执行到成功:
- JobExecutionException e2 = new JobExecutionException(e);
- // fire it again
- e2.setRefireImmediately(true);
- throw e2;
执行n次后停止:
- // allow 5 retries
- if (count >= 5) {
- JobExecutionException e = new JobExecutionException(
- "Retries exceeded");
- //make sure it doesn't run again
- e.setUnscheduleAllTriggers(true);
- throw e;
- }
JWatch - A Quartz Monitor
http://code.google.com/p/jwatch/
Cron 表达式生成器 CronMaker