Quartz 任务调度四种触发方式

2022-08-06 00:00:00 调度 触发 四种

需要架包quartz-2.2.1.jar

Class类:创建任务

import java.util.Calendar;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyJob implements Job {

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		System.out.println("任务正在执行,执行时间: " + Calendar.getInstance().getTime());  
	}

}
在Job接口实现类里面,添加需要的逻辑到execute()方法中。配置好Job实现类并设定好调度时间表,Quartz就会自动在设定的时间调度作业执行execute()。

测试代码

package quartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.CalendarIntervalScheduleBuilder;
import org.quartz.CalendarIntervalTrigger;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.DailyTimeIntervalScheduleBuilder;
import org.quartz.DailyTimeIntervalTrigger;
import org.quartz.DateBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzTest {

	public static void main(String[] args) {
		 try {  
			 
			 
			 //获取一个调度工厂
			 SchedulerFactory schedFact = new StdSchedulerFactory(); 
			 //  从工厂里面拿到一个sched实例
		        Scheduler sched = schedFact.getScheduler();
		        // 真正执行的任务并不是Job接口的实例,而是用反射的方式实例化的一个JobDetail实例  
		        JobDetail job = JobBuilder.newJob(MyJob.class)
		        		// 根据name和默认的group(即"DEFAULT_GROUP")创建trigger的key
		        		.withIdentity("job1", "group1")
		        		//创建触发器
		        		.build();
			 	
		        //SimpleTrigger-简单触发器
		        Date startTime = DateBuilder.nextGivenSecondDate(new Date( ),15);  // 在当前时间15秒后运行
		        // 创建一个SimpleTrigger实例,指定该Trigger在Scheduler中所属组及名称。
		        // 接着设置调度的时间规则.当前时间15秒后运行,每10秒运行一次,共运行15次
//		        SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
//		                .startAt(startTime).withSchedule(SimpleScheduleBuilder.simpleSchedule()
//		                        .withIntervalInSeconds(10)
//		                        .withRepeatCount(15)
//		                ).build();
			 
			 	//CronTriger-Cron触发器
//		        // 每两秒执行
		        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(
		                CronScheduleBuilder.cronSchedule("/2 * * * * ?")
		        ).build();
		        
			 	//日期触发
//		        // 每一分钟执行
//		        DailyTimeIntervalTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(
//		                DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule().withInterval(1, DateBuilder.IntervalUnit.MINUTE)
//		        ).build();
		        
		        //日历触发
		        // 每两秒执行
//		        CalendarIntervalTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").withSchedule(
//		                CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withInterval(2, DateBuilder.IntervalUnit.SECOND)
//		        ).build();
		        
		        sched.scheduleJob(job, trigger);
		        // 调度启动
		        sched.start();
		        
//		        Thread.sleep(2000);//不加这一句,会在sched触发时即shutdown,而不是job执行完shutdown
//		        sched.shutdown(true); //
	        } catch (Exception e) {  
	        	e.printStackTrace();
	        }  
	}
}

使用CronTrigger主要的是要掌握Cron表达式。Cron表达式包含6个必要组件和一个可选组件

例:/2 * * * * ?  每两秒执行一次

第1位: 秒(0~59)  字符表达(, -  *  /)
第2位: 分(0~59) 字符表达(, -  *  /)
第3位: 小时(0~24) 字符表达(, -  *  /)
第4位: 日期(1~31) 字符表达(, -  *  /  ?  L  W  C)
第5位: 月(JAN~DEC或1~12) 字符表达(, -  *  /)
第6位: 星期(SUN~SAT或1~7) 字符表达(, -  *  /  ?  L  C  #)
第7位: 年(可选,1970~2099),若为空,表示全部时间范围  字符表达(, -  *  /)


字符表达说明如下:
*:通配符,任意值

?:无特定值。通常和其他指定的值一起使用,表示必须显示该值但不能检查

-:范围。e.g.小时部分10-12表示10:00,11:00, 12:00

,:列分隔符。可以让你指定一系列的值。e.g.在星期域中指定MON、TUE和WED

/:增量。表示一个值的增量,e.g.分钟域中0/1表示从0开始,每次增加1min

L:表示Last。它在日期和星期域中表示有所不同。在日期域中,表示这个月的最后一天,而在星期域中,它永远是7(星期六)。当你希望使用星期中某一天时,L字符非常有用。e.g.星期域中6L表示每一个月的最后一个星期五

W:在本月内离当天最近的工作日触发,所谓的最近工作日,即当天到工作日的前后最短距离,如果当天即为工作日,则距离是0;所谓本月内指的是不能跨月取到最近工作日,即使前/后月份的最后一天/第一天确实满足最近工作日。e.g. LW表示本月的最后一个工作日触发,W强烈依赖月份。

#:表示该月的第几个星期,e.g. 1#2表示每一个月的第一个星期一

C:日历值。日期值是根据一个给定的日历计算出来的。在日期域中给定一个20C将在20日(日历包括20日)或20日后日历中包含的第一天(不包括20日)激活触发器。例如在一个星期域中使用6C表示日历中星期五(日历包括星期五)或者第一天(日历不包括星期五)
表达式列举:
"30 * * * * ?" 每半分钟触发任务
"30 10 * * * ?" 每小时的10分30秒触发任务
"30 10 1 * * ?" 每天1点10分30秒触发任务
"30 10 1 20 * ?" 每月20号1点10分30秒触发任务
"30 10 1 20 10 ? *" 每年10月20号1点10分30秒触发任务
"30 10 1 20 10 ? 2011" 2011年10月20号1点10分30秒触发任务
"30 10 1 ? 10 * 2011" 2011年10月每天1点10分30秒触发任务
"30 10 1 ? 10 SUN 2011" 2011年10月每周日1点10分30秒触发任务
"15,30,45 * * * * ?" 每15秒,30秒,45秒时触发任务
"15-45 * * * * ?" 15到45秒内,每秒都触发任务
"15/5 * * * * ?" 每分钟的每15秒开始触发,每隔5秒触发一次
"15-30/5 * * * * ?" 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
"0 0/3 * * * ?" 每小时的第0分0秒开始,每三分钟触发一次
"0 15 10 ? * MON-FRI" 星期一到星期五的10点15分0秒触发任务
"0 15 10 L * ?" 每个月最后一天的10点15分0秒触发任务
"0 15 10 LW * ?" 每个月最后一个工作日的10点15分0秒触发任务
"0 15 10 ? * 5L" 每个月最后一个星期四的10点15分0秒触发任务
"0 15 10 ? * 5#3" 每个月第三周的星期四的10点15分0秒触发任务

    原文作者:helentang1987
    原文地址: https://blog.csdn.net/wanwei1987/article/details/80648293
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章