• spring boot 使用Schedule创建轻量级定时任务


    Scheduled

    SpringBoot配置定时任务可以直接使用自带的Scheduled,这相当于一个轻量级的Quartz,它可以让我们直接使用注解来完成定时任务的配置。

    Scheduled调度时间设置说明

    使用Scheduled设置任务调度时间有以下几种方式,可根据实际情况选取一种即可:

    //通过fixedRate属性,来设置上一次调度开始后再次调度的延时,fixedRate值的单位为毫秒,此例为每5秒执行1次
    //注意:fixedRate只要到达间隔时间就会调度执行,不关心上次任务是否已执行完成,这样就会存在重复执行的风险!
    @Scheduled(fixedRate = 5000)
    
    //该属性的功效与上面的fixedRate则是相反的,配置了该属性后会等到任务方法执行完成后,达到延迟配置的时间再次执行该方法
    @Scheduled(fixedDelay = 5000)
    
    //通过cron属性,使用Cron表达式来设置执行时间,此例为每10秒执行1次
    //在线Cron表达式生成器:http://cron.qqe2.com/
    @Scheduled(cron="*/10 * * * * ?")

    别外,可以通过initialDelay属性来设置第一次执行的延迟时间,只是做延迟的设定,并不会控制其他逻辑,需要配合fixedDelay或者fixedRate来使用

    //第一次延迟10秒执行,之后每间隔5秒执行一次
    @Scheduled(fixedDelay = 5000, initialDelay = 10000)

    调度任务(定时任务)实现类

    调度任务1

    package Scheduler;
    
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Service;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    @Service
    public class SchedulingTask1 {
    
        private Integer count=0;
        private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
        //通过fixedRate属性,来设置上一次调度开始后再次调度的延时,fixedRate值的单位为毫秒,此例为每5秒执行1次
        @Scheduled(fixedRate = 5000)
        private void process(){
            //输出
            System.out.println(String.format("第%s次执行任务SchedulingTask1 时间:%s", (++count).toString(), dateFormat.format(new Date())));
        }
    }

    调度任务2

    package Scheduler;
    
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Service;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    @Service
    public class SchedulingTask2 {
    
        private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
        //通过cron属性,使用Cron表达式来设置执行时间,此例为每10秒执行1次
        @Scheduled(cron="*/10 * * * * ?")
        private void process(){
            //输出
            System.out.println(String.format("SchedulingTask2执行... 时间:%s", dateFormat.format(new Date())));
        }
    }

    也可以将SchedulingTask2类中的方法写在SchedulingTask1类中。

    调度配置类

    @ComponentScan注解的作用就是根据定义的扫描路径,把符合扫描规则的类装配到spring容器中

    @EnableScheduling注解开启对计划任务的支持

    package Scheduler;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableScheduling;
    
    @Configuration
    @ComponentScan("Scheduler")
    @EnableScheduling //通过@EnableScheduling注解开启对计划任务的支持
    public class SchedulerConfig {
    }

    启动类

    使用AnnotationConfigApplicationContext可以实现基于Java的配置类(包括各种注解)加载Spring的应用上下文。避免使用application.xml进行配置。相比XML配置,更加便捷。

    package com.lgt.demo2;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import Scheduler.SchedulerConfig;
    
    @SpringBootApplication
    public class Demo2Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Demo2Application.class, args);
            AnnotationConfigApplicationContext context =
                    new AnnotationConfigApplicationContext(SchedulerConfig.class);
        }
    
    }

    输出结果

    第1次执行任务SchedulingTask1 时间:2019-04-15 13:41:33
    第2次执行任务SchedulingTask1 时间:2019-04-15 13:41:38
    SchedulingTask2执行... 时间:2019-04-15 13:41:40
    第3次执行任务SchedulingTask1 时间:2019-04-15 13:41:43
    第4次执行任务SchedulingTask1 时间:2019-04-15 13:41:48
    SchedulingTask2执行... 时间:2019-04-15 13:41:50
    第5次执行任务SchedulingTask1 时间:2019-04-15 13:41:53
    第6次执行任务SchedulingTask1 时间:2019-04-15 13:41:58
    SchedulingTask2执行... 时间:2019-04-15 13:42:00
  • 相关阅读:
    关于sqlserver2008 bcp根据数据表导出xml格式文件的小记
    关于SQL SERVER 2008 X64版本报错:消息 7302,级别 16,无法创建链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.ACE.OLEDB.12.0" 的实例。
    Response.Redirect(),Server.Transfer(),Server.Execute()的区别[转]
    ASP.net应用程序中如何调用客户端的Javascript脚本小结(转)
    重写ListView控件,实现点击列头排序的功能
    关于Response.redirect和Response.End出现线程中止异常的处理(转)
    持续集成cruisecontrol.net学习总结
    [转]关于PowerDesigner反向工程SQL Server2000数据库时生成注释的解决方法
    敏捷开发scrum学习笔记一
    asp.net缓存机制总结(转)
  • 原文地址:https://www.cnblogs.com/codecat/p/10710206.html
Copyright © 2020-2023  润新知