为什么这种cron模式每37秒不匹配/运行一次?

时间:2018-09-19 13:40:07

标签: spring cron spring-scheduled

我有一个具有此属性的Spring应用程序:

cobra.tarifas.intervaloEntreCobrancas =*/37 * * * * *

这是它的使用位置:

@Scheduled(cron = "${cobra.tarifas.intervaloEntreCobrancas}")
public void cobraTarifaDMaisZero() {

    int number = new Random().nextInt();

    System.out.println("started " + number + " at " + LocalTime.now().withNano(0));
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("finished " + number + " at " + LocalTime.now().withNano(0));
}

因此,每次运行时,我都会有一条日志,指出启动和结束的时间以及“唯一”标识符(Spring在@Scheduled类中使用相同的实例,而没有额外的配置,this.toString每次都返回相同的字符串)。每次执行需要5秒才能完成。

我认为cron表达式的意思是“每隔37秒运行一次”,但事实并非如此。

使用* * * * * *我得到了:

started -1615036471 at 10:18:46
finished -1615036471 at 10:18:51
started 2090620070 at 10:18:52
finished 2090620070 at 10:18:57
started -349207943 at 10:18:58
finished -349207943 at 10:19:03

这很有意义:在上一个执行完成后,开始执行新的执行需要1秒钟,而在完成之前总是需要5秒钟。但是当我使用*/37 * * * * *时,我得到了

started -644623959 at 10:54
finished -644623959 at 10:54:05
started 212117957 at 10:54:37
finished 212117957 at 10:54:42
started 1788724609 at 10:55
finished 1788724609 at 10:55:05
started 362510867 at 10:55:37
finished 362510867 at 10:55:42
started -25103618 at 10:56
finished -25103618 at 10:56:05
started -820939074 at 10:56:37
finished -820939074 at 10:56:42

为什么只在00和37秒开始播放?我想实现与Spring @fixedDelay类似的行为,但是可以灵活地在某些属性文件中进行更改(@fixedDelay仅接受常量)。

1 个答案:

答案 0 :(得分:2)

我不认为您只能使用cron来执行此操作,例如37。

最简单的选择是选择一个可以除以60的增量。 基本上,偶数等于(或小于)30。

例如所以10、15、20或30。

对于10,您的表情将是:

cobra.tarifas.intervaloEntreCobrancas =0,10,20,30,40,50 * * * * *

否则,您每分钟只能走一次。

0 * * * * *