【问题标题】:Spring 3.1 @Scheduled firing randomlySpring 3.1 @Scheduled 随机触发
【发布时间】:2014-01-04 01:43:36
【问题描述】:

我正在尝试使用注释 @Scheduled 和 cron 值执行方法。 该方法执行但不尊重 cron。

这是我的课:

@Component
public class Test {
    private static final Logger LOGGER = LoggerFactory.getLogger(Test.class);

    @Scheduled(cron = "*/10 * * * * *")
    public void run() {
        LOGGER.debug("run()");
    }
}

我的 applicationContext.xml 的一部分:

<task:executor id="myExecutor" pool-size="5"/>
<task:scheduler id="myScheduler" pool-size="10"/>
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<bean id="run" class="xxx.Test"></bean>

我在我的 xml 中使用 Spring 3.1 和 spring-task-3.1.xsd。

当我开始时,我应该每 10 秒有一条线,我得到这个:

12/16 15:51:20,033 [---] [DEBUG] [Test:31] - run() 
12/16 15:51:29,996 [---] [DEBUG] [Test:31] - run() 
12/16 15:54:09,657 [---] [DEBUG] [Test:31] - run() 
12/16 15:54:10,000 [---] [DEBUG] [Test:31] - run()
12/16 15:54:19,978 [---] [DEBUG] [Test:31] - run() 
12/16 15:54:34,664 [---] [DEBUG] [Test:31] - run() 
12/16 15:55:22,137 [---] [DEBUG] [Test:31] - run() 
12/16 15:55:34,656 [---] [DEBUG] [Test:31] - run()
12/16 15:55:39,988 [---] [DEBUG] [Test:31] - run() 
12/16 15:55:49,981 [---] [DEBUG] [Test:31] - run() 
12/16 15:59:07,278 [---] [DEBUG] [Test:31] - run() 

每次执行之间的延迟每次都在变化。我使用 FixedRate 或 FixedDelay 进行了测试,但得到了相同的结果。

所以正确找到了类,方法也是,但是它随机触发。

有人知道什么会导致这种行为吗?

我已经搜索了几个小时,但没有任何成功。将计划部分放入 xml 而不是 java 文件中不会改变任何内容,尝试使用属性文件来获取 cron 值。

【问题讨论】:

    标签: java spring cron


    【解决方案1】:

    你的cron 表达式

    @Scheduled(cron = "*/10 * * * * *")
    

    是说“每秒执行这个方法,可以被 10 整除”,换句话说,10、20、30 等等。这就是它看起来正在做的事情(+/- 调度程序的精度)

    12/16 15:54:09,657 [---] [DEBUG] [Test:31] - run() 
    12/16 15:54:10,000 [---] [DEBUG] [Test:31] - run()
    12/16 15:54:19,978 [---] [DEBUG] [Test:31] - run() 
    

    但有时会跳过或间隔很长

    12/16 15:54:19,978 [---] [DEBUG] [Test:31] - run() 
    12/16 15:54:34,664 [---] [DEBUG] [Test:31] - run() 
    12/16 15:55:22,137 [---] [DEBUG] [Test:31] - run() 
    12/16 15:55:34,656 [---] [DEBUG] [Test:31] - run()
    12/16 15:55:39,988 [---] [DEBUG] [Test:31] - run() 
    12/16 15:55:49,981 [---] [DEBUG] [Test:31] - run() 
    12/16 15:59:07,278 [---] [DEBUG] [Test:31] - run() 
    

    如果TaskScheduler 中的线程正忙于其他事情或由于某种原因被阻塞,则可能会发生这种情况。如果您想了解更多信息,则需要提供有关设置的更多详细信息。

    【讨论】:

    • 感谢您指出任务调度程序正忙的想法。我试图在另一台计算机上运行我的程序(我的个人计算机,第一台正在工作)并且它运行良好。我想在工作中安装的所有安全程序都会阻止我的程序正常运行。研究了两天这个问题,终于解决了!谢谢。
    猜你喜欢
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2018-08-15
    • 2014-07-17
    相关资源
    最近更新 更多