定時器又叫定時任務、計划任務,在項目開發中使用比較普遍,它能夠定時執行規定的任務,例如:訂單到期處理、會員到期處理、數據報表生成等
Springboot內置的定時任務 默認是單線程,使用非常方便,使用時要在Application中設置啟用定時任務功能@EnableScheduling,代碼如下:
1.啟用定時任務功能
@SpringBootApplication @EnableScheduling @MapperScan("main.blog.mapper") public class BootApplication { public static void main(String[] args) { SpringApplication.run(BootApplication.class, args); } }
2.使用@Scheduled注解執行定時任務
使用 @Scheduled來創建定時任務 這個注解用來標注一個定時任務方法。
通過看 @Scheduled源碼可以看出它支持多種參數:
(1).cron:cron表達式,指定任務在特定時間執行;
(2).fixedDelay:表示上一次任務執行完成后多久再次執行,參數類型為long,單位ms;
(3).fixedDelayString:與fixedDelay含義一樣,只是參數類型變為String;
(4).fixedRate:表示按一定的頻率執行任務,參數類型為long,單位ms;
(5).fixedRateString: 與fixedRate的含義一樣,只是將參數類型變為String;
(6).initialDelay:表示延遲多久再第一次執行任務,參數類型為long,單位ms;
(7).initialDelayString:與initialDelay的含義一樣,只是將參數類型變為String;
(8).zone:時區,默認為當前時區,一般沒有用到。
單線程定時任務的使用,代碼如下:
package com.blog.controller; import java.text.SimpleDateFormat; import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Controller; @Controller("Task") public class TaskController { private static final Logger logger = LoggerFactory.getLogger(TaskController.class); private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy:mm:dd HH:mm:ss"); /** * 方法一:cron方式,項目啟動后每5秒執行一次 * * @auther huxiaoguang * @return void */ @Scheduled(cron = "0/5 * * * * ?") public void cronTask() { logger.info("Cron方式-定時任務執行時間:"+ dateFormat.format(new Date())); } /** * 方法二:fixedRate方式,上一次的開始時間與下一次的開始時間為基點,項目啟動時會執行一次,然后每5秒執行一次 * * @auther huxiaoguang * @return void */ @Scheduled(fixedRate = 5000) public void fixedRateTask() { logger.info("fixedRate方式-定時任務執行時間:"+ dateFormat.format(new Date())); } /** * 方法二:fixedRate方式,項目啟動時2秒后會執行一次,然后每5秒執行一次 * * @auther huxiaoguang * @return void */ @Scheduled(initialDelay = 2000,fixedRate = 5000) public void fixedRateInitialDelayTask() { logger.info("initialDelay方式-定時任務執行時間:"+ dateFormat.format(new Date())); } /** * 方法三:fixedDelay方式,上一次的結束時間與下一次的開始時間為基點,項目啟動時會執行一次,然后每5秒執行一次 * * @auther huxiaoguang * @return void */ @Scheduled(fixedDelay = 5000) public void fixedDelayTask() { logger.info("fixedDelay方式-定時任務執行時間:"+ dateFormat.format(new Date())); } /** * 方法三:fixedDelay方式,項目啟動時2秒后會執行一次,然后每5秒執行一次 * * @auther huxiaoguang * @return void */ @Scheduled(initialDelay = 2000, fixedDelay = 5000) public void initialDelayFixedDelayTask() { logger.info("initialDelay方式-定時任務執行時間:"+ dateFormat.format(new Date())); } }
3.多線程定時任務的使用
在config下新增配置文件SchedulerConfig.java ,配置自定義線程池,代碼如下:
@Configuration @EnableScheduling //開啟定時器 public class SchedulerConfig implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { //多線程配置 scheduledTaskRegistrar.setScheduler(taskExecutor()); } @Bean public Executor taskExecutor() { return Executors.newScheduledThreadPool(100); } }
然后再用@Scheduled執行任務時,就已經是多線程任務啦。