javascript
使用轻量级Spring @Scheduled注解执行定时任务
? ? ?WEB項目中需要加入一個定時執行任務,可以使用Quartz來實現,由于項目就一個定時任務,所以想簡單點,不用去配置那些Quartz的配置文件,所以就采用了Spring @Scheduled注解來實現了定時任務。在這里做個備注。
?
spring配置文件 ?xmlns中加入一段:
xmlns:task="http://www.springframework.org/schema/task"然后xsi:schemaLocation多加下面的內容:
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd配置文件中啟動TASK注解:
<task:annotation-driven/><context:annotation-config/>?
<context:component-scan?base-package="com.xx.xx"/>
編寫JAVA代碼:
@Component public class ScheduledTaskManager {/*** cron表達式:* * * * * *(共6位,使用空格隔開,具體如下)* cron表達式:*(秒0-59) *(分鐘0-59) *(小時0-23) *(日期1-31) *(月份1-12或是JAN-DEC) *(星期1-7或是SUN-SAT)*//*** 定時卡點計算。每天凌晨 02:00 執行一次*/@Scheduled(cron = "0 0 2 * * *")public void autoCardCalculate() {System.out.println("定時卡點計算... " + new Date());}/*** 心跳更新。啟動時執行一次,之后每隔1分鐘執行一次*/@Scheduled(fixedRate = 1000*60*1)public void heartbeat() {System.out.println("心跳更新... " + new Date());}}@Scheduled有兩種方式:cron表達式和fixedRate
兩種都可以定時每隔一段時間執行,個人覺得兩種方式區別是fixedTate方式是應用啟動時候會先執行一次,cron表達式能配置更加復雜的情況。
?
個人使用中出現了2個問題:
1.項目啟動時候會報出No qualifying bean of type [org.springframework.scheduling.TaskScheduler] is defined異常信息:
解決:這個錯誤問題其實是debug級別輸出,就是不影響定時任務的使用,在網上看到別人有這樣解釋
Spring的定時任務調度器會嘗試獲取一個注冊過的 task scheduler來做任務調度,它會嘗試通過BeanFactory.getBean的方法來獲取一個注冊過的scheduler bean,獲取的步驟如下: ?
a.嘗試從配置中找到一個TaskScheduler Bean ?
b.尋找ScheduledExecutorService Bean ?
c.使用默認的scheduler ?
前兩步,如果找不到的話,就會以debug的方式拋出異常,
分別是: ?logger.debug("Could not find default TaskScheduler bean", ex);
logger.debug("Could not find default ScheduledExecutorService bean", ex);
?所以,日志中打印出來的兩個異常,根本不是什么錯誤信息,也不會影響定時器的使用,只不過是spring的自己打印的一些信息罷了
?
如果想去掉這個輸出,可以在log4j配置文件中增加一行即可:
log4j.logger.org.springframework.scheduling = INFO?
?
2.發現定時任務每次執行都會執行兩次
這個問題后來發現是由于Spring的配置文件被加載了兩次造成的,listener和DispatcherServlet都會初始化spring配置文件,所有注釋掉listener即可
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:config/application-context.xml</param-value></context-param><!-- Spring監聽器 --><!--<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>--><!-- servlet設置,將所有請求接到org.springframework.web.servlet.DispatcherServlet進行處理 --><servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:config/application-context.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet>?
轉載于:https://www.cnblogs.com/lylife/p/5977574.html
總結
以上是生活随笔為你收集整理的使用轻量级Spring @Scheduled注解执行定时任务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 射灯安装方法图解_江苏天筑不锈钢雕塑厂家
- 下一篇: 蓝牙耳机测试软件apk_蓝牙耳机电量显示