springboot Quartz集成-分布式版和示例

說(shuō)明

分布式動(dòng)態(tài)定時(shí)任務(wù)場(chǎng)景。

具體配置

1.需要引入的maven依賴(lài)

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <quartz.version>2.2.3</quartz.version>
    </properties>

        <!--quartz相關(guān)依賴(lài)-->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>${quartz.version}</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz-jobs</artifactId>
            <version>${quartz.version}</version>
        </dependency>

2. 采用bean的方式注冊(cè)配置

@Configuration
@EnableScheduling
public class QuartzConfiguration {
    /**
     * 繼承org.springframework.scheduling.quartz.SpringBeanJobFactory
     * 實(shí)現(xiàn)任務(wù)實(shí)例化方式
     */
    public static class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements
            ApplicationContextAware {

        private transient AutowireCapableBeanFactory beanFactory;

        @Override
        public void setApplicationContext(final ApplicationContext context) {
            beanFactory = context.getAutowireCapableBeanFactory();
        }

        /**
         * 將job實(shí)例交給spring ioc托管
         * 我們?cè)趈ob實(shí)例實(shí)現(xiàn)類(lèi)內(nèi)可以直接使用spring注入的調(diào)用被spring ioc管理的實(shí)例
         * @param bundle
         * @return
         * @throws Exception
         */
        @Override
        protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
            final Object job = super.createJobInstance(bundle);
            /**
             * 將job實(shí)例交付給spring ioc
             */
            beanFactory.autowireBean(job);
            return job;
        }
    }

    /**
     * 配置任務(wù)工廠(chǎng)實(shí)例
     * @param applicationContext spring上下文實(shí)例
     * @return
     */
    @Bean
    public JobFactory jobFactory(ApplicationContext applicationContext)
    {
        /**
         * 采用自定義任務(wù)工廠(chǎng) 整合spring實(shí)例來(lái)完成構(gòu)建任務(wù)
         * see {@link AutowiringSpringBeanJobFactory}
         */
        AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
        jobFactory.setApplicationContext(applicationContext);
        return jobFactory;
    }

    /**
     * 配置任務(wù)調(diào)度器
     * 使用項(xiàng)目數(shù)據(jù)源作為quartz數(shù)據(jù)源
     * @param jobFactory 自定義配置任務(wù)工廠(chǎng)
     * @param dataSource 數(shù)據(jù)源實(shí)例
     * @return
     * @throws Exception
     */
    @Bean(destroyMethod = "destroy",autowire = Autowire.NO)
    public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory, DataSource dataSource) throws Exception
    {
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        //將spring管理job自定義工廠(chǎng)交由調(diào)度器維護(hù)
        schedulerFactoryBean.setJobFactory(jobFactory);
        //設(shè)置覆蓋已存在的任務(wù)
        schedulerFactoryBean.setOverwriteExistingJobs(true);
        //項(xiàng)目啟動(dòng)完成后,等待2秒后開(kāi)始執(zhí)行調(diào)度器初始化
        schedulerFactoryBean.setStartupDelay(2);
        //設(shè)置調(diào)度器自動(dòng)運(yùn)行
        schedulerFactoryBean.setAutoStartup(true);
        //設(shè)置數(shù)據(jù)源,使用與項(xiàng)目統(tǒng)一數(shù)據(jù)源
        schedulerFactoryBean.setDataSource(dataSource);
        //設(shè)置上下文spring bean name
        schedulerFactoryBean.setApplicationContextSchedulerContextKey("applicationContext");
        //設(shè)置配置文件位置
        schedulerFactoryBean.setConfigLocation(new ClassPathResource("/quartz.properties"));
        return schedulerFactoryBean;
    }

}

3.需要加載的 quartz.properties

將隨時(shí)需要修改的一些配置提取到 quartz.properties中,文件文件可放入外部,也可以放入../src/main/resources下,quartz.properties的具體的配置和解釋?zhuān)?/p>

#調(diào)度器實(shí)例名稱(chēng)
org.quartz.scheduler.instanceName = quartzScheduler

#調(diào)度器實(shí)例編號(hào)自動(dòng)生成
org.quartz.scheduler.instanceId = AUTO

#持久化方式配置
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

#持久化方式配置數(shù)據(jù)驅(qū)動(dòng),MySQL數(shù)據(jù)庫(kù)
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

#quartz相關(guān)數(shù)據(jù)表前綴名
org.quartz.jobStore.tablePrefix = QRTZ_

#開(kāi)啟分布式部署
org.quartz.jobStore.isClustered = true
#配置是否使用
org.quartz.jobStore.useProperties = false

