簡體   English   中英

Spring多個調度方法無法並行工作

[英]Mutiple Spring scheduled methods not working parallely

我們有一個Spring Jobs項目,其中包含多個作業,可以通過將@Scheduled(cron =“ $ {cronexp}”)放在要調用的方法上方的方式來調用,如下所示

@Scheduled(cron="${cron1}")
public void  task1() {
//processing
}


@Scheduled(cron="${cron2}")
public void  task2() {
//processing
}.

現在我面臨的問題是,如果任務尚未完成,則task2不會開始處理。這是Spring Batch或某些配置設置的已知問題,以便所有調度的方法都能夠並行執行嗎?

@Scheduled依賴於在應用程序上下文中定義的任務執行器。 那里沒有魔術,@ @Scheduled會要求現有的TaskExecutor ,線程的分派方式將取決於此。

確實需要設置Spring將使用的任務執行程序,以使其適合您的需求。 簡而言之:

確保Spring正在使用的任務執行程序包含所需的最小線程數,在本示例中,使用舊的xml config,並發線程的最大數量為5。

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
  <property name="corePoolSize" value="5" />
  <property name="maxPoolSize" value="10" />
  <property name="queueCapacity" value="25" />
</bean>

作為另一種表示了解@EnableAsync ,您還可以在java config中使用@EnableAsync ,該注釋將使您能夠使用@ Scheduled,@ Async ...,並且可以很好地注冊一個TaskExecutor為您服務。

默認情況下,它將注冊一個SimpleAsyncTaskExecutor ,每次調用異步操作時,該SimpleAsyncTaskExecutor使用一個新線程,並且默認情況下,線程數量沒有限制 從性能的角度來看,在許多情況下這可能很不方便,因此作為池可能是解決這種情況的更好方法。

讓我使用適當的池為您附上Spring Javadoc中的建議配置:

@Configuration
 @EnableAsync
 public class AppConfig implements AsyncConfigurer {

     @Bean
     public MyAsyncBean asyncBean() {
         return new MyAsyncBean();
     }

     @Override
     public Executor getAsyncExecutor() {
         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
         executor.setCorePoolSize(7);
         executor.setMaxPoolSize(42);
         executor.setQueueCapacity(11);
         executor.setThreadNamePrefix("MyExecutor-");
         executor.initialize();
         return executor;
     }

     @Override
     public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
         return MyAsyncUncaughtExceptionHandler();
     }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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