spring的@Scheduled定時任務,同一時間段的定時任務只會執行一個,其余的會被阻塞,@Scheduled注解定時任務並發執行解決辦法,即多線程運行定時任務


原文:https://blog.csdn.net/qq_35937303/article/details/88851064

 

現有兩個定時任務

@Component("aa")
public class aa {
    @Scheduled(cron = "0 44 17 * * ?")
    public void bb() {
        try {
            System.out.println("aa執行時間:" + new Date());
            Thread.sleep(65000);
            System.out.println("aa完成時間:" + new Date());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
 
@Component("bb")
public class bb {
    @Scheduled(cron = "0 55 17 * * ?")
    public void aa() {
        try {
            System.out.println("bb執行時間:" + new Date());
            Thread.sleep(10000);
            System.out.println("bb完成時間:" + new Date());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
} 

默認的在啟動項加入@EnableScheduling注解就可以運行了

最終,執行的結果令人大跌眼鏡。

aa的任務由於執行時間需要65秒,超過了bb任務執行的時間,結果bb任務執行的時間被阻塞掉,延遲了5秒執行。

解決方法是在啟動項類中加入如下配置即可

@Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(50);
        return taskScheduler;
    } 

 

如果是xml

<!-- 注解式 -->

<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor id="myExecutor" pool-size="5"/>
<task:scheduler id="myScheduler" pool-size="10"/>
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM