[英]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.