springBoot 中定時任務在linux中執行了兩次
首先, springboot定時任務的實現步驟:
1. 啟動類添加註解
@SpringBootApplication @EnableScheduling public class BaolideApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(BaolideApplication.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { returnapplication.sources(BaolideApplication.class); }
}
2. 執行類中添加註解和cron表示式
@Scheduled(cron = "0 30 0,4,8,10,12,16,20 * * ?") public void job(){ Date start=new Date(); insertPersonInfo(); //自定義方法 下面同樣 Date end=new Date(); insertTime(start,end); }
因為這裡我有一個insertTime方法是記錄插入時間的,發現專案部署在linux的tomcat中,每次都執行了兩次,就在想為什麼會這樣,
首先這裡程式碼肯定是沒錯的,在本地也只能執行一次,那麼對比只有兩個地方不一樣,就是作業系統不同,再具體一點就是
一個是windows下的tomcat一個是linux中的tomcat,然後觀察linux中tomcat專案啟動的時候,發現日誌中tomcat啟動了
兩次,這樣就不難想象定時任務的例項就被例項化了兩次,因為spring容器中的bean例項預設是單例且是在容器啟動的時候
初始化,問題知道了,那怎麼解決呢?
那麼就要看tomcat的server.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 docBase="baolide" path="/" />
首先把註釋的東西都刪掉,重點是在標紅的地方,tomcat在啟動的時候先去載入appBase又去載入docBase導致載入了兩次,那麼知道原因了就好解決了,修改一下以上的配置檔案就好:
<Host name="localhost" appBase=""
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 docBase="/home/tomcat/baolide/tomcat/webapps/baolide" path="/" />
將appBase配置為空,然後docBase配置自己要部署專案的具體位置,重啟tomcat問題得到解決。