- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章SpringBoot下使用定时任务的方式全揭秘(6种)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文旨在用通俗的语言讲述枯燥的知识 。
定时任务作为一种系统调度工具,在一些需要有定时作业的系统中应用广泛,如每逢某个时间点统计数据、在将来某个时刻执行某些动作...定时任务在主流开发语言均提供相应的api供开发者调用,在java中,实现定时任务有很多种方式,原生的方式实现一个完整定时任务需要由timer、timertask两个类,timer是定时器类,用来按计划开启后台线程执行指定任务,timertask一个抽象类,它的子类代表一个可以被timer计划的任务。除此之外,还可以用scheduledexecutorservice类或者使用第三方jar库quartz,其中quartz是一个优秀的定时任务框架,发展至今已经非常成熟,以致后来其他的定时任务框架的核心思想或底层大多源于quartz.
springboot作为java的一种开发框架,在springboot项目中实现定时任务不仅可以使用java提供的原生方式,还可以使用springboot提供的定时任务api,下面,小编把java原生和springboot所有的实现定时任务的方式做一个整合.
文章提纲: 1、使用线程 2、使用timer类 3、使用scheduledexecutorservice类 4、使用quartz 5、使用spring的@scheduled注解 6、cron表达式 。
1. 线程实现 。
利用线程可以设定休眠时间的方式可以实现简单的定时任务逻辑.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public
static
void
main(string[] args){
//定时任务间隔时间
int
sleeptime=
2
*
1000
;
new
thread(
new
runnable() {
@override
public
void
run() {
while
(
true
){
try
{
system.out.println(
"thread方式执行一次定时任务"
);
//线程休眠规定时间
thread.sleep(sleeptime);
}
catch
(interruptedexception e) {
e.printstacktrace();
}
}
}
}).start();
}
|
2. timer类 。
timer类允许调度一个timertask任务。使用这种方式可以让你的程序按照某一个频度执行.
1
2
3
4
5
6
7
8
9
10
|
public
static
void
main(string[] args){
int
sleeptime=
2
*
1000
;
timertask timertask =
new
timertask() {
@override
public
void
run() {
system.out.println(
"timer方式执行一次定时任务"
);
}
};
new
timer().schedule(timertask,
1
,sleeptime);
}
|
3. scheduledexecutorservice类 。
scheduledexecutorservice,是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响.
因此,基于scheduledexecutorservice类的定时任务类,归根到底也是基于线程的调度实现的.
1
2
3
4
5
6
7
8
9
10
11
12
|
public
static
void
main(string[] args){
int
sleeptime=
2
*
1000
;
scheduledexecutorservice scheduledexecutor = executors.newsinglethreadscheduledexecutor();
scheduledexecutor.scheduleatfixedrate(
new
runnable() {
@override
public
void
run() {
system.out.println(
"scheduledexecutorservice方式执行一次定时任务"
);
}
}
,
1
,sleeptime, timeunit.seconds);
}
|
4. 整合quartz 。
quartz是一个完全由java编写的开源作业调度框架,为在 java 应用程序中进行作业调度提供了简单却强大的机制,要理解它的使用方式,需要先理解它的几个核心概念:
job: 表示一个工作,要执行的具体内容。此接口中只有一个方法,如下: void execute(jobexecutioncontext context) 。
有了这些概念之后,我们就可以把quartz整合到我们的springboot项目中了.
引入quartz依赖 。
1
2
3
4
|
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-quartz</artifactid>
</dependency>
|
配置 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@configuration
public
class
quartzconfig {
@bean
public
jobdetail quartzdetail(){
return
jobbuilder.newjob(quartztest.
class
).withidentity(
"quartztest"
).storedurably().build();
}
@bean
public
simpletrigger quartztrigger(){
simpleschedulebuilder schedulebuilder = simpleschedulebuilder.simpleschedule()
.withintervalinseconds(
10
)
.repeatforever();
return
triggerbuilder.newtrigger().forjob(quartzdetail())
.withidentity(
"quartztest"
)
.withschedule(schedulebuilder)
.build();
}
}
|
测试 。
1
2
3
4
5
6
|
public
class
quartztest
extends
quartzjobbean {
@override
protected
void
executeinternal(jobexecutioncontext jobexecutioncontext){
system.out.println(
"quartz执行一次定时任务 "
);
}
}
|
5. 使用scheduled注解 。
@scheduled是spring为定时任务而生的一个注解,查看注解的源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
@target
({elementtype.method, elementtype.annotation_type})
@retention
(retentionpolicy.runtime)
@documented
@repeatable
(schedules.
class
)
public
@interface
scheduled {
//cron表达式
string cron()
default
""
;
//接收一个java.util.timezone#id。
string zone()
default
""
;
//上一次执行完毕时间点之后多长时间再执行
long
fixeddelay()
default
-
1
;
//支持占位符形式的字符串类型的fixeddelay
string fixeddelaystring()
default
""
;
//上一次开始执行时间点之后多长时间再执行
long
fixedrate()
default
-
1
;
//支持占位符形式的字符串类型的fixedratestring
string fixedratestring()
default
""
;
//第一次延迟多长时间后再执行
long
initialdelay()
default
-
1
;
//支持占位符形式的字符串类型的initialdelay
string initialdelaystring()
default
""
;
}
|
可以看出:scheduled注解中的参数用来设置“定时”动作,通常情况下,比较常用的参数是cron(),这意味着我们需要学会一些cron表达式相关的语法,但由于内容较多,篇幅较长,在这里暂不铺开讲解,我们把cron语法相关放到文章最后,在此先讲解如何用scheduled注解来实现定时任务.
开启定时任务支持 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@springbootapplication
/**
* 开启定时任务支持
*/
@enablescheduling
public
class
testapplication
extends
springbootservletinitializer {
public
static
void
main(string[] args) {
springapplication.run(testapplication.
class
, args);
}
@override
protected
springapplicationbuilder configure(springapplicationbuilder builder) {
return
builder.sources(
this
.getclass());
}
}
|
使用 。
1
2
3
4
5
6
7
8
9
10
11
|
@component
public
class
scheduledtest {
private
logger logger = loggerfactory.getlogger(scheduledtest.
class
);
/**
* 每15秒执行一次定时任务
*/
@scheduled
(cron =
"0/15 * * * * ? "
)
public
void
testcron(){
logger.info(
"scheduled 执行一次定时任务"
);
}
}
|
6. cron表达式 。
cron表达式是一个字符串其语法为:
[秒] [分] [小时] [日] [月] [周] [年] 。
其中[年]为非必填项,因此通常cron表达式通常由6或7部分内容组成,内容的取值为数字或者一些cron表达式约定的特殊字符,这些特殊字符称为“通配符”,每一个通配符分别代指一种值。cron表达式可以用这样的表格来表示:
。
顺序 | 取值范围 | 特殊字符串范围 |
---|---|---|
秒 | 0~60 | , - * / |
分 | 0-60 | , - * / |
时 | 0-23 | , - * / |
日 | 1-31 | , - * / |
月 | 1-12 / jan-dec | , - * ? / l w |
周 | 1-7 / sun-sat | , - * ? / l # |
年(可省略) | 1970-2099 | , - * / |
。
其中通配符的解释以及作用如下:
。
通配符 | 代表的值 | 解释 |
---|---|---|
* | 所有值 | 如:时字段为*,代表每小时都触发 |
? | 不指定值 | 如:周字段为?,代表表达式不关心是周几 |
- | 区间 | 如:时字段设置2-5,代表2,3,4,5点钟时都触发 |
, | 多个值 | 如:时字段设置2,3,5,代表2,3,5点都会触发 |
/ | 递增值 | 如:时字段设置0/2,代表每两个小时触发,时字段设置 2/5,代表从2时开始每隔5小时触发一次 |
l | 最后值 | 如:日字段设置l,代表本月最后一天 |
w | 最近工作日 | 如:在日字段设置13w,代表没约13日最近的那个工作日触发一次 |
# | 序号 | 如:在周字段设置5#2,代表每月的第二个周五 |
。
示例: 每2秒执行一次:0/5 ? 每5分钟执行一次:0 0/5 * ? 1分、12分、45分执行一次:0 1,12,45 * ? 每天23点59分59秒执行一次:59 59 23 ? 每月15号凌晨3点执行一次:0 0 3 15 * ? 每月最后一天12点执行一次:0 0 12 l * ?
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://segmentfault.com/a/1190000018145078 。
最后此篇关于SpringBoot下使用定时任务的方式全揭秘(6种)的文章就讲到这里了,如果你想了解更多关于SpringBoot下使用定时任务的方式全揭秘(6种)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!