1. 程式人生 > >springBoot 中定時任務在linux中執行了兩次

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) {
      return 
application.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 &quot;%r&quot; %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 &quot;%r&quot; %s %b" />

<Context docBase="/home/tomcat/baolide/tomcat/webapps/baolide" path="/" />

將appBase配置為空,然後docBase配置自己要部署專案的具體位置,重啟tomcat問題得到解決。