簡體   English   中英

為什么Spring Task Scheduler無法同時執行任務?

[英]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確保創建了后台任務執行程序。 沒有它,什么都無法安排。

要了解更多,您可以通過

  1. Spring 3 @Scheduled –安排任務的4種方法
  2. Spring Batch + Spring TaskScheduler示例
  3. 計划任務

啟用計划注釋

要啟用對@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM