• springboot集成Quartzjob存储方式三json配置文件


    前面第二种方法,需要将定时任务都存到数据库表里面,程序启动的时候读取表进行执行。

    但是这样还是缺乏灵活性,因此这里创建第三种方法,将定时任务保存到本地json配置文件中,这样更灵活。

    1、ApplicationInit类

    package org.jeecg.modules.quartz.init;
    
    import com.alibaba.fastjson.JSON;
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.io.IOUtils;
    import org.jeecg.common.util.DateUtils;
    import org.jeecg.modules.quartz.entity.SysQuartzramJob;
    import org.jeecg.modules.quartz.enums.JobStatus;
    import org.jeecg.modules.quartz.service.ISysQuartzramJobService;
    import org.quartz.*;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.List;
    
    @Component
    @Slf4j
    public class ApplicationInit implements CommandLineRunner {
    
        private static final String TRIGGER_IDENTITY = "trigger";
        @Autowired
        private ISysQuartzramJobService sysQuartzramJobService;
        @Autowired
        private Scheduler scheduler;
    
        @Override
        public void run(String... args) throws Exception {
    
            log.info(String.format("程序启动,定时任务开始加载,时间:" + DateUtils.getTimestamp()));
    
            //从json配置文件加载定时任务列表
            loadJobFromFile();
        }
    
        //这是从数据库表读取定时任务的逻辑
        private void loadJobFromDB() throws Exception {
            try {
    
                QueryWrapper<SysQuartzramJob> queryWrapper = new QueryWrapper<SysQuartzramJob>();
                List<SysQuartzramJob> list=sysQuartzramJobService.list(queryWrapper);
                for(SysQuartzramJob job : list)
                {
                    schedulerJob(job);
                    if (JobStatus.PAUSED.getStatus().equals(job.getTriggerState())) {
                        scheduler.pauseJob(new JobKey(job.getJobName(), job.getJobGroup()));
                    }
                }
    
            }
            catch (Exception e)
            {
            log.error(e.getMessage(),e);
            }
        }
    
        //这是从json配置文件读取定时任务的逻辑
        private void loadJobFromFile() throws Exception {
         try {
                String jsonSrc="classpath:org/jeecg/modules/quartz/init/quartz.json";
                InputStream stream = getClass().getClassLoader().getResourceAsStream(jsonSrc.replace("classpath:", ""));
                String jsonStr = IOUtils.toString(stream);
    
                 List<SysQuartzramJob> list = JSON.parseArray(jsonStr, SysQuartzramJob.class);
                 for (SysQuartzramJob job : list)
                 {
                     schedulerJob(job);
                     if (JobStatus.PAUSED.getStatus().equals(job.getTriggerState())) {
                         scheduler.pauseJob(new JobKey(job.getJobName(), job.getJobGroup()));
                     }
                 }
    
            } catch (IOException e) {
                log.error(e.getMessage(),e);
            }
        }
    
    
        public void schedulerJob(SysQuartzramJob job) throws Exception {
            //构建job信息
            Class cls = Class.forName(job.getJobClassName()) ;
            // cls.newInstance(); // 检验类是否存在
            JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(job.getJobName(),job.getJobGroup())
                    .withDescription(job.getDescription()).build();
    
            // 触发时间点
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression().trim());
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity(TRIGGER_IDENTITY + job.getJobName(), job.getJobGroup())
                    .startNow().withSchedule(cronScheduleBuilder).build();
            //交由Scheduler安排触发
            scheduler.scheduleJob(jobDetail, trigger);
        }
    }

    2、json配置文件

    [
      {
        "id": "1",
        "jobName": "RiverSiteWarnJob",
        "jobGroup": "river",
        "jobClassName": "org.jeecg.modules.quartz.job.RiverSiteWarnJob",
        "cronExpression": "6 0/10 * * * ?",
        "triggerState": "RUNNING",
        "description": "站点超标报警,10分钟执行1次"
      }
    ]

    3、job定时任务

    package org.jeecg.modules.quartz.job;
    
    import org.jeecg.common.util.DateUtils;
    import org.quartz.Job;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    
    import lombok.extern.slf4j.Slf4j;
    
    /**
     * 示例不带参定时任务
     * 
     * @Author Scott
     */
    @Slf4j
    public class SampleJob implements Job {
    
        @Override
        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    
            log.info(String.format(" Jeecg-Boot 普通定时任务 SampleJob !  时间:" + DateUtils.getTimestamp()));
        }
    }
  • 相关阅读:
    nginx 指令之 try_files
    java tomcat jvm优化
    使用phpexcel上传下载excel文件
    路由器数据统计SQL脚本
    微信公众平台开发(122) 获取微信会员卡用户姓名和手机号
    微信会员卡积分规则
    IP白名单
    关于公众平台接口不再支持HTTP方式调用的公告
    微信公众号特异功能列表
    微信小程序 TOP100 榜单
  • 原文地址:https://www.cnblogs.com/tiandi/p/15957630.html
Copyright © 2020-2023  润新知