集成Quartz實(shí)現(xiàn)定時(shí)任務(wù)

說明

Quartz是一個(gè)任務(wù)調(diào)度框架,基于一定的時(shí)間規(guī)則實(shí)現(xiàn)某項(xiàng)定時(shí)任務(wù)。

幾個(gè)需要了解的對(duì)象:

  • Scheduler:任務(wù)調(diào)度器
  • Job:任務(wù)
  • jobDetail:任務(wù)的實(shí)例
  • Trigger:觸發(fā)器,任務(wù)在什么時(shí)候會(huì)執(zhí)行

一、添加maven

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

二、添加一個(gè)任務(wù)

public class UserJob extends QuartzJobBean {

    //任務(wù)傳入的參數(shù)
    private Integer uid;

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    @Override
    protected void executeInternal(JobExecutionContext context)
            throws JobExecutionException {
        System.out.println(String.format("Hello %s!", this.uid));
    }
}

三、添加對(duì)任務(wù)的操作

@Service
public class QuartzUserService {

    private static final String JOB_GROUP = "event_job_group";
    private static final String TRIGGER_GROUP = "event_trigger_group";

    @Autowired
    private Scheduler scheduler;

    /**
     * 添加一個(gè)任務(wù)
     * 1、需要獲取到任務(wù)調(diào)度器Scheduler
     * 2、定義jobDetail
     * 3、定義trigger
     * 4、使用Scheduler添加任務(wù)
     * @param user
     * @throws SchedulerException
     */
    public void addQuartz(User user) throws SchedulerException {

        //任務(wù)開始時(shí)間
        Date triggerDate = user.getStartTime();

        //定義jobDetail
        JobDetail job = JobBuilder.newJob(UserJob.class)
                .withIdentity(user.getUid().toString(), JOB_GROUP)
                .usingJobData("uid", user.getUid())
                .build();

        //cron表達(dá)式 表示每隔i秒執(zhí)行
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(String.format("0/%d * * * * ? ",10)).withMisfireHandlingInstructionDoNothing();

        //定義trigger
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(user.getUid().toString(), TRIGGER_GROUP)
                .startAt(triggerDate)
                .withSchedule(scheduleBuilder)
                .build();

        //使用Scheduler添加任務(wù)
        scheduler.scheduleJob(job, trigger);
    }

    /**
     * 刪除定時(shí)任務(wù)
     * 1、獲取到定時(shí)任務(wù)調(diào)度器
     * 2、停止觸發(fā)器
     * 3、刪除觸發(fā)器
     * 4、刪除任務(wù)
     * @param uid
     */
    public void deleteJob(Integer uid) throws SchedulerException {

        //停止觸發(fā)器
        TriggerKey triggerKey  = TriggerKey.triggerKey(uid.toString(), TRIGGER_GROUP);
        scheduler.pauseTrigger(triggerKey);

        //刪除觸發(fā)器
        scheduler.unscheduleJob(triggerKey);

        //刪除任務(wù)
        JobKey jobKey = JobKey.jobKey(uid.toString(),JOB_GROUP);
        scheduler.deleteJob(jobKey);

    }

    /**
     * 修改一個(gè)任務(wù)
     * @param uid
     * @throws SchedulerException
     */
    public void updateJob(Integer uid) throws SchedulerException {

        //查詢?nèi)蝿?wù)
        TriggerKey triggerKey = TriggerKey.triggerKey(uid.toString(), TRIGGER_GROUP);
        CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
        if(trigger == null) {
            return;
        }

        //cron表達(dá)式 表示每隔i秒執(zhí)行
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(String.format("0/%d * * * * ? ",8)).withMisfireHandlingInstructionDoNothing();

        //重新定義trigger
        trigger = TriggerBuilder.newTrigger()
                .withIdentity(triggerKey)
                .withSchedule(scheduleBuilder)
                .build();

        //修改任務(wù)
        scheduler.rescheduleJob(triggerKey, trigger);

    }

    /**
     * 暫停所有的定時(shí)任務(wù)
     * @throws SchedulerException
     */
    public void standby() throws SchedulerException {
        scheduler.standby();
    }

    /**
     * 啟動(dòng)所有的定時(shí)任務(wù)
     * @throws SchedulerException
     */
    public void startJobs() throws SchedulerException {
        if(!scheduler.isShutdown()) {
            scheduler.start();
        }
    }

    /**
     * 關(guān)閉所有的定時(shí)任務(wù)
     * @throws SchedulerException
     */
    public void shutdownJobs() throws SchedulerException {
        if(!scheduler.isShutdown()) {
            scheduler.shutdown();
        }
    }

}

四、源碼

https://github.com/XShire/spring-boot-quartz.git

最后編輯于
?著作權(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)容