任务执行并发

时间:2014-11-07 15:50:03

标签: java spring task job-scheduling

我有一个Web应用程序,配置为每3分钟执行一次作业。 因为没有必要更改我的库或添加我决定使用的任何人 spring本机执行任务执行器。 所以我用这种方式配置了我的xml文件:

<task:scheduled-tasks scheduler="taskScheduler">
    <task:scheduled ref="job" method="doJob" fixed-rate="#{jobConfig['fixedTime']}" />
</task:scheduled-tasks>

<task:scheduler id="taskScheduler" pool-size="1"/>

我省略了job bean定义和doJob方法代码'导致不必要。

问题:

由于doJob方法将在我的情况下每3分钟触发一次, SPRING如何处理这种情况doJob方法需要超过固定速率的时间才能执行??

示例:

  • 时间= 0
    • 触发了doJob
    • doJob需要4分钟才能完成,因为它会进行一些繁重的数据库操作
  • 时间= 3分钟
    • 应该触发doJob,但之前的执行尚未终止

spring如何处理这种行为? 将第二次执行排队或跳过并永远丢失,直到新的触发执行?

2 个答案:

答案 0 :(得分:0)

我不确定,但您可以使用fixed delay(需要毫秒),然后在doJob方法完成后等待3分钟。

答案 1 :(得分:0)

在fixedRate任务中,对于每次迭代,执行程序都会检查当前正在运行的线程数

  • 小于corePoolSize然后它会创建一个新线程,并以确切的fixedRate时间开始
  • 大于corePoolSize但小于最大池大小,然后它会创建一个新线程并从确切的fixedRate时间开始
  • 等于最大池大小,然后执行丢失

例如,如果您使用ThreadPoolTaskScheduler,则最大池大小设置为Integer.MAX_VALUE