任務(wù)調(diào)度器之springboot-quartz

引入quartz

在springboot2.x以上版本中,都可以很方便的引入quartz,如下,在pom中增加一個(gè)dependency

     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>

配置Scheduler和SchedulerFactory

我在這里只是最簡(jiǎn)單的介紹一下springboot中quartz怎么使用,因此省略了很多復(fù)雜的步驟,如果想了解的更深入的話可以聯(lián)系我活著翻閱源碼

import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import java.io.IOException;

/**
 * @author wangcanfeng
 * @description 配置scheduler工廠和scheduler,這里可以注入預(yù)先準(zhǔn)備好的executor
 *或者使用系統(tǒng)默認(rèn)的executor,都很方便,也可以把一些關(guān)鍵的參數(shù)放置在配置文件中,通過(guò)配置文件加載
 * @Date Created in 11:58-2019/3/15
 */
@Configuration
public class SchedulerAutoConfiguration {

    //這個(gè)地方如果需要使用自定義的executor,可以在別的地方配置好,然后這里注入
    //@Autowired
    //private ThreadPoolTaskExecutor taskExecutor;


    @Bean(name="SchedulerFactory")
    public SchedulerFactoryBean schedulerFactoryBean() throws IOException {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setAutoStartup(true);
       //這里如果不配置任務(wù)池,它就會(huì)默認(rèn)加載SimpleThreadPool
       //factory.setTaskExecutor();
        return factory;
    }

    @Bean(name="funnyScheduler")
    public Scheduler scheduler() throws IOException {
        return schedulerFactoryBean().getScheduler();
    }
}

聲明任務(wù)處理的curd接口

/**
 * @author wangcanfeng
 * @description
 * @Date Created in 13:53-2019/3/15
 */
public interface JobScheduleService {

    /**
     * 功能描述: 添加簡(jiǎn)單任務(wù)
     * @param  可以自定義一個(gè)任務(wù)信息對(duì)象,然后從信息對(duì)象中獲取參數(shù)創(chuàng)建簡(jiǎn)單任務(wù)
     * @return:void
     * @since: v1.0
     * @Author:wangcanfeng
     * @Date: 2019/3/15 17:00
     */
    void addSimpleJob();

    /**
     * 功能描述: 添加定時(shí)任務(wù)
     * @param 可以自定義一個(gè)任務(wù)信息對(duì)象,然后從信息對(duì)象中獲取參數(shù)創(chuàng)建定時(shí)任務(wù)
     * @return:void
     * @since: v1.0
     * @Author:wangcanfeng
     * @Date: 2019/3/15 17:00
     */
    void addCronJob();

    /**
     * 功能描述: 修改任務(wù)Trigger,即修改任務(wù)的定時(shí)機(jī)制
     * @param
     * @return:void
     * @since: v1.0
     * @Author:wangcanfeng
     * @Date: 2019/3/15 17:00
     */
    void modifyJob();

    /**
     * 功能描述: 暫停任務(wù),只支持定時(shí)任務(wù)的暫停,不支持單次任務(wù),單次任務(wù)需要interrupt
     * @param
     * @return:void
     * @since: v1.0
     * @Author:wangcanfeng
     * @Date: 2019/3/15 17:00
     */
    void pauseJob();

    /**
     * 功能描述: 從暫停狀態(tài)中恢復(fù)定時(shí)任務(wù)運(yùn)行
     * @param
     * @return:void
     * @since: v1.0
     * @Author:wangcanfeng
     * @Date: 2019/3/15 17:00
     */
    void resumeJob();

    /**
     * 功能描述: 刪除任務(wù)
     * @param
     * @return:void
     * @since: v1.0
     * @Author:wangcanfeng
     * @Date: 2019/3/15 17:00
     */
    void deleteJob();

}

定義任務(wù)Class

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;


/**
 * @author wangcanfeng
 * @description
 * @Date Created in 13:49-2019/3/15
 */
public class SimpleJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
            System.out.println("簡(jiǎn)單任務(wù)執(zhí)行中");
    }
}

任務(wù)處理的接口實(shí)現(xiàn)

import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.util.Date;

/**
 * @author wangcanfeng
 * @description
 * @Date Created in 14:02-2019/3/15
 */
@Service
public class JobScheduleServiceImpl implements JobScheduleService {

