Quartz的使用之CronTrigger触发规则和实例多个独立的调度器
2016-08-01 15:22
489 查看
最近因为项目原因,研究了一些quartz的基础使用规则,今天跟大家分享一下:
首先是quartz的CronTrigger触发规则结合quartz中的calendar接口的使用,代码如下:
在使用Quartz定时调度服务时,我们经常会用到CronTrigger触发规则,定义一个精确的任务执行时间,至于CronTrigger的时间规则这里不再赘述,大家在网上搜搜,大把的是…我们除了定义一个精确的任务执行时间,还需要排除指定的日期,例如法定节假日等,这个时候我们可以使用Quartz为我们提供的calendar接口,Quartz提供了多种实现类来满足应用的需求:
Calendar名称 作用
WeeklyCalendar 用于排除星期中的一天或多天
MonthlyCalendar 用于排除月份中的数天
AnnualCalendar 用于排除年中的一天或多天
HolidayCalendar 用于排除节假日
上面的代码演示了AnnualCalendar 实现类如何整合到我们的CronTrigger触发规则内,其他的与之类似。
其次是如何在一个应用程序中建立多个独立的调度器,这些独立的调度器可以自主启动和关闭,不会受其他调度器的影响,请大家看如下的配置:
Default Properties file for use by StdSchedulerFactory
to create a Quartz Scheduler Instance, if a different
properties file is not explicitly specified.
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class =org.quartz.simpl.RAMJobStore
这是quartz的配置文件,其中org.quartz.scheduler.instanceName = DefaultQuartzScheduler是配置的系统帮我们生成的scheduler的对象,当我们在程序中 scheduler = sf.getScheduler();获取多个scheduler时,其实我们引用的是同一个对象,如果我们想要shutdown其中的某个scheduler时,其他的都会被shutdown!!!
怎么才能获取多个独立的scheduler呢????经过本人辛苦查找资料,终于找到一个非常实用的方法:
对于以上的A、B两句代码,不管你shutdown哪个,都不会影响另一个定时服务的正常运行。
首先是quartz的CronTrigger触发规则结合quartz中的calendar接口的使用,代码如下:
import java.text.ParseException; import java.util.Calendar; import java.util.GregorianCalendar; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory; import org.quartz.impl.calendar.AnnualCalendar; import cn.jbit.job.SimpleTriggerJob; public class Test{ public static void main(String[] args) { //创建调度器 SchedulerFactory sf = new StdSchedulerFactory(); Scheduler scheduler = null; CronTrigger cronTrigger=null; //定义一个精确的任务执行时间 try { scheduler = sf.getScheduler(); cronTrigger = new CronTrigger("dayTrigger",Scheduler.DEFAULT_GROUP, "0 0/1 * ? * 2-6"); } catch (ParseException e) { e.printStackTrace(); }catch (SchedulerException e) { e.printStackTrace(); } //AnnualCalendar用于排除年中的一天或多天 AnnualCalendar cal = new AnnualCalendar(); //这里除了需要定义一个精确的任务执行时间,还需要排除指定的日期 Calendar calendar = GregorianCalendar.getInstance(); calendar.set(Calendar.MONTH, Calendar.JULY); calendar.set(Calendar.DATE, 26); //实例化Calendar,并加入要排除的日期 cal.setDayExcluded(calendar, true); //用Scheduler注册Calendar try { scheduler.addCalendar("specialDay", cal, true, true); } catch (SchedulerException e) { e.printStackTrace(); } //将Calendar和对应的Trigger进行关联 cronTrigger.setCalendarName("specialDay"); //创建任务实例 JobDetail jobDetail = new JobDetail( "dayJob",Scheduler.DEFAULT_GROUP,Job.class); //注册任务和触发器 try { scheduler.scheduleJob(jobDetail, cronTrigger); //启动和关闭调度 scheduler.start(); scheduler.shutdown(); } catch (SchedulerException e) { e.printStackTrace(); } } }
在使用Quartz定时调度服务时,我们经常会用到CronTrigger触发规则,定义一个精确的任务执行时间,至于CronTrigger的时间规则这里不再赘述,大家在网上搜搜,大把的是…我们除了定义一个精确的任务执行时间,还需要排除指定的日期,例如法定节假日等,这个时候我们可以使用Quartz为我们提供的calendar接口,Quartz提供了多种实现类来满足应用的需求:
Calendar名称 作用
WeeklyCalendar 用于排除星期中的一天或多天
MonthlyCalendar 用于排除月份中的数天
AnnualCalendar 用于排除年中的一天或多天
HolidayCalendar 用于排除节假日
上面的代码演示了AnnualCalendar 实现类如何整合到我们的CronTrigger触发规则内,其他的与之类似。
其次是如何在一个应用程序中建立多个独立的调度器,这些独立的调度器可以自主启动和关闭,不会受其他调度器的影响,请大家看如下的配置:
Default Properties file for use by StdSchedulerFactory
to create a Quartz Scheduler Instance, if a different
properties file is not explicitly specified.
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class =org.quartz.simpl.RAMJobStore
这是quartz的配置文件,其中org.quartz.scheduler.instanceName = DefaultQuartzScheduler是配置的系统帮我们生成的scheduler的对象,当我们在程序中 scheduler = sf.getScheduler();获取多个scheduler时,其实我们引用的是同一个对象,如果我们想要shutdown其中的某个scheduler时,其他的都会被shutdown!!!
怎么才能获取多个独立的scheduler呢????经过本人辛苦查找资料,终于找到一个非常实用的方法:
import java.text.ParseException; import java.util.Properties; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleTrigger; import org.quartz.impl.StdSchedulerFactory; import cn.jbit.job.OneJob; import cn.jbit.job.TwoJob; public class Demo { public static void main(String[] args) { //创建调度器工厂对象,初始化quartz的配置文件 //获取一个新的非默认的org.quartz.scheduler.instanceName //Quartz支持配置文件初始化的 StdSchedulerFactory ssf=new StdSchedulerFactory(); Properties pro=new Properties(); pro.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); pro.put("org.quartz.scheduler.instanceName", "Scheduler"); pro.put("org.quartz.threadPool.threadCount", "10"); try { ssf.initialize(pro); } catch (SchedulerException e1) { e1.printStackTrace(); } //创建schedule工厂对象 SchedulerFactory sf=new StdSchedulerFactory(); //创建schedule对象 Scheduler scheduler =null; //crontriggr触发规则 CronTrigger ct=null; //simpletrigger触发规则 SimpleTrigger st=null; try { ct=new CronTrigger("dayTrigger2","group2", "0/10 * * ? * 2-6"); st=new SimpleTrigger("dayTrigger3","group3",2,5000); scheduler = sf.getScheduler(); updateSche=ssf.getScheduler(); System.out.println(updateSche.getSchedulerName()); } catch (SchedulerException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } JobDetail jobDetail2=new JobDetail("dayjob2","group2",OneJob.class); JobDetail jobDetail3=new JobDetail("dayjob3","group3",TwoJob.class); try { scheduler.scheduleJob(jobDetail2, ct); updateSche.scheduleJob(jobDetail3,st); //启动和关闭调度 scheduler.start(); updateSche.start(); //(A)scheduler.shutdown(true); //(B)updateSche.shutdown(true); } catch (SchedulerException e) { e.printStackTrace(); } } }
对于以上的A、B两句代码,不管你shutdown哪个,都不会影响另一个定时服务的正常运行。
相关文章推荐
- CronTrigger表达式和Quartz使用实例入门
- CronTrigger表达式和Quartz使用实例入门
- quartz使用cron表达式的实例
- 《pro Spring》学习笔记之Quartz的cronTrigger使用
- Quartz_2_简单编程式任务调度使用(CronTrigger)
- Quartz的简单使用,基于1.X(一)【入门及CronTrigger】
- Quartz中CronTrigger(Cron 触发器)使用的 Cron表达式
- 【Java】Quartz CronTrigger触发时间最完整配置说明
- 关于Java Web 使用Spring中使用Quartz(定时调用、实现固定时间执行), 触发定时器(执行某些任务)的实例
- Quartz 2.x 任务调度使用(CronTrigger)
- Quartz CronTrigger最完整触发时间配置说明
- Quartz中CronTrigger(Cron 触发器)使用的 Cron表达式
- Quartz CronTrigger配置及使用
- Quartz CronTrigger最完整配置说明
- Quartz CronTrigger最完整配置说明
- quartz中触发时刻cronExpression的配置说明
- grails中Quartz CronTrigger最完整配置说明(ZT)
- Quartz.net配置文件实例及cron表达式详解
- Quartz CronTrigger最完整配置说明
- spring 定时器 表达式 org.springframework.scheduling.quartz.CronTriggerBean