zoukankan      html  css  js  c++  java
  • Spring Boot 配置 Quartz 定时任务

    Quartz有四个核心概念:

    Job:是一个接口,只定义一个方法 execute(JobExecutionContext context),在实现接口的 execute 方法中编写所需要定时执行的 Job(任务)
     Double slongitude = Double.valueOf(jobExecutionContext.getJobDetail().getJobDataMap().get("slongitude").toString());
    JobDetail:Quartz 每次调度 Job 时,都重新创建一个 Job 实例,因此它不接受一个 Job 的实例,相反它接收一个 Job 实现类(JobDetail,描述 Job 的实现类及其他相关的静态信息,如 Job 名字、描述、关联监听器等信息),以便运行时通过 newInstance() 的反射机制实例化 Job。
    rigger:是一个类,描述触发 Job 执行的时间触发规则,主要有 SimpleTrigger 和 CronTrigger 这两个子类。当且仅当需调度一次或者以固定时间间隔周期执行调度,SimpleTrigger 是最适合的选择;而 CronTrigger 则可以通过 Cron 表达式定义出各种复杂时间规则的调度方案:如工作日周一到周五的 15:00 ~ 16:00 执行调度等。
    Scheduler:调度器就相当于一个容器,装载着任务和触发器,该类是一个接口,代表一个 Quartz 的独立运行容器,Trigger 和 JobDetail 可以注册到 Scheduler 中,两者在 Scheduler 中拥有各自的组及名称,组及名称是 Scheduler 查找定位容器中某一对象的依据,Trigger 的组及名称必须唯一,JobDetail 的组和名称也必须唯一(但可以和 Trigger 的组和名称相同,因为它们是不同类型的)。Scheduler 定义了多个接口方法,允许外部通过组及名称访问和控制容器中 Trigger 和 JobDetail。

    1.导入pom依赖

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

    2.开启定时任务

    @EnableScheduling注解
    //java fhadmin.cn
    @EnableScheduling
    @SpringBootApplication
    public class DemoApplication {
     
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
     
    }

    3.新建一个job

    @Slf4j
    public class MyJob implements Job {
     
        @Override
        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            try {
              
                executeTask(jobExecutionContext);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //java fhadmin.cn
        private static void executeTask(JobExecutionContext jobExecutionContext) throws SchedulerException {
    //JobExecutionContext 类提供了调度应用的一些信息;
    //Job 运行时的信息保存在 JobDataMap 实例中。
     
            JobKey key = jobExecutionContext.getJobDetail().getKey();
            System.out.println(new Date()+"->"+key.toString()+"定时任务正在执行");
     
     
        }
     
    }

    4.构建JobDetail  rigger ,把Trigger 和 JobDetail 可以注册到 Scheduler 中

    //fhrom fhadmin.cn
    @Configuration
    public class QuartzManager {
     
       // public static final String JOB1="job1";
       // public static final String GROUP1="group1";
        /**默认每个星期凌晨一点执行*/
        //public static final String DEFAULT_CRON="0 0 1 ? * L";
        /**默认5秒执行一次*/
       // public static final String DEFAULT_CRON="*/5 * * * * ?";
     
        /**
         * 任务调度
         */
     
         private Scheduler scheduler;
     
         @Bean
        public Scheduler scheduler() throws SchedulerException {
            SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
            this.scheduler = schedulerFactoryBean.getScheduler();
            return schedulerFactoryBean.getScheduler();
        }
        /**
         * 开始执行定时任务
         */
        public void startJob(String name,String group,String time) throws SchedulerException {
            startJobTask(scheduler,name,group,time);
            scheduler.start();
        }
        /**
         * 启动定时任务
         * @param scheduler
         */
        private void startJobTask(Scheduler scheduler,String  name ,String group,String time) throws SchedulerException {
                                                               //对于身份
            JobDetail jobDetail= JobBuilder.newJob(MyJob.class).withIdentity(name,group).build();
            System.out.println("jobDetail:-------------"+jobDetail);
     
            String DEFAULT_CRON="*/"+time+" * * * * ?";
            // SimpleScheduleBuilder  CronScheduleBuilder  用于构建Scheduler,定义任务调度的时间规则
            CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(DEFAULT_CRON);
            //触发器
            CronTrigger cronTrigger=TriggerBuilder.newTrigger().withIdentity(name,group)
                    .withSchedule(cronScheduleBuilder).build();
            scheduler.scheduleJob(jobDetail,cronTrigger);
     
        }
     
        /**
         * 获取Job信息
         * @param name
         * @param group
         */
        public String getjobInfo(String name,String group) throws SchedulerException {
            TriggerKey triggerKey=new TriggerKey(name,group);
            System.out.println("triggerKey:"+triggerKey);
            CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);
            return String.format("time:%s,state:%s",cronTrigger.getCronExpression(),
                    scheduler.getTriggerState(triggerKey).name());
        }
     
        /**
         * 修改任务的执行时间
         * @param name
         * @param group
         * @param cron cron表达式
         * @return
         * @throws SchedulerException
         */
        public boolean modifyJob(String name,String group,String cron) throws SchedulerException{
            Date date=null;
            TriggerKey triggerKey=new TriggerKey(name, group);
            CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);
            String oldTime=cronTrigger.getCronExpression();
            if (!oldTime.equalsIgnoreCase(cron)){
                CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(cron);
                CronTrigger trigger=TriggerBuilder.newTrigger().withIdentity(name,group)
                        .withSchedule(cronScheduleBuilder).build();
                date=scheduler.rescheduleJob(triggerKey,trigger);
            }
            return date !=null;
        }
     
        /**
         * 暂停所有任务
         * @throws SchedulerException
         */
        public void pauseAllJob()throws SchedulerException{
            scheduler.pauseAll();
        }
     
        /**
         * 暂停某个任务
         * @param name
         * @param group
         * @throws SchedulerException
         */
        public void pauseJob(String name,String group)throws SchedulerException{
            JobKey jobKey=new JobKey(name,group);
            JobDetail jobDetail=scheduler.getJobDetail(jobKey);
            if (jobDetail==null) {
                return;
            }
            scheduler.pauseJob(jobKey);
        }
     
        /**
         * 恢复所有任务
         * @throws SchedulerException
         */
        public void resumeAllJob()throws SchedulerException{
            scheduler.resumeAll();
        }
        /**
         * 恢复某个任务
         */
        public void resumeJob(String name,String group)throws SchedulerException {
            JobKey jobKey=new JobKey(name,group);
            JobDetail jobDetail=scheduler.getJobDetail(jobKey);
            if (jobDetail==null) {
                return;
            }
            scheduler.resumeJob(jobKey);
        }
     
        /**
         * 删除某个任务
         * @param name
         * @param group
         * @throws SchedulerException
         */
        public void deleteJob(String name,String group)throws SchedulerException{
            JobKey jobKey=new JobKey(name, group);
            JobDetail jobDetail=scheduler.getJobDetail(jobKey);
            if (jobDetail==null) {
                return;
            }
            scheduler.deleteJob(jobKey);
        }
     
    }

    5.编写Controller 

    通过调用接口  可以开始定时任务  结束定时任务  获取任务信息

    //fhadmin.cn
    @RestController
    @RequestMapping("/quartz")
    public class ModifyCronController {
     
        @Autowired
        private QuartzManager quartzManager;
        @GetMapping("/modify")
        public String modify(@RequestParam("job")String job,   //job的名称
                             @RequestParam("group")String group,//job的组
                             @RequestParam("time")String time   //执行定时任务的步长
         ) throws SchedulerException {
           
           // quartzManager.pauseJob(QuartzManager.JOB1,QuartzManager.GROUP1);
            quartzManager.startJob(job,group,time);
            String s = quartzManager.getjobInfo(job, group);
            System.out.println("job:"+s);
     
            return "ok";
        }
    }
  • 相关阅读:
    NLP Best Practices
    Bert模型精简方法
    delphi:对象的创建(create)与释放(free/destory)(转载)
    delphi:Format格式化函数(转载)
    delphi:destroy, free, freeAndNil, release用法和区别(转载)
    delphi:function ParamStr(i:LongInt):string
    jquery:上传文件
    bootstrapValidator中用ajax校验
    jquery中实时监控文本框的变化
    jquery判断checkbox是否选中
  • 原文地址:https://www.cnblogs.com/teacher11/p/15237822.html
Copyright © 2011-2022 走看看