SpringBoot整合Quartz動態定時任務

來源:互聯網
上載者:User
SpringBoot內建schedule

沿用的springboot少xml配置的優良傳統,本身支援運算式等多種定時任務
注意在程式啟動的時候加上@EnableScheduling

@Scheduled(cron="0/5 * * * * ?")    public void job(){        System.out.println("每五秒執行一次");    }
為什麼要使用Quartz

多任務情況下,quartz更容易管理,可以實現動態配置
執行時間運算式:

運算式樣本:
整合Quartz

如何搭建springboot就不再細說,官網和網上的教程很多。

maven依賴

<dependency>            <groupId>org.quartz-scheduler</groupId>            <artifactId>quartz</artifactId>            <version>2.2.1</version>        </dependency>

測試Job類
SchedulerQuartzJob1和SchedulerQuartzJob2代碼差不多就不一一列出

package com.yvan.quartz.job;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;/** * 實現Job介面 * @author yvan * */public class SchedulerQuartzJob1 implements Job{    private void before(){        System.out.println("任務開始執行");    }    @Override    public void execute(JobExecutionContext arg0) throws JobExecutionException {        before();        System.out.println("開始:"+System.currentTimeMillis());        // TODO 業務        System.out.println("結束:"+System.currentTimeMillis());        after();    }    private void after(){        System.out.println("任務開始執行");    }}

任務調用處理
將其拆分成兩個部分 執行個體化Job,將任務觸發器加入任務調度中

    private void startJob1(Scheduler scheduler) throws SchedulerException {        // 通過JobBuilder構建JobDetail執行個體,JobDetail規定只能是實現Job介面的執行個體        // JobDetail 是具體Job執行個體        JobDetail jobDetail = JobBuilder.newJob(SchedulerQuartzJob1.class).withIdentity("job1", "group1").build();        // 基於運算式構建觸發器        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");        // CronTrigger運算式觸發器 繼承於Trigger        // TriggerBuilder 用於構建觸發器執行個體        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("job1", "group1")                .withSchedule(cronScheduleBuilder).build();        scheduler.scheduleJob(jobDetail, cronTrigger);    }    private void startJob2(Scheduler scheduler) throws SchedulerException {        JobDetail jobDetail = JobBuilder.newJob(SchedulerQuartzJob2.class).withIdentity("job2", "group2").build();        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0 0/5 * * * ?");        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("job2", "group2")                .withSchedule(cronScheduleBuilder).build();        scheduler.scheduleJob(jobDetail, cronTrigger);    }
對外提供關於動態管理工作的方法
    /**     * 開始執行所有任務     *      * @throws SchedulerException     */    public void startJob() throws SchedulerException {        startJob1(scheduler);        startJob2(scheduler);        scheduler.start();    }    /**     * 擷取Job資訊     *      * @param name     * @param group     * @return     * @throws SchedulerException     */    public String getJobInfo(String name, String group) throws SchedulerException {        TriggerKey triggerKey = new TriggerKey(name, group);        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);        return String.format("time:%s,state:%s", cronTrigger.getCronExpression(),                scheduler.getTriggerState(triggerKey).name());    }    /**     * 修改某個任務的執行時間     *      * @param name     * @param group     * @param time     * @return     * @throws SchedulerException     */    public boolean modifyJob(String name, String group, String time) throws SchedulerException {        Date date = null;        TriggerKey triggerKey = new TriggerKey(name, group);        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);        String oldTime = cronTrigger.getCronExpression();        if (!oldTime.equalsIgnoreCase(time)) {            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(time);            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(name, group)                    .withSchedule(cronScheduleBuilder).build();            date = scheduler.rescheduleJob(triggerKey, trigger);        }        return date != null;    }    /**     * 暫停所有任務     *      * @throws SchedulerException     */    public void pauseAllJob() throws SchedulerException {        scheduler.pauseAll();    }    /**     * 暫停某個任務     *      * @param name     * @param group     * @throws SchedulerException     */    public void pauseJob(String name, String group) throws SchedulerException {        JobKey jobKey = new JobKey(name, group);        JobDetail jobDetail = scheduler.getJobDetail(jobKey);        if (jobDetail == null)            return;        scheduler.pauseJob(jobKey);    }    /**     * 恢複所有任務     *      * @throws SchedulerException     */    public void resumeAllJob() throws SchedulerException {        scheduler.resumeAll();    }    /**     * 恢複某個任務     *      * @param name     * @param group     * @throws SchedulerException     */    public void resumeJob(String name, String group) throws SchedulerException {        JobKey jobKey = new JobKey(name, group);        JobDetail jobDetail = scheduler.getJobDetail(jobKey);        if (jobDetail == null)            return;        scheduler.resumeJob(jobKey);    }    /**     * 刪除某個任務     *      * @param name     * @param group     * @throws SchedulerException     */    public void deleteJob(String name, String group) throws SchedulerException {        JobKey jobKey = new JobKey(name, group);        JobDetail jobDetail = scheduler.getJobDetail(jobKey);        if (jobDetail == null)            return;        scheduler.deleteJob(jobKey);    }
完整代碼
package com.yvan.quartz;import java.util.Date;import org.quartz.CronScheduleBuilder;import org.quartz.CronTrigger;import org.quartz.JobBuilder;import org.quartz.JobDetail;import org.quartz.JobKey;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.TriggerBuilder;import org.quartz.TriggerKey;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import com.yvan.quartz.job.SchedulerQuartzJob1;import com.yvan.quartz.job.SchedulerQuartzJob2;/** * 任務調度處理 * @author yvan * */@Configurationpublic class QuartzScheduler {    // 任務調度    @Autowired    private Scheduler scheduler;    /**     * 開始執行所有任務     *      * @throws SchedulerException     */    public void startJob() throws SchedulerException {        startJob1(scheduler);        startJob2(scheduler);        scheduler.start();    }    /**     * 擷取Job資訊     *      * @param name     * @param group     * @return     * @throws SchedulerException     */    public String getJobInfo(String name, String group) throws SchedulerException {        TriggerKey triggerKey = new TriggerKey(name, group);        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);        return String.format("time:%s,state:%s", cronTrigger.getCronExpression(),                scheduler.getTriggerState(triggerKey).name());    }    /**     * 修改某個任務的執行時間     *      * @param name     * @param group     * @param time     * @return     * @throws SchedulerException     */    public boolean modifyJob(String name, String group, String time) throws SchedulerException {        Date date = null;        TriggerKey triggerKey = new TriggerKey(name, group);        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);        String oldTime = cronTrigger.getCronExpression();        if (!oldTime.equalsIgnoreCase(time)) {            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(time);            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(name, group)                    .withSchedule(cronScheduleBuilder).build();            date = scheduler.rescheduleJob(triggerKey, trigger);        }        return date != null;    }    /**     * 暫停所有任務     *      * @throws SchedulerException     */    public void pauseAllJob() throws SchedulerException {        scheduler.pauseAll();    }    /**     * 暫停某個任務     *      * @param name     * @param group     * @throws SchedulerException     */    public void pauseJob(String name, String group) throws SchedulerException {        JobKey jobKey = new JobKey(name, group);        JobDetail jobDetail = scheduler.getJobDetail(jobKey);        if (jobDetail == null)            return;        scheduler.pauseJob(jobKey);    }    /**     * 恢複所有任務     *      * @throws SchedulerException     */    public void resumeAllJob() throws SchedulerException {        scheduler.resumeAll();    }    /**     * 恢複某個任務     *      * @param name     * @param group     * @throws SchedulerException     */    public void resumeJob(String name, String group) throws SchedulerException {        JobKey jobKey = new JobKey(name, group);        JobDetail jobDetail = scheduler.getJobDetail(jobKey);        if (jobDetail == null)            return;        scheduler.resumeJob(jobKey);    }    /**     * 刪除某個任務     *      * @param name     * @param group     * @throws SchedulerException     */    public void deleteJob(String name, String group) throws SchedulerException {        JobKey jobKey = new JobKey(name, group);        JobDetail jobDetail = scheduler.getJobDetail(jobKey);        if (jobDetail == null)            return;        scheduler.deleteJob(jobKey);    }    private void startJob1(Scheduler scheduler) throws SchedulerException {        // 通過JobBuilder構建JobDetail執行個體,JobDetail規定只能是實現Job介面的執行個體        // JobDetail 是具體Job執行個體        JobDetail jobDetail = JobBuilder.newJob(SchedulerQuartzJob1.class).withIdentity("job1", "group1").build();        // 基於運算式構建觸發器        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");        // CronTrigger運算式觸發器 繼承於Trigger        // TriggerBuilder 用於構建觸發器執行個體        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("job1", "group1")                .withSchedule(cronScheduleBuilder).build();        scheduler.scheduleJob(jobDetail, cronTrigger);    }    private void startJob2(Scheduler scheduler) throws SchedulerException {        JobDetail jobDetail = JobBuilder.newJob(SchedulerQuartzJob2.class).withIdentity("job2", "group2").build();        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0 0/5 * * * ?");        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("job2", "group2")                .withSchedule(cronScheduleBuilder).build();        scheduler.scheduleJob(jobDetail, cronTrigger);    }}
Scheduler 注入
這裡採用監聽spring容器載入完畢後事件,啟動任務調用
將Scheduler交給spring初始化管理
package com.yvan.quartz;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.SchedulerFactory;import org.quartz.impl.StdSchedulerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationListener;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.event.ContextRefreshedEvent;@Configurationpublic class ApplicationStartQuartzJobListener implements ApplicationListener<ContextRefreshedEvent>{    @Autowired    private QuartzScheduler quartzScheduler;    /**     * 初始啟動quartz     */    @Override    public void onApplicationEvent(ContextRefreshedEvent event) {        try {            quartzScheduler.startJob();            System.out.println("任務已經啟動...");        } catch (SchedulerException e) {            e.printStackTrace();        }    }    /**     * 初始注入scheduler     * @return     * @throws SchedulerException     */    @Bean    public Scheduler scheduler() throws SchedulerException{        SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();        return schedulerFactoryBean.getScheduler();     }}
封裝API
這裡封裝的API主要是為了方便動態管理執行任務,當然依賴這些介面也可以做一個介面來更直觀的操作管理工作,這個就不再贅述。
package com.yvan.controller.quartzApi;import org.quartz.SchedulerException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.yvan.quartz.QuartzScheduler;/** * 這裡並沒有採用restful風格 只是簡單封裝了一下api *  * @author yvan * */@RestController@RequestMapping("/quartz")public class QuartzApiController {    @Autowired    private QuartzScheduler quartzScheduler;    @RequestMapping("/start")    public void startQuartzJob() {        try {            quartzScheduler.startJob();        } catch (SchedulerException e) {            e.printStackTrace();        }    }    @RequestMapping("/info")    public String getQuartzJob(String name, String group) {        String info = null;        try {            info = quartzScheduler.getJobInfo(name, group);        } catch (SchedulerException e) {            e.printStackTrace();        }        return info;    }    @RequestMapping("/modify")    public boolean modifyQuartzJob(String name, String group, String time) {        boolean flag = true;        try {            flag = quartzScheduler.modifyJob(name, group, time);        } catch (SchedulerException e) {            e.printStackTrace();        }        return flag;    }    @RequestMapping(value = "/pause")    public void pauseQuartzJob(String name, String group) {        try {            quartzScheduler.pauseJob(name, group);        } catch (SchedulerException e) {            e.printStackTrace();        }    }    @RequestMapping(value = "/pauseAll")    public void pauseAllQuartzJob() {        try {            quartzScheduler.pauseAllJob();        } catch (SchedulerException e) {            e.printStackTrace();        }    }    @RequestMapping(value = "/delete")    public void deleteJob(String name, String group) {        try {            quartzScheduler.deleteJob(name, group);        } catch (SchedulerException e) {            e.printStackTrace();        }    }}
運行結果
 任務已經啟動...18-03-02 14:39:46,879  INFO TomcatEmbeddedServletContainer:201 - Tomcat started on port(s): 8080 (http)  18-03-02 14:39:46,883  INFO Start:57 - Started Start in 3.18 seconds (JVM running for 3.47)  任務開始執行開始:1519972790003結束:1519972790003任務開始執行任務開始執行開始:1519972795000結束:1519972795000任務開始執行

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.