zoukankan      html  css  js  c++  java
  • springboot之定时任务---Quartz

        定时任务顾名思义到什么时间执行什么操作,在我现在写的公司项目中,有一个帖子的下架和发布时用到了定时任务,

       可以指定它的发布时间和下架时间,到点发布或下架。

      

     Quartz特点

          强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
       灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;
         分布式和集群能力,Terracotta 收购后在原来功能基础上作了进一步提升。
         另外,作为 Spring 默认的调度框架,Quartz 很容易与 Spring 集成实现灵活可配置的调度功能。

      

    quartz调度核心元素:

      

    • Scheduler:任务调度器,是实际执行任务调度的控制器。在spring中通过SchedulerFactoryBean封装起来。
    • Trigger:触发器,用于定义任务调度的时间规则,有SimpleTrigger,CronTrigger,DateIntervalTrigger和NthIncludedDayTrigger,其中CronTrigger用的比较多,本文主要介绍这种方式。CronTrigger在spring中封装在CronTriggerFactoryBean中。
    • Calendar:它是一些日历特定时间点的集合。一个trigger可以包含多个Calendar,以便排除或包含某些时间点。
    • JobDetail:用来描述Job实现类及其它相关的静态信息,如Job名字、关联监听器等信息。在spring中有JobDetailFactoryBean和 MethodInvokingJobDetailFactoryBean两种实现,如果任务调度只需要执行某个类的某个方法,就可以通过MethodInvokingJobDetailFactoryBean来调用。
    • Job:是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息。Job运行时的信息保存在JobDataMap实例中。实现Job接口的任务,默认是无状态的,若要将Job设置成有状态的,在quartz中是给实现的Job添加@DisallowConcurrentExecution注解(以前是实现StatefulJob接口,现在已被Deprecated),在与spring结合中可以在spring配置文件的job detail中配置concurrent参数。

    Cron表达式

      

     代码实现:

        (一)依赖

        

     <!-- Quartz坐标 -->
            <dependency>
                <groupId>org.quartz-scheduler</groupId>
                <artifactId>quartz</artifactId>
                <version>2.2.1</version>
            </dependency>
            <!-- Scheduled坐标 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
            </dependency>
            <!-- spring-tx坐标 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
            </dependency>
    

      (二)QuartzConfig 

      

          import org.quartz.*;
          import org.springframework.context.annotation.Bean;
          import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class QuartzConfig {
        @Bean
        public JobDetail printTimeJobDetail(){
            return JobBuilder.newJob(DateTimeJob.class)//PrintTimeJob我们的业务类
                    .withIdentity("DateTimeJob")//可以给该JobDetail起一个id
                    //每个JobDetail内都有一个Map,包含了关联到这个Job的数据,在Job类中可以通过context获取
                    .usingJobData("msg", "Hello Quartz")//关联键值对
                    .storeDurably()//即使没有Trigger关联时,也不需要删除该JobDetail
                    .build();
        }
        @Bean
        public Trigger printTimeJobTrigger() {
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
            return TriggerBuilder.newTrigger()
                    .forJob(printTimeJobDetail())//关联上述的JobDetail
                    .withIdentity("quartzTaskService")//给Trigger起个名字
                    .withSchedule(cronScheduleBuilder)
                    .build();
        }
    
    }

     (三)DateTimeJob

    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.scheduling.quartz.QuartzJobBean;
    import woke.cloud.official.mapper.SocialPostHelpMapper;
    import java.text.SimpleDateFormat;
    /**
     * Quartz的配置类
     */
    
    public class DateTimeJob extends QuartzJobBean {
        @Autowired
        private SocialPostHelpMapper socialPostHelpMapper;
        private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        @Override
        protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
            //修改发布时间
            socialPostHelpMapper.updateReatesTime();
            //修改下架时间
            socialPostHelpMapper.updateOffSheltTime();
        }
           }

    (四)xml

    <!--发布-->
        <update id="updateReatesTime">
           UPDATE woke_cloud_social.social_post_help  SET release_status = 2
    WHERE
            <!--判断当前时间大于发布时间并且状态是待发布,如果大于改发布状态为2-->
        NOW() > release_time AND release_status = 1
        </update>



    <!--下架--> <update id="updateOffSheltTime"> UPDATE woke_cloud_social.social_post_help SET status = 1 WHERE <!--判断当前时间大于下架时间并且状态是已发布,如果大于下架该条帖子,状态改1--> NOW() > off_shelf_time AND release_status = 2 </update>
  • 相关阅读:
    CSS清浮动
    深入理解BFC
    深入理解CSS浮动
    CSS颜色模式转换器的实现
    深入理解CSS背景
    理解CSS前景色和透明度
    深入理解CSS六种颜色模式
    HTML学习目录
    深入理解display属性
    深入理解盒模型
  • 原文地址:https://www.cnblogs.com/yangxiaoli/p/14187807.html
Copyright © 2011-2022 走看看