java - Spring Task Executor 在上一个任务完成之前不会触发

标签 java spring scheduled-tasks task spring-annotations

我在一个带有@Scheduled 注释的类中有一个方法

@Scheduled(cron = "* * * * * *")
public void doSomething() {

}

这应该每秒执行一次(假设 cron 语句是正确的)。

我将 sping 配置设置为

<task:scheduler id="taskScheduler" pool-size="2" />
<task:executor id="taskExecutor" pool-size="2" />
<task:annotation-driven executor="taskExecutor" scheduler="taskScheduler" />

问题是在最后一次执行完成之前,该方法不会再次触发。我期待看到它触发两次(并可能开始在某处填满作业队列)。

我怎样才能消除方法调用之间的依赖性,但仍然确保一次只有 2 个进程在运行。

最佳答案

似乎一个想法是将实际工作传递给 taskExecutor

@Scheduled(cron = "* * * * * *")
 public void doSomething() {
   this.executor.execute(new Runnable() {...}
 }

然后将拒绝策略添加为 *CALLER_RUNS*

<task:scheduler id="taskScheduler" pool-size="1" />
<task:executor id="taskExecutor" pool-size="1"
    queue-capacity="1" rejection-policy="CALLER_RUNS" />
<task:annotation-driven executor="taskExecutor"
    scheduler="taskScheduler" />

因此,上述工作始终由一个线程池完成。

不确定这是否是您的最佳方式。

关于java - Spring Task Executor 在上一个任务完成之前不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15028548/

相关文章:

spring - Spring Boot 2.0.1 中未提供执行器/refresh

java.io.IOException : Cannot run program "set": CreateProcess error=2, 系统找不到指定的文件

java - NoClassDefFoundError : scala/math/Ordering with spring-kafka-test 2. 5.7

java - 您可以覆盖 log.properties 中特定日志的格式化程序吗

Java Spring @Scheduled 任务执行两次

c# - 推荐一个C#任务调度库

python - 在本地使用 django celery beat 我得到错误 'PeriodicTask' object has no attribute '_default_manager'

java - 如何安排java程序在Windows中每天运行?

java - 制作一个列表并将其初始化以包含枚举的所有值

java - 用于匹配以变量结尾的文本的 xpath 表达式