Quartz Scheduler定时调度初体验

什么是Quartz

  1. Quartz是一个完全由java编写的开源作业调度框架。Quartz是功能强大的开源作业调度库,几乎可以集成到任何Java应用程序中-从最小的独立应用程序到最大的电子商务系统。Quartz可用于创建简单或复杂的计划,以执行数以万计,数以万计的工作。任务定义为标准Java组件的作业,它们实际上可以执行您可以对其执行的任何编程操作。Quartz Scheduler包含许多企业级功能,例如对JTA事务和集群的支持。

Quartz相对于Timer的优势

  1. Timer定时器没有持久化机制。
  2. Timer定时器的日程管理不够灵活(只能设置开始时间、重复的间隔,设置特定的日期、时间等)
  3. Timer定时器没有使用线程池(每个Java定时器使用一个线程)
  4. Timer定时器没有切实的管理方案,你不得不自己完成存储、组织、恢复任务的措施

Quartz及相关依赖

  Quartz jar包:https://repo1.maven.org/maven2/org/quartz-scheduler/quartz/2.3.0/quartz-2.3.0.jar
  Quartz-jobs :https://repo1.maven.org/maven2/org/quartz-scheduler/quartz-jobs/2.3.0/quartz-jobs-2.3.0.jar

Quartz的简单实现

	import org.quartz.JobDetail;
	import org.quartz.Scheduler;
	import org.quartz.SchedulerException;
	import org.quartz.Trigger;
	import org.quartz.impl.StdSchedulerFactory;
	import static org.quartz.JobBuilder.*;
	import static org.quartz.TriggerBuilder.*;
	import static org.quartz.SimpleScheduleBuilder.*;
	
	public class QuartzTest {
	
	    public static void main(String[] args) {
	
	        try {
	            // Grab the Scheduler instance from the Factory
	            /**
	             * 一旦使用获取了调度程序StdSchedulerFactory.getDefaultScheduler(),
	             * 您的应用程序将不会终止,直到您调用为止scheduler.shutdown(),因为将有活动线程。
	             */
	            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
	
	            // and start it off
	            scheduler.start();
	
	            //定义作业并将其绑定到我们的HelloJob类
	            JobDetail job = newJob(HelloJob.class)
	                    .withIdentity("job1", "group1")
	                    .build();
	
	            // 触发作业以立即运行,然后每40秒重复一次
	            /*Trigger trigger = newTrigger()
	                    .withIdentity("trigger1", "group1")
	                    .startNow()
	                    .withSchedule(simpleSchedule()
	                            .withIntervalInSeconds(40)
	                            .repeatForever())
	                    .build();*/
	            //使用是Cron表达式 执行定时任务,24h制,17:27执行   --- 0 27 17 * * ?  
	            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0 27 17 * * ?");
	            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
	                    .withSchedule(scheduleBuilder).build();
	
	            // 告诉scheduler使用我们的触发器
	            scheduler.scheduleJob(job, trigger);
	            Thread.sleep(60000);//线程休眠60s,期间程序不会自动停止
	            scheduler.shutdown(); 
	
	        } catch (SchedulerException | InterruptedException se) {
	            se.printStackTrace();
	        }
	    }
	}

	import org.quartz.Job;
	import org.quartz.JobExecutionContext;
	import org.quartz.JobExecutionException;
	
	public class HelloJob implements Job {
	
	    @Override
	    public void execute(JobExecutionContext context) throws JobExecutionException {
	        System.out.println("具体定时业务实现");
	    }
	}

Tip:一旦使用获取了调度程序StdSchedulerFactory.getDefaultScheduler(),因为有活动线程的存在,应用程序将不会终止,直到调用scheduler.shutdown()为止。

定时任务中的Cron表达式

Cron表达式在线生成地址 :http://cron.qqe2.com/

字段 允许值 允许的特殊字符 秒
0-59 , - * / 分
0-59 , - * / 小时
0-23 , - * / 日期
1-31 , - * ? / L W C 月份
1-12 或者 JAN-DEC , - * / 星期
1-7 或者 SUN-SAT , - * ? / L C # 年(可选) 留空, 1970-2099 , - * /
“0 0 12 * * ?” 每天中午12点触发
“0 15 10 ? * *” 每天上午10:15触发
“0 15 10 * * ?” 每天上午10:15触发
“0 15 10 * * ? *” 每天上午10:15触发
“0 15 10 * * ? 2005” 2005年的每天上午10:15触发
“0 * 14 * * ?” 在每天下午2点到下午2:59期间的每1分钟触发
“0 0/5 14 * * ?” 在每天下午2点到下午2:55期间的每5分钟触发
“0 0/5 14,18 * * ?” 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
“0 0-5 14 * * ?” 在每天下午2点到下午2:05期间的每1分钟触发
“0 10,44 14 ? 3 WED” 每年三月的星期三的下午2:10和2:44触发
“0 15 10 ? * MON-FRI” 周一至周五的上午10:15触发
“0 15 10 15 * ?” 每月15日上午10:15触发
“0 15 10 L * ?” 每月最后一日的上午10:15触发
“0 15 10 ? * 6L” 每月的最后一个星期五上午10:15触发
“0 15 10 ? * 6L 2002-2005” 2002年至2005年的每月的最后一个星期五上午10:15触发
“0 15 10 ? * 6#3” 每月的第三个星期五上午10:15触发

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章