一、問題描述
項目中通過配置Context節點docBase,使docBase指向項目的絕對路徑,可以直接通過IP加端口訪問,今日發現意外bug,項目中某個功能奇數次執行成功,偶數次執行失敗。
二、問題排查
這種現象應該是兩次使用的為不同的對象,通過debug確認問題。但是本來是單例模式實現的實例,調用的時候卻不是同一個實例,經過排查發現是Tomcat加載war包兩次導致的。
三、解決辦法
修改Tomcat的/conf/server.xml文件
1、將Host標簽中的appBase置為空,在webapps同級目錄創建app目錄,將war放入,Context的docBase指向這個絕對路徑,注意別放在webapps下,如下配置:
<Host name="localhost" appBase="" unpackWARs="true" autoDeploy="true"> <!-- 這里我的war包是web.war --> <Context docBase="/home/opt/apache-tomcat-8.0.35-web/app/web" path="" reloadable="true"></Context> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host>
2、在HOST標簽中deployIgnore=".*web.*",其他不做修改。
<HOST deployIgnore=".*web.*"> <Context docBase="/home/opt/apache-tomcat-8.0.35-web/webapps/web" path="" reloadable="true"></Context>