zoukankan      html  css  js  c++  java
  • Quartz 实现定时任务

    以Springboot为例介绍通过Quartz作业调度框架实现定时任务。

    1、引用Quartz依赖

    <!--引入Quartz-->
    <dependency>
         <groupId>org.quartz-scheduler</groupId>
         <artifactId>quartz</artifactId>
         <version>2.3.2</version>
    </dependency>

    2、实现具体的可执行的调度任务类,调度任务类需实现Quartz框架提供的Job接口。

    @Override
    public void execute(JobExecutionContext jobExecutionContext) {
        //获取JobDetail中的JobDataMap
        JobDataMap jobDetailMap = jobExecutionContext.getJobDetail().getJobDataMap();
        for(Entry<String, Object> objectEntry: jobDetailMap.entrySet()){
            System.out.println("jobDetailMap---"+objectEntry.getKey()+" "+objectEntry.getValue());
        }
        //获取trigger中的JobDataMap
        JobDataMap triggerMap = jobExecutionContext.getTrigger().getJobDataMap();
        for(Entry<String, Object> objectEntry: triggerMap.entrySet()){
            System.out.println("triggerMap---"+objectEntry.getKey()+" "+objectEntry.getValue());
        }
        //获取trigger和JobDetail中的JobDataMap总和,如果有同一个key,则后者会将前者覆盖
        JobDataMap allMap = jobExecutionContext.getMergedJobDataMap();
        for(Entry<String, Object> objectEntry: allMap.entrySet()){
            System.out.println("allMap"+objectEntry.getKey()+" "+objectEntry.getValue());
        }
    }
    

      

    3、实现任务调度逻辑,使用@PostConstruct使此定时任务在项目启动时即开始运行。

    @PostConstruct
    public void buildQuartz(){
    
        JobBuilder jobBuilder = JobBuilder.newJob(QuartzService.class).withIdentity(jobName,jobGroupName);
        jobBuilder.usingJobData("jobDetail参数","jobDetail值");
    
        JobDetail jobDetail = jobBuilder.build();
    
        /*
        * 按照指定间隔时间执行
        * startNow()马上执行
        * withIntervalInSeconds(1) 按秒循环,1s循环一次
        * repeatForever() 永远循环
        * */
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName,triggerGroupName)
            .startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
            .build();
    
        //表达式调度构建器
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/3 * * * * ? *")
            .withMisfireHandlingInstructionDoNothing();
    
        /*
         *  按照cron格式 定时执行
         * */
        Trigger triggerCron = TriggerBuilder.newTrigger().withIdentity(triggerName,triggerGroupName)
            .startNow().withSchedule(scheduleBuilder).usingJobData("trigger参数","trigger值")
            .build();
    
        SchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = null;
        try {
            scheduler = stdSchedulerFactory.getScheduler();
            scheduler.scheduleJob(jobDetail,triggerCron);
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
    

      

      

      

      

  • 相关阅读:
    j2EE(转)
    java_jdbc
    Java_pom(转)
    Java 特性
    mybatis-plus一些通用方法
    synchronized和lock的区别和使用
    JQGrid之文件上传
    项目调试Bug集锦(更新中)
    SpringMVC的流程
    Java小白进阶之值传递-引用传递
  • 原文地址:https://www.cnblogs.com/lansetuerqi/p/14029838.html
Copyright © 2011-2022 走看看