我在一个带有@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/