很多项目中都会遇到需要定时任务的情况,本篇文章就结合了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,转载请保留。


Java定时任务解决方案的更多相关文章

  1. 完整的定时任务解决方案Spring集成+定时任务本身管理+DB持久化+集群

    完整的定时任务解决方案Spring集成+定时任务本身管理+DB持久化+集群 maven依赖 <dependency> <groupId>org.quartz-scheduler ...

  2. atititt.java定时任务框架选型Spring Quartz 注解总结

    atititt.java定时任务框架选型Spring Quartz 总结 1. .Spring Quartz  (ati recomm) 1 2. Spring Quartz具体配置 2 2.1. 增 ...

  3. java定时任务

    java定时任务实现方法: public class TimingTask { private static int count = 0; private static SpiderService s ...

  4. [转][JAVA]定时任务之-Quartz使用篇

    [BAT][JAVA]定时任务之-Quartz使用篇 定时任务之-Quartz使用篇 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与 ...

  5. Java定时任务器

    java定时任务,每天定时执行任务.以下是这个例子的全部代码. public class TimerManager { //时间间隔 private static final long PERIOD_ ...

  6. Quartz实现JAVA定时任务的动态配置

    什么是动态配置定时任务? 首先说下这次主题,动态配置.没接触过定时任务的同学可以先看下此篇:JAVA定时任务实现的几种方式 定时任务实现方式千人千种,不过基础的无外乎 1.JDK 的Timer类 2. ...

  7. Java中对比单继承与多继承的优劣,以及java的解决方案

    继承是一种面相对象的基本特征之一,但在具体语言的语法设计中有两种方式:单继承和多继承. 所谓多继承是指一个子类可以拥有多个父类:单继承则是一个子类只拥有一个父类. 单继承与多继承的优劣: 多继承优点在 ...

  8. java——定时任务

    java定时任务直接看代码 public void timeTask(){ Timer timer = new Timer(); timer.schedule(new TimerTask() { pu ...

  9. Java应用多机器部署定时任务解决方案

    Java多机部署下定时任务的处理方案. 本文转自:http://www.cnblogs.com/xunianchong/p/6958548.html 需求: 有两台服务器同时部署了同一套代码, 代码中 ...

随机推荐

  1. python requests库网页爬取小实例:亚马逊商品页面的爬取

    由于直接通过requests.get()方法去爬取网页,它的头部信息的user-agent显示的是python-requests/2.21.0,所以亚马逊网站可能会拒绝访问.所以我们要更改访问的头部信 ...

  2. API Test WebApiTestClient工具安装及使用

    一.guget安装: 1.解决方案右键-管理解决方案的nuget程序包打开如下图: 搜索WebApiTestClient,然后选择查询出的项目,右边点击安装即可:   2.安装会有如下图提示: 确定即 ...

  3. c#devexpress 窗体控件dock的重要

    在设计c# devexpress winform 窗体时, 要建立起dock意识, dock就是子窗体如何靠在父窗体上, 有fill 全覆盖, buttom 底部,top 上部... 如下图 pane ...

  4. hbase-运维命令

    hbase 问题 不一致问题 meta表不一致问题 hdfs文件不一致问题 hbase hbck hbase hbck 用于检测和修改hbase底层文件问题.检测像master,region serv ...

  5. 校赛F

    问题描述 例如对于数列[1 2 3 4 5 6],排序后变为[6 1 5 2 4 3].换句话说,对于一个有序递增的序列a1, a2, a3, ……, an,排序后为an, a1, an-1, a2, ...

  6. jquery瀑布流排列样式代码

    <!DOCTYPE html><html><head lang="en"> <meta charset="gb2312" ...

  7. jqgrid content-type datatype

    jQuery('#jq2').jqGrid( { url: 'http://localhost:8080/api/RskPriceFactorTest/senario/0/detail', editu ...

  8. spring的compentScan注解扫描类机制

    1主要通过ConfigurationClassParser类的doProcessConfigurationClass(ConfigurationClass configClass, SourceCla ...

  9. 转存下链接--- Java awt Swing 进行拖拽实现布局

    http://blog.csdn.net/vpingchangxin/article/details/8673825 swing开发图形界面工具,eclipse swing图形化操作界面工具配置

  10. python Strip函数和Split函数的用法总结 (python2.0,但用法与3.0是差不多的)

    strip函数原型 声明:s为字符串,rm为要删除的字符序列. 只能删除开头或是结尾的字符或是字符串.不能删除中间的字符或是字符串. s.strip(rm)        删除s字符串中开头.结尾处, ...