![](/img/trans.png)
[英]Methods with @Scheduled annotation not working in Spring Boot app
[英]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.