您的位置:首页 > 其它

Quartz的使用之CronTrigger触发规则和实例多个独立的调度器

2016-08-01 15:22 489 查看
最近因为项目原因,研究了一些quartz的基础使用规则,今天跟大家分享一下:

首先是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哪个,都不会影响另一个定时服务的正常运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  scheduler crontrigge