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 "%r" %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/