首页 > 解决方案 > Spring @Scheduled fixedDelay 未按预期工作

问题描述

我有 2 个异步运行的作业,一个触发 everymin,另一个触发固定延迟。

@Scheduled(fixedDelay=30000)
    public void runJob() {
        try {
        JobParameters jobParameters = new JobParametersBuilder().addLong("time",System.currentTimeMillis()).toJobParameters();

        JobExecution execution=jobLauncher.run(job,jobParameters);
        LOGGER.info(execution.getExitStatus());}
        catch (Exception e) {
            try {
                throw new SystemException("Scheduler ERROR :: Error coocured during Job run "+e);
            } catch (SystemException e1) {
                LOGGER.error("Scheduler ERROR :: Error coocured during Job run "+e);
            }
        }
    }

    @Scheduled(cron = "0 0/1 * * * ?")
    public void runJob2() {
        try {
        JobParameters jobParameters = new JobParametersBuilder().addLong("time",System.currentTimeMillis()).toJobParameters();
        JobExecution execution=jobLauncher.run(job2,jobParameters);
         LOGGER.info(execution.getExitStatus());}
        catch (Exception e) {
            try {
                throw new SystemException("ERROR:: Exception occured"+e);
            } catch (SystemException e1) {
                LOGGER.error("ERROR:: JOB Launching exception happened"+e);
            }
        }
    }

正如fixedDelay所说“上一次执行结束和下一次执行开始之间的持续时间是固定的”,但对我来说,它的触发在上一次和下一次执行开始之间有一个固定的延迟。

2018-05-11 **12:48:00.016**  INFO 2112 --- [ taskExecutor-5] o.s.b.c.l.support.SimpleJobLauncher      : Job: [FlowJob: [name=systemStartJob]] launched with the following parameters: [{time=1526023080016}]
2018-05-11 12:48:00.016  INFO 2112 --- [ taskExecutor-5] org.sapient.t1automation.SystemListener  : Intercepting system Job Execution - Before Job!
2018-05-11 12:48:00.017  INFO 2112 --- [ taskExecutor-5] o.s.batch.core.job.SimpleStepHandler     : Executing step: [systemStartStep]
.
.
.
.
2018-05-11 **12:48:24.721**  INFO 2112 --- [ taskExecutor-6] o.s.b.c.l.support.SimpleJobLauncher      : Job: [FlowJob: [name=sendMailJob]] launched with the following parameters: [{time=1526023104706}]
2018-05-11 12:48:24.737  INFO 2112 --- [ taskExecutor-6] org.sapient.t1automation.MailListener    : Intercepting Job Excution - Before Job!
2018-05-11 12:48:24.737  INFO 2112 --- [ taskExecutor-6] o.s.batch.core.job.SimpleStepHandler     : Executing step: [sendMailStep1]
.
.
.
2018-05-11 12:48:44.533  INFO 2112 --- [ taskExecutor-6] org.sapient.t1automation.MailListener    : Intercepting Job Excution - After Job!
2018-05-11 12:48:44.533  INFO 2112 --- [ taskExecutor-6] o.s.b.c.l.support.SimpleJobLauncher      : Job: [FlowJob: [name=sendMailJob]] completed with the following parameters: [{time=1526023104706}] and the following status: [COMPLETED]
2018-05-11 12:48:45.001  INFO 2112 --- [ taskExecutor-3] o.s.t.service.mail.MailReader            : Mail:: Mails to process. 1
2018-05-11 12:48:45.017  INFO 2112 --- [ taskExecutor-3] org.sapient.t1automation.MailListener    : Intercepting Job Excution - After Job!
2018-05-11 12:48:45.017  INFO 2112 --- [ taskExecutor-3] o.s.b.c.l.support.SimpleJobLauncher      : Job: [FlowJob: [name=sendMailJob]] completed with the following parameters: [{time=1526023044672}] and the following status: [COMPLETED]

这里 2 次执行开始之间的时间是 30 秒,而不是最后一次执行结束和下一次执行开始之间的时间。

标签: springspring-batch

解决方案


检查代码的执行时间。您的代码可能会在一秒钟内执行,因此您看不到时间差。

示例:

@Scheduled(fixedDelay = 3000)
private void test() {

    System.out.println("test -> " + new Date());

    try {
        Thread.sleep(2000);
    }
    catch (Exception e) {
        System.out.println("error");
    }
}

输出

test -> Fri May 11 13:45:35 IST 2018
test -> Fri May 11 13:45:40 IST 2018
test -> Fri May 11 13:45:45 IST 2018
test -> Fri May 11 13:45:51 IST 2018
test -> Fri May 11 13:45:56 IST 2018

在这里您可以看到,每次打印之间的差异是 5 秒而不是 3 秒。

对于调试,您可以在代码的开头和结尾添加日志。此外, Thread.sleep() 用于延迟。


推荐阅读