智能跳过节假日算法java_Quartz 定时任务使用 —— 排除指定节假日时间执行任务(十一)...

bc7fdfc03a181785f939cc7c3cabcadc.gif

不要混淆了 Quartz 的 Calendar 对象与 Java API 的 java.util.Calendar。它们是应用于不同目的不一样的组件。

Java 的 Calendar 对象是通用的日期和时间工具;许多过去由 Java 的 Date 类提供的功能现在加到了 Calendar 类中了。

Quartz 的 Calendar 专门用于屏闭一个时间区间,使 Trigger 在这个区间中不被触发。

Calendar 排除时间的粒度:

Calendar 接口方法参数的类型是 Long。这说明 Quartz Calendar 能够排除的时间细致毫秒级。你很可能永远都不需要这么细小的位度,因为大部分的 Job 只需要排除特别的日期或许会是小时。然而,假如你真需要排除到毫秒一级的,Calendar 能帮你做到

Quartz 自带的随时可用的 Calendar。

Quartz的BaseCalendar层次结构如下:

参考API:http://www.quartz-scheduler.org/api/2.2.1/index.html

bc7fdfc03a181785f939cc7c3cabcadc.gifCalendar 名称类用法

BaseCalendarorg.quartz.impl.calendar.BaseCalendar为高级的 Calendar 实现了基本的功能,实现了 org.quartz.Calendar 接口

AnnualCalendarorg.quartz.impl.calendar.AnnualCalendar排除年中一天或多天

CronCalendarorg.quartz.impl.calendar.CronCalendar日历的这种实现排除了由给定的CronExpression表达的时间集合。 例如,您可以使用此日历使用表达式“* * 0-7,18-23?* *”每天排除所有营业时间(上午8点至下午5点)。

如果CronTrigger具有给定的cron表达式并且与具有相同表达式的CronCalendar相关联,则日历将排除触发器包含的所有时间,并且它们将彼此抵消。

DailyCalendarorg.quartz.impl.calendar.DailyCalendar您可以使用此日历来排除营业时间(上午8点 - 5点)每天。 每个DailyCalendar仅允许指定单个时间范围,并且该时间范围可能不会跨越每日边界(即,您不能指定从上午8点至凌晨5点的时间范围)。 如果属性invertTimeRange为false(默认),则时间范围定义触发器不允许触发的时间范围。 如果invertTimeRange为true,则时间范围被反转 - 也就是排除在定义的时间范围之外的所有时间。

HolidayCalendarorg.quartz.impl.calendar.HolidayCalendar特别的用于从 Trigger 中排除节假日

MonthlyCalendarorg.quartz.impl.calendar.MonthlyCalendar排除月份中的指定数天,例如,可用于排除每月的最后一天

WeeklyCalendarorg.quartz.impl.calendar.WeeklyCalendar排除星期中的任意周几,例如,可用于排除周末,默认周六和周日

注意,所有的Calendar既可以是排除,也可以是包含,取决于:AnnualCalendar:指定每年的哪一天。使用方式如上例。精度是【天】

CronCalendar:指定Cron表达式。精度取决于Cron表达式,也就是最大精度可以【到秒】

DailyCalendar:指定每天的时间段(rangeStartingTime, rangeEndingTime),格式是HH:MM[:SS[:mmm]]。也就是最大精度可以【到毫秒】

HolidayCalendar:指定特定的日期,比如20140613。精度到【天】

MonthlyCalendar:指定每月的几号。可选值为1-31。精度是【天】

WeeklyCalendar:指定每星期的星期几,可选值比如为java.util.Calendar.SUNDAY。精度是【天】

使用 Quartz 的 Calendar源码示例

要使用 Quartz Calendar,你只需简单的实例化,并加入你要排除的日期,然后用 Scheduler 注册它。最后把这个 Calendar 实例与你想要使用该Calendar 的每一个 Trigger 实例关联起来

AnnualCalendar

示例:import org.quartz.*;

import org.quartz.impl.StdSchedulerFactory;

import org.quartz.impl.calendar.AnnualCalendar;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import java.util.GregorianCalendar;

import static org.quartz.DateBuilder.dateOf;

import static org.quartz.JobBuilder.newJob;

import static org.quartz.SimpleScheduleBuilder.simpleSchedule;

import static org.quartz.TriggerBuilder.newTrigger;

/**

* 此示例将演示如何使用日历来排除不应该进行调度的时间段。

*/

public class CalendarExample {

public static void main(String[] args) throws Exception {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.println("-------  初始化 ----------");

SchedulerFactory sf = new StdSchedulerFactory();

Scheduler sched = sf.getScheduler();

// 声明一个节假日 holidayCalendar,标明要排除的日期

// 法定节日是以每年为周期的,所以使用AnnualCalendar而不是HolidayCalendar

AnnualCalendar holidays = new AnnualCalendar();

Calend

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Quartz是一个开源的作业调度框架,可以用来调度Java应用程序中的任务。在Quartz中,任务是由一个Trigger和一个Job组成的。Trigger定义了任务何时执行,Job则定义了任务具体要做什么。在Quartz中,我们可以通过编写代码来创建Trigger和Job,并将它们注册到Scheduler中,Scheduler会按照Trigger定义的时间执行Job。 在Quartz中,时间的定义是通过Cron表达式来进行的。Cron表达式是一个字符串,包含6或7个字段,每个字段表示一个时间单位。下面是一个标准的Cron表达式的格式: ``` 秒 分 时 日 月 周 年(可选) ``` 其中,每个字段的含义如下: - 秒:0-59 - 分:0-59 - 时:0-23 - 日:1-31 - 月:1-12 - 周:0-6(0表示周日,1表示周一,以此类推) - 年:可选,表示指定的年份(例如2021) 下面是一个例子: ``` 0 0/5 8-18 * * ? // 每天8点到18点之间,每隔5分钟执行一次 ``` 这个表达式的意思是,在每天的8点到18点之间,每隔5分钟执行一次。 在Quartz中,我们可以通过Cron表达式来定义Trigger的执行时间。下面是一个例子: ```java // 创建一个Trigger,并设置执行时间为每天的8点到18点之间,每隔5分钟执行一次 Trigger trigger = TriggerBuilder.newTrigger() .withSchedule(CronScheduleBuilder.cronSchedule("0 0/5 8-18 * * ?")) .build(); ``` 这个例子中,我们通过CronScheduleBuilder来创建一个Cron表达式,并将其设置到Trigger中。然后,我们可以将这个Trigger注册到Scheduler中,Scheduler会按照Trigger定义的时间执行Job。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值