Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 372|回复: 0

Java定时任务解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-25 16:29:25 | 显示全部楼层 |阅读模式

    很多项目中都会遇到需要定时任务的情况,本篇文章就结合了Spring中以及SpringBoot、SpringCloud中定时任务的解决方案。

    在Spring中使用定时器

    用SpringBoot比较多的同学可能都会觉得Spring的xml配置确实比较麻烦,如果想在Spring中使用定时器的话其实是必须使用xml配置文件的。

    1. 引入task约束
    1
    2
    http://www.springframework.org/schema/task
    http://www.springframework.org/schema/task/spring-task-3.0.xsd
    1. 开启注解
    1
    2
    <task:scheduler id="Scheduler" pool-size="10"/> 
    <task:annotation-driven scheduler="Scheduler" proxy-target-class="true"/>
    1. 以注解的方式使用

    在项目中使用时定时任务的类必须由Spring来管理,所以我们给这个类加上一个@Component注解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Component
    public class Task {

    /**
    *每分钟执行一次
    */
    @Scheduled(cron = "0 0/1 * * * ?")
    public void test(){
    System.out.println("task定时任务");
    }
    }

    @Scheduled注解呢,就是表示启用定时任务,括号里的cron的值呢,其实就是一种表达式,就像上边的例子呢就是表示每分钟执行一次。(文章最后会有cron的详细用法介绍哦)

    在SpringBoot和SpringCloud中使用定时器

    在SpringBoot中使用的话相比较于Spring中就简单明了多了,一起来看一下吧。

    1. 引入task
      灰常简单,启动类增加一个注解@EnableScheduling完事

    2. 使用
      和Spring的使用方式一样,这里就不多做介绍了。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      @Component
      public class Task {

      /**
      *每分钟执行一次
      */
      @Scheduled(cron = "0 0/1 * * * ?")
      public void test(){
      System.out.println("task定时任务");
      }
      }

    优雅的初始化定时器

    有的时候我们的定时任务可能几个小时需要执行一次。但是呢,我们可能会需要一些初始值。(假如说我们需要一些缓存,不想每次查询缓存都去判断的话我们就可以先在项目启动时就查询出来,然后定时刷新)如果把这个值的初始化过程放在类的构造方法中感觉岂不是太low了,那么有没有别的办法呢?

    @PostConstruct注解,这个注解呢,可以在Spring加载这个类的时候执行一次,完美的解决我们上方所说的问题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    @Component
    public class Task {

    private int num;

    private Random rand = new Random();

    /**
    *每分钟执行一次
    */
    @Scheduled(cron = "0 0/1 * * * ?")
    public void test(){
    System.out.println("task定时任务");
    }
    @PostConstruct
    private void init(){
    changeNum();
    }

    private void changeNum(){
    //假装这是个查询数据库的操作
    num=rand.nextInt(100);
    }
    }

     

    cron表达式详解

    来看一下如何使用cron表达式如何使用的吧

    语法

    一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。
    按顺序依次为

    秒(0~59)

    分钟(0~59)

    小时(0~23)

    天(月)(0~31)

    月(0~11)

    天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)

    年份(1970-2099)

    -区间

    *通配符

    ? 你不想设置那个字段

    demo

    注意下方*之间有空格

    “0 0 1 ? ** ” 每天凌晨1点触发

    “0 30 1 ? ** ” 每天凌晨1:30触发

    “30 30 1 ? ** ” 每天凌晨1:30:30触发

    “30 30 1 ** ? 2018” 2018年的每天凌晨1:30:30触发

    “0 0/1 *** ?” 每分钟触发 一次

    “0 0 0/1 ** ?” 每小时触发一次

    “0 15 10 ? * MON-FRI” 周一到周五的10:15触发

    如果觉得会用的到的话可以收藏转载哦!

     

    本文出自http://zhixiang.org.cn,转载请保留。


    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-2 21:45 , Processed in 0.065368 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表