春天的cron vs普通的cron?

Pau*_*aul 33 java cron spring

我正在尝试在遗留的Java/Spring/Hibernate项目中使用cron作业,所以我决定使用spring调度程序.

我希望myTask.doStuff在每个月的第一个星期日的12:00运行.

在我的application-context.xml中,我已经将我的任务调度程序配置为:

<task:scheduled-tasks scheduler="MyTaskScheduler">
    <task:scheduled ref="myTask" method="doStuff" cron="0 0 12 ? 1/1 SUN#1 *"/> <!-- Every first Sundy of the month -->
</task:scheduled-tasks>

<task:scheduler id="MyTaskScheduler" pool-size="10"/>
Run Code Online (Sandbox Code Playgroud)

问题cron表达本身是:0 0 12?1/1 SUN#1*

并且myTask是一个bean,它有一个调用的方法doStuff,从单元测试运行时可以正常工作.

当我构建和部署时,我从spring获得了一个bootime异常:

Caused by: java.lang.IllegalArgumentException: cron expression must consist of 6 fields (found 7 in 0 0 12 ? 1/1 SUN#1 *)
at org.springframework.scheduling.support.CronSequenceGenerator.parse(CronSequenceGenerator.java:233)
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 org.springframework.scheduling.config.ScheduledTaskRegistrar.afterPropertiesSet(ScheduledTaskRegistrar.java:129)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
Run Code Online (Sandbox Code Playgroud)

鉴于我第一次使用cron表达式,我的第一个假设是我做错了,但我使用cronmaker进行了双重检查,它给了我相同的结果.

所有文档都说:cron表达式是由六个或七个子表达式(字段)组成的字符串.1

尽管如此,我试图敲掉第7个元素(年份)因为它不在任何示例中,并且得到了不同的错误消息:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.scheduling.config.ScheduledTaskRegistrar#0': Invocation of init method failed; nested exception is java.lang.NumberFormatException: For input string: "0#1"
Run Code Online (Sandbox Code Playgroud)

... org.springframework.scheduling是否支持其他所有类型的cron风格?特定于Spring的文档只是说'cron expressions'.

如何在此上下文中使此cron表达式按预期工作?任何帮助都将不胜感激.

目前,我的解决方案是简化这个表达式,以便每个星期日运行,并预先安排一些Java逻辑来计算它当月的哪个星期日,并查看它是否有效 - 但这样做会破坏配置方法的目的和看起来像一个反模式.

Dez*_*bos 60

Spring计划任务的格式与cron表达式的格式不同.

它们不遵循与UNIX cron表达式相同的格式.

只有6个字段:秒,分钟,小时,星期几,月,星期.星号(*)表示匹配任何.*/X表示"每X"(见例子).一周的数字日对我不起作用.此外,"MON-FRI"更容易阅读.以下是一些示例表达式:

"0 0 18**MON-FRI"表示每个工作日下午6:00.

"0 0*/1***"表示每小时一小时.

"0 0*/8***"表示每小时8小时.

"0 0 12 1**"表示每月第一天中午12:00.

您可以在此处找到一些其他信息:http: //docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html

您也可以找到有用的spring文档:https: //docs.spring.io/spring-framework/docs/current/spring-framework-reference/integration.html#scheduling

  • 还有一个差异 - 在春天,'day'和'day-of-week'字段由AND逻辑组合,但在cron中它是OR (4认同)
  • 你们知道是否可以将cron表达式转换为spring格式? (2认同)

Ng *_*ong 10

请注意以下几点https//www.baeldung.com/cron-expressions

Spring Scheduled任务是这样的:

1 2 3 4 5 6 Index
- - - - - -
* * * * * * command to be executed
- - - - - -
| | | | | | 
| | | | | ------- Day of week (MON - SUN)
| | | | --------- Month (1 - 12)
| | | ----------- Day of month (1 - 31)
| |-------------- Hour (0 - 23)
| --------------- Minute (0 - 59)
----------------- Seconds (0 - 59)
Run Code Online (Sandbox Code Playgroud)

来自:https : //www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/

Linux Cron作业如下:

1 2 3 4 5 Index
- - - - -
* * * * * command to be executed
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)
Run Code Online (Sandbox Code Playgroud)

边注:

  • 一些文章说可能有7个可选参数,这是year,我尝试使用最新的spring并且显示错误,所以我认为它不起作用。
  • 如果您的Linux cron作业表达式很简单,似乎可以在前面一个0,它将转换为spring计划的任务表达式
    • 例如每5分钟
      • */5 * * * * Linux cron工作
      • 0 */5 * * * * 春季计划任务

奖励:Spring Schedule Cron Generator

  1. 点击 Show code snippet
  2. 点击 Run Code snippet
  3. 玩得开心!

1 2 3 4 5 6 Index
- - - - - -
* * * * * * command to be executed
- - - - - -
| | | | | | 
| | | | | ------- Day of week (MON - SUN)
| | | | --------- Month (1 - 12)
| | | ----------- Day of month (1 - 31)
| |-------------- Hour (0 - 23)
| --------------- Minute (0 - 59)
----------------- Seconds (0 - 59)
Run Code Online (Sandbox Code Playgroud)
1 2 3 4 5 Index
- - - - -
* * * * * command to be executed
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)
Run Code Online (Sandbox Code Playgroud)
$('.select2').select2({
  width: '100%'
});

//// Init ////////////
$dropdown = $("#secondsSelect");
for (let i = 1; i < 60; i++) {
  $dropdown.append($("<option />").val(i).text(i));
}
$dropdown = $("#minSelect");
for (let i = 1; i < 60; i++) {
  $dropdown.append($("<option />").val(i).text(i));
}
$dropdown = $("#hoursSelect");
for (let i = 1; i < 24; i++) {
  $dropdown.append($("<option />").val(i).text(i));
}
$dropdown = $("#dayOfMonthSelect");
for (let i = 1; i < 32; i++) {
  $dropdown.append($("<option />").val(i).text(i));
}
//// Init End ////////////


$('.select2').on('select2:select', function(e) {
  let value = e.params.data.id;
  let prevValue = $(this).val().length > 0 ? $(this).val()[0] : null;

  if (value != parseInt(value)) {
    $(this).val(value).change();
  } else if (prevValue != parseInt(prevValue)) {
    $(this).val(value).change();
  }
  calculateSpringCron();
});

let r = function(dropdown) {
  return dropdown.val().join(",");

}

let calculateSpringCron = function() {

  let result = [
    r($("#secondsSelect")),
    r($("#minSelect")),
    r($("#hoursSelect")),
    r($("#dayOfMonthSelect")),
    r($("#monthsSelect")),
    r($("#weekdaySelect")),
  ];

  $("#result").val(result.join(" "));

  $("#result-expand").html(result.join(" &nbsp; &nbsp;"))

}

calculateSpringCron();
Run Code Online (Sandbox Code Playgroud)