美文网首页
springboot Quartz集成-分布式版和示例

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

作者: BeeHoney | 来源:发表于2018-12-29 17:00 被阅读0次

    说明

    分布式动态定时任务场景。

    具体配置

    1.需要引入的maven依赖

        <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相关依赖-->
            <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的方式注册配置

    @Configuration
    @EnableScheduling
    public class QuartzConfiguration {
        /**
         * 继承org.springframework.scheduling.quartz.SpringBeanJobFactory
         * 实现任务实例化方式
         */
        public static class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements
                ApplicationContextAware {
    
            private transient AutowireCapableBeanFactory beanFactory;
    
            @Override
            public void setApplicationContext(final ApplicationContext context) {
                beanFactory = context.getAutowireCapableBeanFactory();
            }
    
            /**
             * 将job实例交给spring ioc托管
             * 我们在job实例实现类内可以直接使用spring注入的调用被spring ioc管理的实例
             * @param bundle
             * @return
             * @throws Exception
             */
            @Override
            protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
                final Object job = super.createJobInstance(bundle);
                /**
                 * 将job实例交付给spring ioc
                 */
                beanFactory.autowireBean(job);
                return job;
            }
        }
    
        /**
         * 配置任务工厂实例
         * @param applicationContext spring上下文实例
         * @return
         */
        @Bean
        public JobFactory jobFactory(ApplicationContext applicationContext)
        {
            /**
             * 采用自定义任务工厂 整合spring实例来完成构建任务
             * see {@link AutowiringSpringBeanJobFactory}
             */
            AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
            jobFactory.setApplicationContext(applicationContext);
            return jobFactory;
        }
    
        /**
         * 配置任务调度器
         * 使用项目数据源作为quartz数据源
         * @param jobFactory 自定义配置任务工厂
         * @param dataSource 数据源实例
         * @return
         * @throws Exception
         */
        @Bean(destroyMethod = "destroy",autowire = Autowire.NO)
        public SchedulerFactoryBean schedulerFactoryBean(JobFactory jobFactory, DataSource dataSource) throws Exception
        {
            SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
            //将spring管理job自定义工厂交由调度器维护
            schedulerFactoryBean.setJobFactory(jobFactory);
            //设置覆盖已存在的任务
            schedulerFactoryBean.setOverwriteExistingJobs(true);
            //项目启动完成后,等待2秒后开始执行调度器初始化
            schedulerFactoryBean.setStartupDelay(2);
            //设置调度器自动运行
            schedulerFactoryBean.setAutoStartup(true);
            //设置数据源,使用与项目统一数据源
            schedulerFactoryBean.setDataSource(dataSource);
            //设置上下文spring bean name
            schedulerFactoryBean.setApplicationContextSchedulerContextKey("applicationContext");
            //设置配置文件位置
            schedulerFactoryBean.setConfigLocation(new ClassPathResource("/quartz.properties"));
            return schedulerFactoryBean;
        }
    
    }
    

    3.需要加载的 quartz.properties

    将随时需要修改的一些配置提取到 quartz.properties中,文件文件可放入外部,也可以放入../src/main/resources下,quartz.properties的具体的配置和解释:

    #调度器实例名称
    org.quartz.scheduler.instanceName = quartzScheduler
    
    #调度器实例编号自动生成
    org.quartz.scheduler.instanceId = AUTO
    
    #持久化方式配置
    org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
    
    #持久化方式配置数据驱动,MySQL数据库
    org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    
    #quartz相关数据表前缀名
    org.quartz.jobStore.tablePrefix = QRTZ_
    
    #开启分布式部署
    org.quartz.jobStore.isClustered = true
    #配置是否使用
    org.quartz.jobStore.useProperties = false
    
    #分布式节点有效性检查时间间隔,单位:毫秒
    org.quartz.jobStore.clusterCheckinInterval = 20000
    
    #线程池实现类
    org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
    
    #执行最大并发线程数量
    org.quartz.threadPool.threadCount = 10
    
    #线程优先级
    org.quartz.threadPool.threadPriority = 6
    
    #配置为守护线程,设置后任务将不会执行
    #org.quartz.threadPool.makeThreadsDaemons=true
    
    #配置是否启动自动加载数据库内的定时任务,默认true
    org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
    
    

    4.需要执行的quartz sql脚本内容

    因为使用的是工程的数据源,将以下表加入工程数据库中即可。

    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常用操作工具类

    @Component
    @Slf4j
    public class QuartzManager {
    
    
        /**
         * 注入任务调度器
         */
        @Autowired
        private Scheduler scheduler;
    
    
        /**
         * @Description: 添加一个定时任务
         *
         * @param name 任务名
         * @param groupName  任务组名
         * @param jobClass  任务
         * @param cron  时间设置,参考quartz说明文档
         * @param paramMap   任务执行所需的参数
         */
        public void addJob(String name, String groupName, Class jobClass, String cron, Map<String, Object> paramMap) {
            try {
    //            Scheduler sched = schedulerFactory.getScheduler();
                // 任务名,任务组,任务执行类
                JobDetail jobDetail= JobBuilder.newJob(jobClass).withIdentity(name, groupName).build();
    
                // 触发器
                TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
                // 触发器名,触发器组
                triggerBuilder.withIdentity(name, groupName);
    //            triggerBuilder.withPriority(1);
                triggerBuilder.startNow();
                // 触发器时间设定
                triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
                // 创建Trigger对象
                CronTrigger trigger = (CronTrigger) triggerBuilder.build();
    
                // 业务逻辑参数传递
                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);
                }
    
                // 调度容器设置JobDetail和Trigger
                scheduler.scheduleJob(jobDetail, trigger);
    
                // 启动
                if (!scheduler.isShutdown()) {
                    scheduler.start();
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
    
    
        }
    
    
        /**
         * @Description: 修改一个任务的触发时间
         *
         * @param name
         * @param groupName
         * @param cron   时间设置,参考quartz说明文档
         */
        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)) {
                    /** 方式一 :调用 rescheduleJob 开始 */
                    // 触发器
                    TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
                    // 触发器名,触发器组
                    triggerBuilder.withIdentity(name, groupName);
                    triggerBuilder.startNow();
                    // 触发器时间设定
                    triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
                    // 创建Trigger对象
                    trigger = (CronTrigger) triggerBuilder.build();
                    // 方式一 :修改一个任务的触发时间
                    scheduler.rescheduleJob(triggerKey, trigger);
                    /** 方式一 :调用 rescheduleJob 结束 */
    
    
                    /** 方式二:先删除,然后在创建一个新的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);
                    /** 方式二 :先删除,然后在创建一个新的Job */
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
    
        /**
         * @Description: 移除一个任务
         *
         * @param name
         * @param groupName
         */
        public void removeJob(String name, String groupName) {
            try {
                TriggerKey triggerKey = TriggerKey.triggerKey(name, groupName);
                scheduler.pauseTrigger(triggerKey);// 停止触发器
                scheduler.unscheduleJob(triggerKey);// 移除触发器
                scheduler.deleteJob(JobKey.jobKey(name, groupName));// 删除任务
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
    
        /**
         * @Description:启动所有定时任务
         */
        public void startJobs() {
            try {
    
                scheduler.start();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
    
        /**
         * @Description:关闭所有定时任务
         */
        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

    场景模拟:指定某个用户在某个时间进行什么工作。
    实例代码: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 = "定时监看";
            String jobName = UUID.randomUUID().toString();
    
            // 设置要传入实现job的具体参数对象
            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);
    
    
            // 设置定时的时间
            Date startTime = new Date();
            Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
            calendar.setTime(startTime);
            // 一个小时后执行
            calendar.set(Calendar.HOUR, calendar.get(Calendar.HOUR) + 1);
            // 最终的时间
            System.out.println("设置的定时时间为:"+sdf.format(calendar.getTime()));
            startTime = calendar.getTime();
    
    
            // 执行时间
            String corn = TimeUtils.getCron(startTime);
    
            // 设置开始切换节目的定时任务,到指定时间执行 DemoAddQuartzJob.class为具体要做的事情的实现,下一个示例给出。
            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.使用示例 - 实现Job

    场景模拟:指定某个用户在某个时间进行什么工作的具体实现。
    说明: 此方法类是一个通用的实现,描述了所有用户触发定时任务后都会去做同一类事情(DemoQuartzJob),如果做不同的事情,那就 新创建一个implements Job 的方法类,如DemoQuartzJob2 DemoQuartzJob3 ... ,如下通用示例:

    DemoQuartzJob.java

    @Component
    public class DemoQuartzJob implements Job {
    
        /**
        *  实现定时任务具体要处理的逻辑
        * @param
        * @return
        */
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
    
            // 解析创建该定时任务时设置的数据
            JobDataMap dataMap = context.getJobDetail().getJobDataMap();
    
            String userName = (String) dataMap.get("userName");
            Map work = (Map) dataMap.get("work");
    
            // 输出 该用户在这个时刻要做的事情
            System.out.println(""+userName+" is work:"+work);
    
           // todo 要做的事情的具体实现
            
        }
    }
    
    

    更多,请关注:
    springboot 技术实践总结

    相关文章

      网友评论

          本文标题:springboot Quartz集成-分布式版和示例

          本文链接:https://www.haomeiwen.com/subject/vphklqtx.html