    /**
     * 因?yàn)樵谂渲弥性O(shè)定了這個(gè)bean的名稱,這里就需要指定bean的名稱,不然啟動(dòng)就會(huì)報(bào)錯(cuò)
     */
    @Autowired
    @Qualifier("funnyScheduler")
    private Scheduler scheduler;

    /**
     * 功能描述: 添加簡(jiǎn)單任務(wù)
     * @param
     * @return:void
     * @since: v1.0
     * @Author:wangcanfeng
     * @Date: 2019/3/15 17:00
     */
    @Override
    public void addSimpleJob(){
        JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
                .withIdentity("testJob01", "testJob")
                .build();
        Date date=new Date();
        date.setTime(1552636529000l);
        SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger()
                .withIdentity("testTrigger01", "testTrigger")
                .startAt(date)
                .build();
        try {
            scheduler.scheduleJob(jobDetail,simpleTrigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**
     * 功能描述: 添加定時(shí)任務(wù)
     * @param
     * @return:void
     * @since: v1.0
     * @Author:wangcanfeng
     * @Date: 2019/3/15 17:00
     */
    @Override
    public void addCronJob() {
        JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)
                .withIdentity("testJob01", "testJob")
                .build();
        //表達(dá)式調(diào)度構(gòu)建器(即任務(wù)執(zhí)行的時(shí)間)
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("* * * * * ? *");
        //按新的cronExpression表達(dá)式構(gòu)建一個(gè)新的trigger
        CronTrigger trigger = TriggerBuilder.newTrigger().
                withIdentity("cronTrigger01","cronTrigger")
                .withSchedule(scheduleBuilder)
                .build();
        try {
            scheduler.scheduleJob(jobDetail,trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**
     * 功能描述: 修改任務(wù)Trigger,即修改任務(wù)的定時(shí)機(jī)制
     * @param
     * @return:void
     * @since: v1.0
     * @Author:wangcanfeng
     * @Date: 2019/3/15 17:00
     */
    @Override
    public void modifyJob() {
        TriggerKey oldKey=new TriggerKey("testTrigger01","testTrigger");
        //表達(dá)式調(diào)度構(gòu)建器(即任務(wù)執(zhí)行的時(shí)間)
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("* * * * * ? *");
        //按新的cronExpression表達(dá)式構(gòu)建一個(gè)新的trigger
        CronTrigger trigger = TriggerBuilder.newTrigger().
                withIdentity("cronTrigger01","cronTrigger")
                .withSchedule(scheduleBuilder)
                .build();
        try {
            scheduler.rescheduleJob(oldKey,trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**
     * 功能描述: 暫停任務(wù),只支持定時(shí)任務(wù)的暫停,不支持單次任務(wù),單次任務(wù)需要interrupt
     * @param
     * @return:void
     * @since: v1.0
     * @Author:wangcanfeng
     * @Date: 2019/3/15 17:00
     */
    @Override
    public void pauseJob() {
        JobKey jobKey=new JobKey("testJob01","testJob");
        try {
            JobDetail jobDetail=  scheduler.getJobDetail(jobKey);
            if(ObjectUtils.isEmpty(jobDetail)){
                System.out.println("沒有這個(gè)job");
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        try {
            scheduler.pauseJob(jobKey);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**
     * 功能描述: 從暫停狀態(tài)中恢復(fù)定時(shí)任務(wù)運(yùn)行
     * @param
     * @return:void
     * @since: v1.0
     * @Author:wangcanfeng
     * @Date: 2019/3/15 17:00
     */
    @Override
    public void resumeJob() {
        JobKey jobKey=new JobKey("testJob01","testJob");
        try {
            scheduler.resumeJob(jobKey);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**
     * 功能描述: 刪除任務(wù)
     * @param
     * @return:void
     * @since: v1.0
     * @Author:wangcanfeng
     * @Date: 2019/3/15 17:00
     */
    @Override
    public void deleteJob() {
        JobKey jobKey=new JobKey("testJob01","testJob");
        try {
            scheduler.deleteJob(jobKey);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

然后就可以在controller中注入service,然后調(diào)用service中的方法,對(duì)任務(wù)進(jìn)行curd操作了,是不是很簡(jiǎn)單呢,喜歡的話伸出你的點(diǎn)贊手,點(diǎn)個(gè)贊吧,如果有時(shí)間的話能去我的個(gè)人網(wǎng)站晃一圈就更好了
http://www.canfeng.xyz

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

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

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