Springboot使用多線程并發(fā)執(zhí)行定時任務

Springboot使用多線程并發(fā)執(zhí)行定時任務

Spring Boot 使用Spring自帶的Schedule來實現(xiàn)定時任務變得非常簡單和方便。

  • 開啟緩存注解
@SpringBootApplication
@EnableScheduling //開啟定時任務
public class Application {
 
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  • 編寫定時任務
@Component
public class ScheduledTasks {
 
    private Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);
 
// cron接受cron表達式,根據(jù)cron表達式確定定時規(guī)則
   @Scheduled(cron="0/5 * * * * ? ")   //每5秒執(zhí)行一次 
    public void testCron() {
       DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        logger.info(sdf.format(new Date())+"*********每5秒執(zhí)行一次");
    }
}
  • 存在問題

后來發(fā)現(xiàn)個問題,通過同時測試幾個任務發(fā)現(xiàn),所有的任務都是在同一個線程池中的同一個線程來完成的。在實際開發(fā)過程中,我們當然不希望所有的任務都運行在一個線程中。

  • 解決方案

那么,怎么設計成多線程實現(xiàn)并發(fā)呢?在網(wǎng)上看到過這樣的解決方案。通過ScheduleConfig配置文件實現(xiàn)SchedulingConfigurer接口,并重寫setSchedulerfang方法,我們嘗試著配置了一下。

@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
    }
}
  • 其他
@Scheduled所支持的參數(shù):
1.cron:cron表達式,指定任務在特定時間執(zhí)行;
2.fixedDelay:表示上一次任務執(zhí)行完成后多久再次執(zhí)行,參數(shù)類型為long,單位ms;
3.fixedDelayString:與fixedDelay含義一樣,只是參數(shù)類型變?yōu)镾tring;
4.fixedRate:表示按一定的頻率執(zhí)行任務,參數(shù)類型為long,單位ms;
5.fixedRateString: 與fixedRate的含義一樣,只是將參數(shù)類型變?yōu)镾tring;
6.initialDelay:表示延遲多久再第一次執(zhí)行任務,參數(shù)類型為long,單位ms;
7.initialDelayString:與initialDelay的含義一樣,只是將參數(shù)類型變?yōu)镾tring;
8.zone:時區(qū),默認為當前時區(qū),一般沒有用到。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容