springboot 定時任務部署至linux服務器上后會執行兩次問題


springboot定時任務在本地運行時,正常執行且只執行一次,但是在maven打包成war包,部署至linux服務器上之后,定時任務奇怪的執行了兩次。

由於未做負載均衡,所以可以先排除是因為多台服務器都運行此代碼導致。

參考了網上的一些資料后了解到,是因為定時任務被實例化了兩次的緣故,這個現象歸根到底問題出在tomcat的service.xml的配置上。

在service.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="emall" path="/" reloadable="true" />  
</Host>  

 

由於配置了appBase="webapps"和docBase="emall",原因是tomcat加載完appBase="webapps"之后又去加載docBase,因此造成加載兩次項目的問題。

解決辦法:

將 appBase="webapps"改成appBase="",將docBase="emall" 改成項目的絕對路徑docBase="/usr/local/src/tomcat-emall/webapps/emall" ,這樣,在tomcat啟動后只會去加載一次docBase,重啟tomcat,問題解決!!

參考:https://blog.csdn.net/yaobengen/article/details/70312663

后來發現了因為這樣的配置出現的一下現象:

如果在webapps文件夾中沒有emall項目文件夾(非壓縮包),則在啟動服務的時候會在tomcat根目錄下生成一個ROOT的文件夾,里面則是emall項目的源文件。

如果在webapps文件夾下已經存在emall項目文件夾,則在啟動服務的時候不會生成上述的ROOT文件夾,項目的源文件會在此emall文件夾下。

關於appBase與docBase的區別與聯系,可以參考https://blog.csdn.net/chenxiaodan_danny/article/details/45397765

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM