Java定时任务解决方案
很多项目中都会遇到需要定时任务的情况,本篇文章就结合了Spring中以及SpringBoot、SpringCloud中定时任务的解决方案。
在Spring中使用定时器
用SpringBoot比较多的同学可能都会觉得Spring的xml配置确实比较麻烦,如果想在Spring中使用定时器的话其实是必须使用xml配置文件的。
- 引入task约束
1 2 | http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd |
- 开启注解
1 2 | <task:scheduler id="Scheduler" pool-size="10"/> <task:annotation-driven scheduler="Scheduler" proxy-target-class="true"/> |
- 以注解的方式使用
在项目中使用时定时任务的类必须由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中就简单明了多了,一起来看一下吧。
-
引入task
灰常简单,启动类增加一个注解@EnableScheduling完事 -
使用
和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,转载请保留。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
TypeScript基础入门 - 函数 - 可选参数和默认参数
转载 TypeScript基础入门 - 函数 - 可选参数和默认参数 项目实践仓库 https://github.com/durban89/typescript_demo.git tag: 1.2.0 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能直接运行看到输出的结果。 npm install -D ts-node 后面自己在练习的时候可以这样使用 npx ts-node 脚本路径 函数 可选参数和默认参数 TypeScript里的每个函数参数都是必须的。 这不是指不能传递 null或undefined作为参数,而是说编译器检查用户是否为每个参数都传入了值。 编译器还会假设只有这些参数会被传递进函数。 简短地说,传递给一个函数的参数个数必须与函数期望的参数个数一致。如下实例演示 function buildName(firstName: string, lastName: string) { return firstName + ' ' + lastName } // 错误演示 buildName("firstName") // 错误演示 buildNam...
- 下一篇
Java项目启动时执行指定方法的几种方式
版权声明:本文为博主原创文章,未经博主允许不得转载。博客源地址为zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/81750854 很多时候我们都会碰到需要在程序启动时去执行的方法,比如说去读取某个配置,预加载缓存,定时任务的初始化等。这里给出几种解决方案供大家参考。 1. 使用@PostConstruct注解 这个注解呢,可以在Spring加载这个类的时候执行一次。来看一下下方代码。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 @Component public class Test { public Test(){ System.out.println("我最先执行"); } /** *我第二个执行 */ @Autowired private T t; /** *我第三个个执行 */ @PostConstruct private void init(){ //假装有代码 } } 上方就是@PostConstruct注解的使用方法了,同时也表示...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Linux系统CentOS6、CentOS7手动修改IP地址
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块
- 2048小游戏-低调大师作品