前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java定时任务解决方案

Java定时任务解决方案

作者头像
Java学习录
发布2019-04-18 14:45:02
1.5K0
发布2019-04-18 14:45:02
举报
文章被收录于专栏:Java学习录

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

在Spring中使用定时器

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

  1. 引入task约束

    http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-3.0.xsd

代码语言:javascript
复制
<task:scheduler id="Scheduler" pool-size="10"/>  <task:annotation-driven scheduler="Scheduler" proxy-target-class="true"/>
  1. 开启注解
  2. 以注解的方式使用

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

代码语言:javascript
复制
@Componentpublic 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的使用方式一样,这里就不多做介绍了。

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

优雅的初始化定时器

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

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

代码语言:javascript
复制
@Componentpublic 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个)有空格分隔的时间元素。 按顺序依次为

  1. 秒(0~59)
  2. 分钟(0~59)
  3. 小时(0~23)
  4. 天(月)(0~31)
  5. 月(0~11)
  6. 天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
  7. 年份(1970-2099)
  8. -区间
  9. *通配符
  10. ? 你不想设置那个字段

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触发

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在Spring中使用定时器
  • 在SpringBoot和SpringCloud中使用定时器
  • 优雅的初始化定时器
  • cron表达式详解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档