package com.lxq.quartz.test;
import java.util.Date;
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.SimpleTrigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.AnnualCalendar;
public class TestQuartz
{
public static void main(String[] args) throws SchedulerException
{
TestQuartz testQuartz=new TestQuartz();
testQuartz.test3();
}
public void test1()
{
//通过SchedulerFactory来获取一个调度器
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler;
try
{
scheduler = schedulerFactory.getScheduler();
//引进作业程序public JobDetail(String jobName, String jobGroupName, Class jobClass){}
JobDetail jobDetail = new JobDetail("jobDetail-j1", "jobGroup-g1", BaseJob.class);
/*new一个触发器public SimpleTrigger(String triggerName, String triggerGroupName){}
在构造Trigger实例时,可以考虑使用org.quartz.TriggerUtils工具类,该工具类不但提供了众多获取特定时间的方法,还拥有众多获取常见Trigger的方法,
如makeSecondlyTrigger(String trigName)方法将创建一个每秒执行一次的Trigger,而makeWeeklyTrigger(String trigName, int dayOfWeek, int hour, int minute)
将创建一个每星期某一特定时间点执行一次的Trigger。而getEvenMinuteDate(Date date)方法将返回某一时间点一分钟以后的时间。*/
SimpleTrigger Trigger = new SimpleTrigger("Trigger", "triggerGroup-tg1");
//设置作业启动时间,马上启动
long ctime = System.currentTimeMillis();
Trigger.setStartTime(new Date(ctime));
//设置作业执行间隔
Trigger.setRepeatInterval(1000);
//设置作业执行次数
Trigger.setRepeatCount(10);
//设置作业执行优先级默认为5
Trigger.setPriority(10);
//作业和触发器注册到调度器中,并建立Trigger和JobDetail的关联
scheduler.scheduleJob(jobDetail, Trigger);
/*上面的一句话,也可以换成下面的这几句话
* JobDetail jobDetail = new JobDetail("job1_1","jGroup1", SimpleJob.class);
SimpleTrigger Trigger = new SimpleTrigger("trigger1_1","tgroup1");
Trigger.setJobGroup("jGroup1");:指定关联的Job组名
Trigger.setJobName("job1_1");指定关联的Job名称
scheduler.addJob(jobDetail, true);注册JobDetail
scheduler.scheduleJob(Trigger);注册指定了关联JobDetail的Trigger*/
//启动调度器
scheduler.start();
}
catch (SchedulerException e)
{
e.printStackTrace();
}
}
public void test2()
{
try
{
//通过SchedulerFactory来获取一个调度器
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();
JobDetail jobDetail = new JobDetail("jobDetail-j2", "jobGroup-g1", BaseJob.class);
jobDetail.getJobDataMap().put("type", "JobDetail");
jobDetail.getJobDataMap().put("index", 1002);
/*public CronTrigger(){}
public CronTrigger(String name, String group){}
public CronTrigger(String name, String group, String cronExpression){}*/
CronTrigger trigger = new CronTrigger("cronTrigger", "triggerGroup-tg2");
/*CronTrigger 能够提供比 SimpleTrigger 更有具体实际意义的调度方案,调度规则基于 Cron 表达式,CronTrigger
支持日历相关的重复时间间隔(比如每月第一个周一执行),而不是简单的周期时间间隔。*/
trigger.getJobDataMap().put("type", "trigger");
trigger.getJobDataMap().put("index", 2002);
/* 每半分钟执行一次 */
trigger.setCronExpression("30 * * * * ?");
sched.scheduleJob(jobDetail, trigger);
sched.start();
}
catch (Exception e)
{
e.printStackTrace();
}
}
/*在实际任务调度中,我们不可能一成不变地按照某个周期性的调度规则运行任务,必须考虑到实现生活中日历上特定日期,就象习惯了大男人作风的人在2月14号也会有不同表现一样。*/
public void test3() throws SchedulerException
{
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
/*法定节日是以每年为周期的,所以使用AnnualCalendar*/
AnnualCalendar holidays = new AnnualCalendar();
/*五一劳动节*/
GregorianCalendar laborDay = new GregorianCalendar();
laborDay.add(GregorianCalendar.MONTH,5);
laborDay.add(GregorianCalendar.DATE,1);
holidays.setDayExcluded(laborDay, true); //排除的日期,如果设置为false则为包含
/*国庆节*/
GregorianCalendar nationalDay = new GregorianCalendar();
nationalDay.add(GregorianCalendar.MONTH,10);
nationalDay.add(GregorianCalendar.DATE,1);
holidays.setDayExcluded(nationalDay, true);//排除该日期
/*Scheduler#addCalendar(String calName, Calendar calendar, boolean replace, boolean updateTriggers)
进行注册,如果updateTriggers为true,Scheduler中已引用Calendar的Trigger将得到更新*/
scheduler.addCalendar("holidays", holidays, false, false);//向Scheduler注册日历
Date runDate = TriggerUtils.getDateOf(0,0, 10, 1, 7);//7月1号 上午10点
JobDetail job = new JobDetail("job1", "group1", BaseJob.class);
SimpleTrigger trigger = new SimpleTrigger("trigger1", "group1",runDate,null,SimpleTrigger.REPEAT_INDEFINITELY,60L * 60L * 1000L);
trigger.setCalendarName("holidays");//让Trigger应用指定的日历规则
scheduler.scheduleJob(job, trigger);
scheduler.start();
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-44264-5.html
全世界国家的主政府是美国说了算