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