gpt4 book ai didi

java - 我可以使用 Quartz Scheduler 在第 30 天每隔一个月触发一次,但如果月份没有第 30 天,则在最后一天触发?

转载 作者:搜寻专家 更新时间:2023-10-30 21:31:02 24 4
gpt4 key购买 nike

我可以使用Quartz Scheduler吗?使用以下设置创建计划的库?:

  • 2014 年 12 月 30 日开始
  • 每 30 天执行一次
  • 每 2 个月因此
  • 如果月份没有第 30 天,则应在月份的最后一天采取行动。

因此,最终的时间表将是:

  • 2014 年 12 月 30 日
  • 2015 年 28
  • 2015 年 4 月 30 日
  • ...等等

据我了解:

  1. CronTrigger不允许这样做(它可以设置为仅在特定月份触发,而不是间隔),
  2. CalendarIntervalTrigger将跳过没有第 30 天的月份(由以下代码创建触发器)

    try {
    SchedulerFactory schedulerFactory = new StdSchedulerFactory();
    Scheduler scheduler = schedulerFactory.getScheduler();
    scheduler.start();

    JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
    .withIdentity("HelloJob_CalendarIntervaled", "calendarIntervaled")
    .build();

    Calendar decemberThirty = Calendar.getInstance();
    decemberThirty.set(Calendar.YEAR, 2014);
    decemberThirty.set(Calendar.MONTH, Calendar.DECEMBER);
    decemberThirty.set(Calendar.DAY_OF_MONTH, 30);

    CalendarIntervalTrigger calendarIntervalTrigger = newTrigger()
    .withIdentity("calendarIntervalTrigger", "calendarIntervaled")
    .withSchedule(CalendarIntervalScheduleBuilder.calendarIntervalSchedule()
    .withIntervalInMonths(2))
    .startAt(decemberThirty.getTime())
    .forJob(jobDetail)
    .build();

    scheduler.scheduleJob(jobDetail, calendarIntervalTrigger);

    System.out.println(calendarIntervalTrigger.getNextFireTime());
    } catch (SchedulerException e) {
    e.printStackTrace();
    }

如果没有,是否有任何替代方案(它应该适用于 JBoss eap 6.2.0)?

最佳答案

您可以在 Quartz 中实现这一点,但您必须通过使用 CalendarIntervalTrigger 来触发计算何时应安排“真实”作业的作业来扭曲正常行为。

您安排一个触发器,在您的计划月份的每 1 个月触发一次:

[...]
JobDetail jobDetail = newJob(SchedulingCalculationJob.class)
.withIdentity("SchedulingCalculation_CalendarIntervaled", "calendarIntervaled")
.build();

CalendarIntervalTrigger calendarIntervalTrigger = newTrigger()
.withIdentity("calendarIntervalCalculationTrigger", "calendarIntervaled")
.withSchedule(calendarIntervalSchedule()
.withIntervalInMonths(2))
.startAt(decemberFirst.getTime())
.forJob(jobDetail)
.build();

scheduler.scheduleJob(jobDetail, calendarIntervalTrigger);

SchedulingCalculationJob 作业中,您计算​​“真实”作业调度日:

public class SchedulingCalculationJob implements Job {

public void execute(JobExecutionContext context)
throws JobExecutionException {

Calendar calendar = calculateJobFiringDate();

// Create and schedule a dedicated trigger
Trigger calculateFiring = calculateFiring = newTrigger()
.withSchedule(SimpleSchedulerBuilder.simpleScheduler())
.startAt(calendar.getTime())
.forJob(yourRealJobDetail)
.build();

scheduler.scheduleJob(yourRealJobDetail, calculateFiring);
}

public static Calendar calculateJobFiringDate() {
Calendar result = Calendar.getInstance();

// Set up the scheduling day
if (isThereThirtyDaysInCurrentMonth()) {
// the 30th of the current month
calendar.set(Calendar.DAY_OF_MONTH, 30);
} else {
// the last day of the current month
calendar.add(Calendar.MONTH, 1);
calendar.add(Calendar.DATE, -1);
}

// Set up time of day
calendar.set(Calendar.HOUR, ...);
calendar.set(Calendar.MINUTE, ...);
calendar.set(Calendar.SECOND, ...);

return result;
}

public static boolean isThereThirtyDaysInCurrentMonth() {
Calendar thirtydaysInCurrentMonthCalendar = Calendar.getInstance();

Integer currentMonth = thirtydaysInCurrentMonthCalendar.get(Calendar.MONTH);
thirtydaysInCurrentMonthCalendar.add(Calendar.DATE, 29);

return (currentMonth == thirtydaysInCurrentMonthCalendar.get(Calendar.MONTH);
}
}

它有点苏,但我已经在使用它并且工作正常。

关于java - 我可以使用 Quartz Scheduler 在第 30 天每隔一个月触发一次,但如果月份没有第 30 天,则在最后一天触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26018409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com