spring 定時任務@Scheduled (spring-task註解形式)

sping 中定時任務的實現大概有三種

1. ava自帶的java.util.Timer類

2.使用Quartz

3.spring-task


第一種可以讓你的程序按照某一個頻度執行,但不能在指定時間運行,所以不做介紹

第二種功能強大,配置相對較麻煩,不做介紹

我使用的是spring-task的註解方式

前兩種詳細的介紹可參考文章  http://gong1208.iteye.com/blog/1773177


簡單demo測試 


package xhsoft.yxd.admin.task;

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * @author WangMeng
 * @date 2017年1月16日
 */
@Component
@EnableScheduling
// 通過@EnableScheduling註解開啓對計劃任務的支持
public class TaskTest
{

	@Scheduled(cron = "1/10 * * * * ?")
	// 通過@Scheduled聲明該方法是計劃任務 使用cron屬性可按照指定時間執行 具體用法可查詢 “cron表達式”的相關資料
	void testA()
	{
		System.out.println("定時任務A每10秒執行次。。");
	}

	@Scheduled(cron = "1/5 * * * * ?")
	void testB()
	{
		System.out.println("定時任務B每5秒執行次。。");
	}

}


運行結果:

定時任務B每5秒執行次。。
定時任務B每5秒執行次。。
定時任務A每10秒執行次。。
定時任務B每5秒執行次。。
定時任務A每10秒執行次。。
定時任務B每5秒執行次。。

在測試過程中遇到一個問題,就是定時任務執行了兩次,排查原因發現整個spring 容器被加載了兩次,所以原因出在tomcat服務器上

當時的servlet.xml的配置是


 <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
      
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
   <Context debug="0" docBase="xinghan-yxd-web" path="/yxd" privileged="true" reloadable="false"/>
      </Host>

經過查資料瞭解到  host 節點中的appBase屬性值爲webapps,這裏的意思是會加載webapps下的所有目錄,Context 節點中的docBase 屬性值爲xinghan-yxd-web,這裏用了相對路徑,這個項目也在webapps下面,所以又加載了一次,所以我這裏的配置是有問題的,一般情況下Context 節點中的docBase 配置的項目應該不在webapps下面的


解決方法就是  把項目移到別的目錄下


主要是理解 Host  Context 兩個節點作用  

詳細的tomcat 的servlet.xml配置文件說明,參考文章 http://blog.163.com/jxguo_05/blog/static/7194010020106810953194/



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章