使用輕量級Spring @Scheduled註解執行定時任務

     WEB項目中須要加入一個定時執行任務,可使用Quartz來實現,因爲項目就一個定時任務,因此想簡單點,不用去配置那些Quartz的配置文件,因此就採用了Spring @Scheduled註解來實現了定時任務。在這裏作個備註。web

 

spring配置文件  xmlns中加入一段:spring

xmlns:task="http://www.springframework.org/schema/task"  

而後xsi:schemaLocation多加下面的內容:app

http://www.springframework.org/schema/task  
http://www.springframework.org/schema/task/spring-task-3.1.xsd  

配置文件中啓動TASK註解:spa

<task:annotation-driven/>  
<context:annotation-config/> 
<context:component-scan base-package="com.xx.xx"/>

編寫JAVA代碼:.net

@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表達式和fixedRatedebug

兩種均可以定時每隔一段時間執行,我的以爲兩種方式區別是fixedTate方式是應用啓動時候會先執行一次,cron表達式能配置更加複雜的狀況。日誌

 

我的使用中出現了2個問題:code

1.項目啓動時候會報出No qualifying bean of type [org.springframework.scheduling.TaskScheduler] is defined異常信息:component

  解決:這個錯誤問題實際上是debug級別輸出,就是不影響定時任務的使用,在網上看到別人有這樣解釋xml

  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>
相關文章
相關標籤/搜索