前言
在很多實際的web應用中,都有需要定時實現的服務,如每天12點推送個新聞,每隔一個小時提醒用戶休息一下眼睛,隔一段時間檢測用戶是否離線等等。
spring框架提供了對定時器的支持,通過配置文件就可以很好的實現定時器,只需要應用啟動,就自動啟動定時器。下面介紹一下具體做法。
第一種,使用XML配置的方法
前期工作,配置spring的開發環境(這里用到了spring的web應用包,需要導入)
首先創建定時器的任務類,定時器要做什么工作,就在這里寫什么方法。
1
2
3
4
5
6
7
8
9
10
11
12
|
package org.time; import java.util.TimerTask; public class MainTask extends TimerTask{ @Override public void run() { System.out.println( "檢測用戶是否掉線" ); } } |
接著在配置文件中對定時器進行配置。
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
|
<? xml version = "1.0" encoding = "UTF-8" ?> < beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:p = "http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> < bean id = "mainTask" class = "org.time.MainTask" ></ bean > <!-- 注冊定時器信息 --> < bean id = "springTask" class = "org.springframework.scheduling.timer.ScheduledTimerTask" > <!-- 延遲1秒執行首次任務 --> < property name = "delay" value = "1000" ></ property > <!-- 每隔2秒執行一次任務 --> < property name = "period" value = "2000" ></ property > <!-- 具體執行的任務 --> < property name = "timerTask" ref = "mainTask" ></ property > </ bean > <!-- 配置任務調度器工廠 --> < bean id = "timerFactory" class = "org.springframework.scheduling.timer.TimerFactoryBean" > < property name = "scheduledTimerTasks" > < list > < ref bean = "springTask" /> </ list > </ property > </ bean > </ beans > |
最后還需要在web.xml中對配置信息進行注冊:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<?xml version= "1.0" encoding= "UTF-8" ?> <web-app version= "2.5" xmlns= "http://java.sun.com/xml/ns/javaee" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http: //java.sun.com/xml/ns/javaee http: //java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <listener> <listener- class >org.springframework.web.context.ContextLoaderListener</listener- class > </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> </web-app> |
這樣就完成了定時器的配置,這時啟動tomcat,觀察控制臺輸出的結果:
第二種,使用注解的形式
(spring中一使用注解,感覺就是比其他方法方便了很多,代碼減少了很多)
這里需要用到AOP,需要引入AOP類庫
先看定時器的任務類:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package org.time; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class MainTask01{ @Scheduled (cron = "0/3 * * * * ?" ) public void run() { System.out.println( "推送消息來了" ); } } |
@Scheduled(cron = "0/3 * * * * ?") 表示三秒推送一次
corn可以配置各種時段任務:
字段 |
值 |
特殊表示字符 |
年 |
一般為空,1970-2099 |
, - * / |
月 |
1-12 或者 JAN-DEC |
, - * / |
星期 |
1-7 或者 SUN-SAT |
, - * ? / L C # |
日 |
1-31 |
, - * ? / L W C |
時 |
0-23 |
, - * / |
分 |
0-59 |
, - * / |
秒 |
0-59 |
, - * / |
如: 配置每個工作日的10:20觸發 :"0 20 10 ? * MON-FRI"
配置文件:
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
|
<? xml version = "1.0" encoding = "UTF-8" ?> < beans xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:tx = "http://www.springframework.org/schema/tx" xmlns:aop = "http://www.springframework.org/schema/aop" xmlns:context = "http://www.springframework.org/schema/context" xmlns:task = "http://www.springframework.org/schema/task" xmlns = "http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd"> < context:annotation-config /> <!-- spring掃描注解的配置 --> < context:component-scan base-package = "org.time" /> < task:annotation-driven scheduler = "qbScheduler" mode = "proxy" /> < task:scheduler id = "qbScheduler" pool-size = "10" /> </ beans > |
配置文件的頭部信息中比上一個引入了
1
2
3
|
xmlns:task="http://www.springframework.org/schema/task" http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd |
<task:annotation-driven scheduler="qbScheduler" mode="proxy"/>
<task:scheduler id="qbScheduler" pool-size="10"/>
這兩句配置信息是必須要寫的,這是spring識別@Scheduled注解的關鍵
這這樣簡單的幾句配置之后,開啟服務,運行結果:
spring中使用注解的方法完成定時器,不需要集成其他父類定時器,使用簡單方便!代碼量少,功能也很強大!
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://blog.csdn.net/weixin_36380516/article/details/72596834