上一篇 <<<Apollo配置信息被程序識別的方式
下一篇 >>>傳統(tǒng)任務(wù)調(diào)度存在的缺陷
實(shí)現(xiàn)方案
多線程形式、timetask、線程池、Springboot的Schedule注解形式、Quartz。
Spring batch是把Quartz框架做了封裝,Schedule底層也是用了Quartz框架。
框架對比
| 定時任務(wù)框架 | Cron表達(dá)式 | 固定間隔執(zhí)行 | 固定頻率執(zhí)行 | 任務(wù)持久化 | 開發(fā)難易度 |
|---|---|---|---|---|---|
| JDK TimerTask | 不支持 | 支持 | 支持 | 不支持 | 一般 |
| Spring Schedule | 支持 | 支持 | 支持 | 不支持 | 簡單 |
| Quartz | 支持 | 支持 | 支持 | 支持 | 難 |
1.多線程形式
/**
* 多線程方式
*/
public class ThreadTask {
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
System.out.println("定時任務(wù)觸發(fā)...");
} catch (InterruptedException e) {
}
}
}
}).start();
}
}
2.timetask多線程形式
多線程并行處理定時任務(wù)時,Timer運(yùn)行多個TimeTask時,只要其中之一沒有捕獲拋出的異常,其他任務(wù)便會自動終止運(yùn)行,使用ScheduleExecutorService則沒有這個問題。
public class TimerTaskDemo {
public static void main(String[] args) {
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "定時任務(wù)觸發(fā)");
}
};
Timer timer = new Timer();
// 天數(shù)
long delay = 0;
// 耗秒數(shù)
long period = 1000;
timer.scheduleAtFixedRate(timerTask, delay, period);
}
}
3.線程池形式
public class ScheduledExecutorServiceDemo {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("定時任務(wù)觸發(fā)..");
}
};
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
scheduledExecutorService.scheduleAtFixedRate(runnable, 1, 1, TimeUnit.SECONDS);
}
}
4.SpringBoot的Schedule形式
@Component
public class UserScheduled {
@Scheduled(cron = "0/1 * * * * *")
public void taskUserScheduled() {
System.out.println("定時任務(wù)觸發(fā)...");
}
}
@SpringBootApplication
@EnableScheduling
public class T {
public static void main(String[] args) {
SpringApplication.run(T.class);
}
}
5.Quartz形式
<!-- quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
public class QuartzTest {
public static void main(String[] args) throws SchedulerException {
//1.創(chuàng)建Scheduler的工廠
SchedulerFactory sf = new StdSchedulerFactory();
//2.從工廠中獲取調(diào)度器實(shí)例
Scheduler scheduler = sf.getScheduler();
//3.創(chuàng)建JobDetail
JobDetail jb = JobBuilder.newJob(MyJob.class)
.withDescription("this is a ram job") //job的描述
.withIdentity("ramJob", "ramGroup") //job 的name和group
.build();
//任務(wù)運(yùn)行的時間,SimpleSchedle類型觸發(fā)器有效
long time = System.currentTimeMillis() + 3 * 1000L; //3秒后啟動任務(wù)
Date statTime = new Date(time);
//4.創(chuàng)建Trigger
//使用SimpleScheduleBuilder或者CronScheduleBuilder
Trigger t = TriggerBuilder.newTrigger()
.withDescription("")
.withIdentity("ramTrigger", "ramTriggerGroup")
//.withSchedule(SimpleScheduleBuilder.simpleSchedule())
.startAt(statTime) //默認(rèn)當(dāng)前時間啟動
.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) //兩秒執(zhí)行一次
.build();
//5.注冊任務(wù)和定時器
scheduler.scheduleJob(jb, t);
//6.啟動 調(diào)度器
scheduler.start();
}
}
/**
* 單獨(dú)文件
*/
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("quartz MyJob date:" + System.currentTimeMillis());
}
}
推薦閱讀:
<<<傳統(tǒng)任務(wù)調(diào)度存在的缺陷
<<<如何保證我們的定時任務(wù)只會觸發(fā)一次
<<<定時任務(wù)宕機(jī)后如何處理
<<<分布式任務(wù)調(diào)度平臺的特點(diǎn)
<<<XXL-Job和Elastic-job的區(qū)別
<<<Elastic-job的設(shè)計(jì)理念及原理說明
<<<SpringBoot整合Elastic-Job示例
<<<修改Elastic-Job默認(rèn)session過期時間提升故障轉(zhuǎn)移速度
<<<XXL-job入門介紹
<<<XXL-job的架構(gòu)與執(zhí)行邏輯說明
<<<XXL-Job Admin平臺搭建
<<<SpringBoot項(xiàng)目集成XXL-Job
<<<XXL-Job Admin任務(wù)調(diào)度的配置及預(yù)警示例
<<<XXL-Job使用分片集群機(jī)制將100W的短信在5min內(nèi)發(fā)完
<<<XXL-Job如何搭建集群