Quartz入门例子简介 从入门到菜鸟(三)

本文深入探讨了Quartz框架中的CronTrigger机制,通过Cron表达式实现精确的定时任务调度,包括如何创建CronTrigger,其语法结构以及常见的时间表达式。详细介绍了Cron表达式的各个组成部分和特殊符号的用法,以及如何将Cron表达式应用于定时任务中,以实现灵活多样的执行时间控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面两个博客讲的都是简单触发器,直接传入一个时间让任务执行,这一话讲CronTrigger的例子。

CronTrigger也是Quartz最重要的特色之一,通过Quartz特有的Cron表达式来确定某类时间,能完成类似"每个月二十号XXX,每个星期三XXX"之类的任务。

先对MyJob做个小的修改,时间用中文来输出,不然看起来太费劲,逻辑上没有任何修改。

public class MyJob implements Job {
	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		String jobName = context.getJobDetail().getKey().getName();
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
		System.out.println("任务Key:" + jobName + " 正在执行,执行时间: " + dateFormat.format(Calendar.getInstance().getTime()));
	}
}


接下来创建QuartzCronTest.java,这里采用了CronTrigger作为触发器,注意NOTICE注释下面的代码:

public class QuartzCronTest {

	public static void main(String[] args) throws Throwable {
		SchedulerFactory factory = new StdSchedulerFactory();
		Scheduler scheduler = factory.getScheduler();

		JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();
		// @NOTICE
		// 与SimpleTrigger对比:类不同了,现在的是Trigger的子类CronTrigger;withSchedule中的参数变为CronScheduleBuilder了
		// CronScheduleBuilder可以通过类似"0/13 * * * * ?"这种表达式来创建定时任务
		// 当前这个表达式的定义是每个秒是13的倍数,或者是0的时候,都触发任务
		CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")
				.withSchedule(CronScheduleBuilder.cronSchedule("0/13 * * * * ?")).build();

		scheduler.scheduleJob(job, trigger);

		scheduler.start();
		try {
			// 等待60秒查看效果
			Thread.sleep(60L * 1000L);
		} catch (Exception e) {
		}
		scheduler.shutdown(true);
	}
}
/*
--------------------------------------
	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分每分触发
	0 0/5 14 * * ?			每天下午的 2点到2点59分(整点开始,每隔5分触发)
	0 0/5 14,18 * * ?		每天下午的 2点到2点59分(整点开始,每隔5分触发) 每天下午的 18点到18点59分(整点开始,每隔5分触发)
	0 0-5 14 * * ?			每天下午的 2点到2点05分每分触发
	0 10,44 14 ? 3 WED		3月分每周三下午的 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			每月的第三周的星期五开始触发
	0 0 12 1/5 * ?			每月的第一个中午开始每隔5天触发一次
	0 11 11 11 11 ?			每年的11月11号 11点11分触发(光棍节)
--------------------------------------
 */


其实使用起来很简单,把Trigger的传入“升级”为CronTrigger就可以了,通过CronScheduleBuilder把"0 0 12 * * ?"这样的Cron表达式传入CronTrigger当中,任务就可以在指定的时间自动执行啦。

下面着重介绍一下Cron表达式,个人认为上面列出来的足够使用了,如果有进阶需求的话,需要先对Cron表达式中的结构和符号有一定了解:

Quartz Cron 表达式支持到七个域
名称是否必须允许值特殊字符
0-59, - * /
0-59, - * /
0-23, - * /
1-31, - * ? / L W
1-12 或 JAN-DEC, - * /
1-7 或 SUN-SAT, - * ? / L #
空 或 1970-2099, - * /


首先,结构,以这个为例
引用
0 11 11 11 11 ? 每年的11月11号 11点11分触发(光棍节)


可以看到基本结构是   秒_分_小时_日_月_[周]_[年] 后面的周和年是可选的

其次,通配符,主要的有星号(*);问号(?);减号(-);逗号(,);斜杠(/);L字母;W字母;井号(#).

  • 星号:表示任意时刻
  • 问号:只能在日或周字段上使用,http://blog.youkuaiyun.com/chh_jiang/article/details/4603529 这里有比较清晰的解释,简单的理解就是日期和星期是有冲突的,指定其中一个的话,另外一个是没办法指定的,比如每个月12号和每个星期二,这两个是"互斥"的,不能用日期和周来指定所有“每个是星期二的12号”这个时间。
  • 减号:范围,如 1-5秒
  • 逗号:列表,如 1,5,10 秒
  • 斜杠:等步长序列,如3/13秒 表示 3,16,29,42,55,3,16...
  • L:仅在日和周上支持,表示允许的最后一个值,注意不要让范围和列表与L连用
  • W:工作日
  • 井号:为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。


井号和L W用的比较少,其实简单实用的话,根据那些注释中的去改就够了~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值