來源於 https://baijiahao.baidu.com/s?id=1643116834093455970&wfr=spider&for=pc
每晚10點,捕獲技術思考和創業資源洞察
當你想要放棄的那一刻,想想當初為什么堅持走到了這里
文|洪生鵬
客戶有個需求,需要定時同步銷售人員資料,剛開始打算用mysql定時任務實現,發現效果不太理想,於是選擇用spring boot 中的定時創建任務來實現。關於SpringBoot創建定時任務很簡單,一般有4種,下面我們一起來了解下:
Timer:這是java自帶的java.util.Timer類,這個類允許我們調度一個java.util.TimerTask任務。可以讓我們的程序按照某一個頻度執行,不足之處是不能在指定時間運行。一般用的比較少。ScheduledExecutorService:也是jdk自帶的類;是基於線程池設計的定時任務類,每個調度任務都會分配到線程池中的一個線程去執行,任務是並發執行,互不影響。Spring Task:是Spring3.0以后自帶的task,可以將它看成一個輕量級的Quartz。Quartz:這是一個功能比較強大的的調度器,可以讓我們的程序在指定時間執行,也可以按照某一個頻度執行,只不過配置起來稍微有點復雜。Timer
public class TaskTimer {public static void main(String[] args) {TimerTask timerTask = new TimerTask() { @Override public void run() {System.out.println("任務啟動"+ new Date()); } }; Timer timer = new Timer(); //每10秒執行一次 timer.schedule(timerTask,10,10000); } }
對於ScheduledExecutorService和Spring Task不多談。哪個配置比較麻煩,我們就來嘗試哪種,重點來看一下Quartz實現定時任務。
Quartz
第一,我們在pom文件中添加依賴,如果SpringBoot版本是2.0.0以后的,則在spring-boot-starter中已經包含了quart的依賴,則可以直接使用spring-boot-starter-quartz依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>
要是1.5.9則要使用以下添加依賴:
<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId> <version>2.3.0</version></dependency> <dependency><groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency>
接下來,我們創建任務類TestQuartz,主要繼承了QuartzJobBean
public class TestQuartz extends QuartzJobBean {/** * 執行定時任務 * * @param jobExecutionContext * @throws JobExecutionException */@Override protected void executeInternal(JobExecutionContextjobExecutionContext) throws JobExecutionException {System.out.println("洪生鵬 quartz task " + new Date()); } }
創建配置類QuartzConfig
@Configurationpublic class QuartzConfig { @Bean public JobDetail teatQuartzDetail() { return JobBuilder.newJob(TestQuartz.class).withIdentity("testQuartz"). storeDurably().build(); } @Bean public Trigger testQuartzTrigger() { SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(2) //設置時間周期單位秒 每隔兩秒實行一次 .repeatForever(); return TriggerBuilder.newTrigger().forJob(teatQuartzDetail()).withIdentity("testQuartz") .withSchedule(scheduleBuilder) .build(); } }
Run項目,我們可以看到控制台打印出如下信息:
至此關於定時任務,我們就創建完成了。
以上簡單地介紹了關於SpringBoot定時任務的處理,更多功能還需摸索。
