傳統(tǒng)任務(wù)調(diào)度實(shí)現(xiàn)方案及demo示例

上一篇 <<<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如何搭建集群

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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