Java定时任务解决方案

640?wx_fmt=gif
学习更多Java干货,戳上面的
蓝色字题
关注我!

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

在Spring中使用定时器

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

  1. 引入task约束

  2.  http://www.springframework.org/schema/task	
    http://www.springframework.org/schema/task/spring-task-3.0.xsd
<task:scheduler id="Scheduler" pool-size="10"/> 	
 <task:annotation-driven scheduler="Scheduler" proxy-target-class="true"/>

  1. 开启注解

  1. 以注解的方式使用

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

@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

  2. 使用

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

优雅的初始化定时器

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

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

@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个)有空格分隔的时间元素。

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

640?wx_fmt=gif

推荐阅读

640?wx_fmt=jpeg

 点赞收藏转发好看再走呗!

640?wx_fmt=gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值