CronSequenceGenerator的解决方法一个月的最后一天?

好了,这是我要安排的任务在每月的最后一天上午10:10运行。我的cron表达式是

0 10 10 L * ?

现在的问题是CronSequenceGenerator向’L’值抛出NumberFormatException,这意味着Spring的CronSequenceGenerator不支持这种表达式,如何以任何其他方式(解决方法)来实现,我不想使用石英或做Spring的将在新版本中对此提供支持。

这是完整的堆栈跟踪:

Exception in thread "main" java.lang.NumberFormatException: For input string: "L"

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

at java.lang.Integer.parseInt(Integer.java:492)

at java.lang.Integer.valueOf(Integer.java:582)

at org.springframework.scheduling.support.CronSequenceGenerator.getRange(CronSequenceGenerator.java:324)

at org.springframework.scheduling.support.CronSequenceGenerator.setNumberHits(CronSequenceGenerator.java:297)

at org.springframework.scheduling.support.CronSequenceGenerator.setDays(CronSequenceGenerator.java:275)

at org.springframework.scheduling.support.CronSequenceGenerator.setDaysOfMonth(CronSequenceGenerator.java:266)

at org.springframework.scheduling.support.CronSequenceGenerator.parse(CronSequenceGenerator.java:239)

at org.springframework.scheduling.support.CronSequenceGenerator.<init>(CronSequenceGenerator.java:81)

at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:54)

at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:44)

at com.hcdc.coedp.datantar.scheduler.SchedulerUtil.start(SchedulerUtil.java:75)

at com.hcdc.coedp.datantar.scheduler.SchedulerUtil.changeTrigger(SchedulerUtil.java:106)

at com.hcdc.coedp.datantar.scheduler.SchedulingService.scheduleTransfer(SchedulingService.java:70)

at com.hcdc.coedp.datantar.scheduler.Scheduler.schedule(Scheduler.java:107)

at main.Main.main(Main.java:47)

更新:

以下是我的调度方法

 /**

* Schedule a task {@link Task} with a specified cron expression.

* @param task {@link Task}

* @param cronExpression cron expression to be applied must be a vaild one.

* @param taskName

* @return

*/

public String start(Task task, String cronExpression, String taskName) {

CronTrigger trigger = new CronTrigger(cronExpression);//line 2

CronSequenceGenerator generator = new CronSequenceGenerator(cronExpression, TimeZone.getTimeZone("GMT+5:30"));

List<Date> dateList = new ArrayList<>(5);

Date currentDate = new Date();

for (int i = 0; i < 5; i++) {

currentDate = generator.next(currentDate);

dateList.add((currentDate));

System.out.println("Next Exceution times are" + currentDate);

}

ScheduledFuture sf = tps.schedule(task, trigger);

//TODO Save this scheduled future with a specific task name.

ContextHolder.schduledFutureMap.put(taskName, sf);

return cronExpression;

}

在第2行,当我传递指定的cron表达式时,它引发NumberFormatException。

回答:

此功能不是标准cron表达式语法。因此,Spring可能永远不会实现它。看代码,我看不到任何

外科 解决方案的扩展CronSequenceGenerator。那么,为什么不使用Quartz却是一个特殊功能呢?

根据您的确切需求,您可以实现自己的Trigger。就像是:

import java.util.Date;

import org.joda.time.LocalDate;

import org.joda.time.LocalTime;

import org.springframework.scheduling.Trigger;

import org.springframework.scheduling.TriggerContext;

public class LastDayOfMonthTrigger implements Trigger {

private final LocalTime time;

public LastDayOfMonthTrigger(LocalTime time) {

this.time = time;

}

@Override

public Date nextExecutionTime(TriggerContext ctx) {

Date last = ctx.lastScheduledExecutionTime();

LocalDate date = last == null ? new LocalDate() : new LocalDate(last).plusDays(1);

LocalDate lastDay = date.dayOfMonth().withMaximumValue();

return lastDay.toDateTime(time).toDate();

}

}

以上是 CronSequenceGenerator的解决方法一个月的最后一天? 的全部内容, 来源链接: utcz.com/qa/432363.html

回到顶部