[英]why spring task scheduler not executing task simultaneously?
我有以下配置来运行任务-
<bean id="trendDataJob" class="com.ge.og.realtrack.scheduler.TrendDataJob"> </bean>
<task:scheduled-tasks>
<task:scheduled ref="trendDataJob" method="trendJob" cron="#{trendDataJob.configMap['corn_exp']}"></task:scheduled>
<task:scheduled ref="trendDataJob" method="metaDataTrendJob" cron="#{trendDataJob.configMap['metadata_corn_exp']}"></task:scheduled>
</task:scheduled-tasks>
为此的cron表达式是corn_exp=0 0/1 * * * ?
每分钟运行一次。
这是一个问题,因为两种趋势数据作业时间表都必须每分钟运行一次,但是它们在一个第一个TrendJob完成之后又一个接一个地执行,然后执行的metaDataTrendJob我却无法理解这种行为。
另外一个问题是方法要花费一分钟以上才能完成完成。在当前调用完成并返回之前,它不会触发下一个调用。
默认情况下,调度程序使用具有单个线程的ConcurrentTaskScheduler
。 如果要另一个配置它,并将其传递给scheduled-tasks
scheduler
属性。
在XML中,最简单的方法是使用scheduler
元素。 (请参阅参考指南中的本节 )。
<task:scheduler id="scheduler" pool-size="10"/>
然后只需将其注册到另一个元素上即可。
<task:scheduled-tasks scheduler="scheduler"> ...
您是否在Java代码中使用了@EnableScheduling
?
@EnableScheduling
确保创建了后台任务执行程序。 没有它,什么都无法安排。
要了解更多,您可以通过
要启用对@Scheduled
和@Async
批注的支持,请将@EnableScheduling
和@EnableAsync
添加到您的@Configuration
类之一:
@Configuration
@EnableAsync
@EnableScheduling
public class AppConfig {
}
您可以自由选择适合您的应用程序的相关注释。 例如,如果只需要对@Scheduled
支持,则只需省略@EnableAsync
。 为了获得更细粒度的控制,您可以另外实现SchedulingConfigurer和/或AsyncConfigurer接口。 有关完整的详细信息,请参见javadocs。
如果您更喜欢XML配置,请使用<task:annotation-driven>
元素。
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor id="myExecutor" pool-size="5"/>
<task:scheduler id="myScheduler" pool-size="10"/>
请注意,使用上述XML时,提供了执行程序引用来处理与带有@Async批注的方法相对应的那些任务,并且提供了调度程序引用来管理以@Scheduled注释的那些方法。
如果您在春季使用默认任务计划程序,则可以确定它只能在单个线程上运行,因此为什么不能使它们并行运行。
您需要配置某种具有池大小的BatchScheduler,以使其并行运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.