参考地址:http://www.cnblogs.com/chen-lhx/p/5581129.html
spring中使用定时任务
基于xml配置文件使用定时任务
首先配置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
25
26
27
28
|
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd">
<
task:annotation-driven
/>
<!-- 定时器开关-->
<
bean
id
=
"myTask"
class
=
"com.spring.task.MyTask"
></
bean
>
<
task:scheduled-tasks
>
<!-- 这里表示的是每隔五秒执行一次 -->
<
task:scheduled
ref
=
"myTask"
method
=
"show"
cron
=
"*/5 * * * * ?"
/>
<
task:scheduled
ref
=
"myTask"
method
=
"print"
cron
=
"*/10 * * * * ?"
/>
</
task:scheduled-tasks
>
<!-- 自动扫描的包名 -->
<
context:component-scan
base-package
=
"com.spring.task"
/>
</
beans
>
|
定义自己的任务执行逻辑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package
com.spring.task;
/**
* 定义任务
*/
public
class
MyTask {
public
void
show() {
System.out.println(
"show method 1"
);
}
public
void
print() {
System.out.println(
"print method 1"
);
}
}
|
基于注解使用定时任务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package
com.spring.task;
import
org.springframework.scheduling.annotation.Scheduled;
import
org.springframework.stereotype.Component;
/**
* 基于注解的定时器
*/
@Component
public
class
MyTask2 {
/**
* 定时计算。每天凌晨 01:00 执行一次
*/
@Scheduled
(cron =
"0 0 1 * * *"
)
public
void
show() {
System.out.println(
"show method 2"
);
}
/**
* 启动时执行一次,之后每隔2秒执行一次
*/
@Scheduled
(fixedRate =
1000
*
2
)
public
void
print() {
System.out.println(
"print method 2"
);
}
}
|
这样,当项目启动,定时任务就会按照规则按时执行了。
Spring Boot中使用定时任务
Spring Boot中使用更加方便。
引入springboot starter
包
1
2
3
4
|
<
dependency
>
<
groupId
>org.springframework.boot</
groupId
>
<
artifactId
>spring-boot-starter</
artifactId
>
</
dependency
>
|
在程序入口启动类添加@EnableScheduling
,开启定时任务功能
1
2
3
4
5
6
7
|
@SpringBootApplication
@EnableScheduling
public
class
Application {
public
static
void
main(String[] args) {
SpringApplication.run(Application.
class
, args);
}
|
定义定时任务逻辑
1
2
3
4
5
6
7
8
9
10
|
@Component
public
class
MyTask3 {
private
int
count=
0
;
@Scheduled
(cron=
"*/6 * * * * ?"
)
private
void
process() {
System.out.println(
"this is scheduler task runing "
+(count++));
}
}
|
任务执行规则说明
先来看看@Scheduled
注解的源码
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 {
String cron()
default
""
;
String zone()
default
""
;
long
fixedDelay()
default
-
1
;
String fixedDelayString()
default
""
;
long
fixedRate()
default
-
1
;
String fixedRateString()
default
""
;
long
initialDelay()
default
-
1
;
String initialDelayString()
default
""
;
}
|
可以看出,注解中可以传8种参数:
- cron:指定cron表达式
- zone:默认使用服务器默认时区。可以设置为
java.util.TimeZone
中的zoneId - fixedDelay:从上一个任务完成开始到下一个任务开始的间隔,单位毫秒
- fixedDelayString:同上,时间值是
String
类型 - fixedRate:从上一个任务开始到下一个任务开始的间隔,单位毫秒
- fixedRateString:同上,时间值是
String
类型 - initialDelay:任务首次执行延迟的时间,单位毫秒
- initialDelayString:同上,时间值是
String
类型
cron表达式的使用方法