#分布式節(jié)點(diǎn)有效性檢查時(shí)間間隔,單位:毫秒
org.quartz.jobStore.clusterCheckinInterval = 20000

#線(xiàn)程池實(shí)現(xiàn)類(lèi)
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

#執(zhí)行最大并發(fā)線(xiàn)程數(shù)量
org.quartz.threadPool.threadCount = 10

#線(xiàn)程優(yōu)先級(jí)
org.quartz.threadPool.threadPriority = 6

#配置為守護(hù)線(xiàn)程,設(shè)置后任務(wù)將不會(huì)執(zhí)行
#org.quartz.threadPool.makeThreadsDaemons=true

#配置是否啟動(dòng)自動(dòng)加載數(shù)據(jù)庫(kù)內(nèi)的定時(shí)任務(wù),默認(rèn)true
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

4.需要執(zhí)行的quartz sql腳本內(nèi)容

因?yàn)槭褂玫氖枪こ痰臄?shù)據(jù)源,將以下表加入工程數(shù)據(jù)庫(kù)中即可。

use `your_db`;

DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;
 
CREATE TABLE QRTZ_JOB_DETAILS(
SCHED_NAME VARCHAR(120) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
JOB_CLASS_NAME VARCHAR(250) NOT NULL,
IS_DURABLE VARCHAR(1) NOT NULL,
IS_NONCONCURRENT VARCHAR(1) NOT NULL,
IS_UPDATE_DATA VARCHAR(1) NOT NULL,
REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
ENGINE=InnoDB;
 
CREATE TABLE QRTZ_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
NEXT_FIRE_TIME BIGINT(13) NULL,
PREV_FIRE_TIME BIGINT(13) NULL,
PRIORITY INTEGER NULL,
TRIGGER_STATE VARCHAR(16) NOT NULL,
TRIGGER_TYPE VARCHAR(8) NOT NULL,
START_TIME BIGINT(13) NOT NULL,
END_TIME BIGINT(13) NULL,
CALENDAR_NAME VARCHAR(200) NULL,
MISFIRE_INSTR SMALLINT(2) NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))
ENGINE=InnoDB;
 
CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
REPEAT_COUNT BIGINT(7) NOT NULL,
REPEAT_INTERVAL BIGINT(12) NOT NULL,
TIMES_TRIGGERED BIGINT(10) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;
 
CREATE TABLE QRTZ_CRON_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
CRON_EXPRESSION VARCHAR(120) NOT NULL,
TIME_ZONE_ID VARCHAR(80),
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;
 
CREATE TABLE QRTZ_SIMPROP_TRIGGERS
  (          
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    STR_PROP_1 VARCHAR(512) NULL,
    STR_PROP_2 VARCHAR(512) NULL,
    STR_PROP_3 VARCHAR(512) NULL,
    INT_PROP_1 INT NULL,
    INT_PROP_2 INT NULL,
    LONG_PROP_1 BIGINT NULL,
    LONG_PROP_2 BIGINT NULL,
    DEC_PROP_1 NUMERIC(13,4) NULL,
    DEC_PROP_2 NUMERIC(13,4) NULL,
    BOOL_PROP_1 VARCHAR(1) NULL,
    BOOL_PROP_2 VARCHAR(1) NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) 
    REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;
 
CREATE TABLE QRTZ_BLOB_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
BLOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;
 
CREATE TABLE QRTZ_CALENDARS (
SCHED_NAME VARCHAR(120) NOT NULL,
CALENDAR_NAME VARCHAR(200) NOT NULL,
CALENDAR BLOB NOT NULL,
PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
ENGINE=InnoDB;
 
CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;
 
CREATE TABLE QRTZ_FIRED_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
ENTRY_ID VARCHAR(95) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
INSTANCE_NAME VARCHAR(200) NOT NULL,
FIRED_TIME BIGINT(13) NOT NULL,
SCHED_TIME BIGINT(13) NOT NULL,
PRIORITY INTEGER NOT NULL,
STATE VARCHAR(16) NOT NULL,
JOB_NAME VARCHAR(200) NULL,
JOB_GROUP VARCHAR(200) NULL,
IS_NONCONCURRENT VARCHAR(1) NULL,
REQUESTS_RECOVERY VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,ENTRY_ID))
ENGINE=InnoDB;
 
CREATE TABLE QRTZ_SCHEDULER_STATE (
SCHED_NAME VARCHAR(120) NOT NULL,
INSTANCE_NAME VARCHAR(200) NOT NULL,
LAST_CHECKIN_TIME BIGINT(13) NOT NULL,
CHECKIN_INTERVAL BIGINT(13) NOT NULL,
PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
ENGINE=InnoDB;
 
CREATE TABLE QRTZ_LOCKS (
SCHED_NAME VARCHAR(120) NOT NULL,
LOCK_NAME VARCHAR(40) NOT NULL,
PRIMARY KEY (SCHED_NAME,LOCK_NAME))
ENGINE=InnoDB;
 
CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);
 
CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
 
CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
 
commit; 

5. Quartz常用操作工具類(lèi)

@Component
@Slf4j
public class QuartzManager {


    /**
     * 注入任務(wù)調(diào)度器
     */
    @Autowired
    private Scheduler scheduler;


    /**
     * @Description: 添加一個(gè)定時(shí)任務(wù)
     *
     * @param name 任務(wù)名
     * @param groupName  任務(wù)組名
     * @param jobClass  任務(wù)
     * @param cron  時(shí)間設(shè)置,參考quartz說(shuō)明文檔
     * @param paramMap   任務(wù)執(zhí)行所需的參數(shù)
     */
    public void addJob(String name, String groupName, Class jobClass, String cron, Map<String, Object> paramMap) {
        try {
//            Scheduler sched = schedulerFactory.getScheduler();
            // 任務(wù)名,任務(wù)組,任務(wù)執(zhí)行類(lèi)
            JobDetail jobDetail= JobBuilder.newJob(jobClass).withIdentity(name, groupName).build();

            // 觸發(fā)器
            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
            // 觸發(fā)器名,觸發(fā)器組
            triggerBuilder.withIdentity(name, groupName);
//            triggerBuilder.withPriority(1);
            triggerBuilder.startNow();
            // 觸發(fā)器時(shí)間設(shè)定
            triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
            // 創(chuàng)建Trigger對(duì)象
            CronTrigger trigger = (CronTrigger) triggerBuilder.build();

            // 業(yè)務(wù)邏輯參數(shù)傳遞
            if (paramMap.get(Constant.CHANNEL) != null) {
                if (jobDetail.getJobDataMap().get(Constant.CHANNEL) != null) {
                    log.info("=======channelJson = " + jobDetail.getJobDataMap().get(Constant.CHANNEL));
                }
                Object channel = paramMap.get(Constant.CHANNEL);
                String channelJson = JSONObject.toJSONString(channel);
                jobDetail.getJobDataMap().put(Constant.CHANNEL, channelJson);
            }
            if (paramMap.get(Constant.PROGRAM) != null) {
                Program program = (Program) paramMap.get(Constant.PROGRAM);
                String programJson = JSONObject.toJSONString(program);
                jobDetail.getJobDataMap().put(Constant.PROGRAM, programJson);
            }

            // 調(diào)度容器設(shè)置JobDetail和Trigger
            scheduler.scheduleJob(jobDetail, trigger);

            // 啟動(dòng)
            if (!scheduler.isShutdown()) {
                scheduler.start();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }


    }


    /**
     * @Description: 修改一個(gè)任務(wù)的觸發(fā)時(shí)間
     *
     * @param name
     * @param groupName
     * @param cron   時(shí)間設(shè)置,參考quartz說(shuō)明文檔
     */
    public void modifyJobTime(String name, String groupName, String cron) {
        try {

            TriggerKey triggerKey = TriggerKey.triggerKey(name, groupName);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            if (trigger == null) {
                return;
            }


            String oldTime = trigger.getCronExpression();
            if (!oldTime.equalsIgnoreCase(cron)) {
                /** 方式一 :調(diào)用 rescheduleJob 開(kāi)始 */
                // 觸發(fā)器
                TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
                // 觸發(fā)器名,觸發(fā)器組
                triggerBuilder.withIdentity(name, groupName);
                triggerBuilder.startNow();
                // 觸發(fā)器時(shí)間設(shè)定
                triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
                // 創(chuàng)建Trigger對(duì)象
                trigger = (CronTrigger) triggerBuilder.build();
                // 方式一 :修改一個(gè)任務(wù)的觸發(fā)時(shí)間
                scheduler.rescheduleJob(triggerKey, trigger);
                /** 方式一 :調(diào)用 rescheduleJob 結(jié)束 */


                /** 方式二:先刪除,然后在創(chuàng)建一個(gè)新的Job  */
                //JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
                //Class<? extends Job> jobClass = jobDetail.getJobClass();
                //removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
                //addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);
                /** 方式二 :先刪除,然后在創(chuàng)建一個(gè)新的Job */
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * @Description: 移除一個(gè)任務(wù)
     *
     * @param name
     * @param groupName
     */
    public void removeJob(String name, String groupName) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(name, groupName);
            scheduler.pauseTrigger(triggerKey);// 停止觸發(fā)器
            scheduler.unscheduleJob(triggerKey);// 移除觸發(fā)器
            scheduler.deleteJob(JobKey.jobKey(name, groupName));// 刪除任務(wù)
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * @Description:啟動(dòng)所有定時(shí)任務(wù)
     */
    public void startJobs() {
        try {

            scheduler.start();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * @Description:關(guān)閉所有定時(shí)任務(wù)
     */
    public void shutdownJobs() {
        try {

            if (!scheduler.isShutdown()) {
                scheduler.shutdown();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }


    public static String formatDateByPattern(Date date, String dateFormat){
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        String formatTimeStr = null;
        if (date != null) {
            formatTimeStr = sdf.format(date);
        }
        return formatTimeStr;
    }

    public static String getCron(Date date){
        String dateFormat="ss mm HH dd MM ? yyyy";
        return formatDateByPattern(date, dateFormat);
    }
}

6.使用示例 - 添加Job

場(chǎng)景模擬:指定某個(gè)用戶(hù)在某個(gè)時(shí)間進(jìn)行什么工作。
實(shí)例代碼:DemoAddQuartzJob.java

@Service
public class DemoAddQuartzJob {

    @Autowired
    private QuartzManager quartzManager;

    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public void addJob(){

        String jobGroupName = "定時(shí)監(jiān)看";
        String jobName = UUID.randomUUID().toString();

        // 設(shè)置要傳入實(shí)現(xiàn)job的具體參數(shù)對(duì)象
        Map<String, Object> paramMap = new HashMap<>();

        // 定義work主體
        Map<String,String> work = new HashMap<>();
        work.put("eat","eating");
        work.put("drink","drinking");
        work.put("play","playing");
        work.put("happy","happying");

        paramMap.put("userName", "BeeHoney");
        paramMap.put("work", work);


        // 設(shè)置定時(shí)的時(shí)間
        Date startTime = new Date();
        Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
        calendar.setTime(startTime);
        // 一個(gè)小時(shí)后執(zhí)行
        calendar.set(Calendar.HOUR, calendar.get(Calendar.HOUR) + 1);
        // 最終的時(shí)間
        System.out.println("設(shè)置的定時(shí)時(shí)間為:"+sdf.format(calendar.getTime()));
        startTime = calendar.getTime();


        // 執(zhí)行時(shí)間
        String corn = TimeUtils.getCron(startTime);

        // 設(shè)置開(kāi)始切換節(jié)目的定時(shí)任務(wù),到指定時(shí)間執(zhí)行 DemoAddQuartzJob.class為具體要做的事情的實(shí)現(xiàn),下一個(gè)示例給出。
        quartzManager.addJob(jobName, jobGroupName, DemoAddQuartzJob.class, corn, paramMap);
    }

    static class TimeUtils {
        public static String formatDateByPattern(Date date, String dateFormat){
            SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
            String formatTimeStr = null;
            if (date != null) {
                formatTimeStr = sdf.format(date);
            }
            return formatTimeStr;
        }

        public static String getCron(Date date){
            String dateFormat="ss mm HH dd MM ? yyyy";
            return formatDateByPattern(date, dateFormat);
        }
    }
}

7.使用示例 - 實(shí)現(xiàn)Job

場(chǎng)景模擬:指定某個(gè)用戶(hù)在某個(gè)時(shí)間進(jìn)行什么工作的具體實(shí)現(xiàn)。
說(shuō)明: 此方法類(lèi)是一個(gè)通用的實(shí)現(xiàn),描述了所有用戶(hù)觸發(fā)定時(shí)任務(wù)后都會(huì)去做同一類(lèi)事情(DemoQuartzJob),如果做不同的事情,那就 新創(chuàng)建一個(gè)implements Job 的方法類(lèi),如DemoQuartzJob2 DemoQuartzJob3 ... ,如下通用示例:

DemoQuartzJob.java

@Component
public class DemoQuartzJob implements Job {

    /**
    *  實(shí)現(xiàn)定時(shí)任務(wù)具體要處理的邏輯
    * @param
    * @return
    */
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {

        // 解析創(chuàng)建該定時(shí)任務(wù)時(shí)設(shè)置的數(shù)據(jù)
        JobDataMap dataMap = context.getJobDetail().getJobDataMap();

        String userName = (String) dataMap.get("userName");
        Map work = (Map) dataMap.get("work");

        // 輸出 該用戶(hù)在這個(gè)時(shí)刻要做的事情
        System.out.println(""+userName+" is work:"+work);

       // todo 要做的事情的具體實(shí)現(xiàn)
        
    }
}

更多,請(qǐng)關(guān)注:
springboot 技術(shù)實(shí)踐總結(jié)

最后編輯于
?著作權(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)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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