是否可以安排使用Spring @Scheduled注释的作业每小时运行一次,但每次都是在随机时间运行?

问题描述 投票:0回答:1

我想每小时运行我的任务/方法..但每次都是随机分钟。我已经尝试过Spring @Scheduled to be started every day at a random minute between 4:00AM and 4:30AM,但是这个解决方案是设置随机初始值但是在使用相同的分钟之后。

我想实现这样的工作运行的情况。例如:

8:10 9:41 10:12 ...

java spring random schedule
1个回答
2
投票

是的,所以......这不是一个时间表。这是一个非确定性事件。

预定事件是可重复的事物,可以在特定时间持续触发。有一个顺序和可预测性与此相辅相成。

通过让某个工作在给定的时间启动但不一定在给定的时间启动,您将失去可预测性,这是@Scheduled注释将强制实施的(不一定是通过实现,而是作为副作用;注释可能只包含编译时常量并且在运行期间无法动态更改)。

至于解决方案,Thread.sleep是脆弱的,将导致你的整个应用程序睡眠一段时间,这不是你想要做的。相反,you could wrap your critical code in a non-blocking thread并安排相反。

警告:下面未经测试的代码

@Scheduled(cron = "0 0 * * * ?")
public void executeStrangely() {
    // Based on the schedule above,
    // all schedule finalization should happen at minute 0.
    // If the pool tries to execute at minute 0, there *might* be
    // a race condition with the actual thread running this block.
    // We do *not* include minute 0 for this reason.
    Random random = new Random();
    final int actualMinuteOfExecution = 1 + random.nextInt(59);
    final ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);

    exec.schedule(() -> {
        // Critical code here
    }, actualMinuteOfExecution, TimeUnit.MINUTES);
}

我将以线程安全的方式管理资源的努力作为读者的练习。

© www.soinside.com 2019 - 2024. All rights reserved.