您好,登錄后才能下訂單哦!
一、spring定時(shí)任務(wù)執(zhí)行兩次
問題重現(xiàn)和解析
最近使用quartz定時(shí)任務(wù)框架,結(jié)果發(fā)現(xiàn)開發(fā)環(huán)境執(zhí)行無任何問題,部署到服務(wù)器上后,發(fā)現(xiàn)同一時(shí)間任務(wù)執(zhí)行了多次。經(jīng)過搜索發(fā)現(xiàn)是服務(wù)器上tomcat的配置文件出現(xiàn)了問題。
原來的配置文件——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" /> </Host> <Host name="www.xxx.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="/usr/local/tomcat/apache-tomcat-8.5.9/webapps/xxxindex" reloadable="true"></Context> </Host>
一個(gè)Host表示一個(gè)容器,里面可以包含若干個(gè)Context(應(yīng)用)。上面這段配置文件意思就是:在tomcat中配置了兩個(gè)容器,一個(gè)name=localhost,應(yīng)用的根目錄為webapps,并且會(huì)自動(dòng)解壓war包和自動(dòng)部署。沒有指定context,會(huì)把根目錄下的所有web應(yīng)用都部署,部署成功后,外網(wǎng)可以通過服務(wù)器IP+項(xiàng)目名來訪問;另一個(gè)name=www.xxx.com,和第一個(gè)host不同在于,配置了主頁web應(yīng)用,且不需要跟項(xiàng)目名就可以訪問。部署成功后可以通過域名+項(xiàng)目名訪問,主頁所在項(xiàng)目可以直接通過根域名訪問。
這個(gè)時(shí)候問題就來了,包含定時(shí)任務(wù)的項(xiàng)目部署在webapps目錄下,tomcat中兩個(gè)獨(dú)立的容器都部署了一遍,相當(dāng)于項(xiàng)目在服務(wù)器上的tomcat上部署了兩次,兩邊同時(shí)會(huì)運(yùn)行定時(shí)任務(wù),指定的是同一個(gè)數(shù)據(jù)庫。
問題解決
因此,為了盡可能不影響其他項(xiàng)目的正常訪問,我做了折中,講需要執(zhí)行定時(shí)任務(wù)的項(xiàng)目單獨(dú)部署在另一個(gè)文件夾中,例如webroot ,然后只使用域名那個(gè)host,配置文件修改后如下:
<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" /> </Host> <Host name="www.xxx.com" appBase="" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="/usr/local/tomcat/apache-tomcat-8.5.9/webapps/xxxindex" reloadable="true"></Context> <Context path="/projectA" docBase="/usr/local/tomcat/apache-tomcat-8.5.9/webapps/projectA" reloadable="true"></Context> <Context path="/projectB" docBase="/usr/local/tomcat/apache-tomcat-8.5.9/webapps/projectB" reloadable="true"></Context> <Context path="/projectC" docBase="/usr/local/tomcat/apache-tomcat-8.5.9/webroot/projectC" reloadable="true"></Context> </Host>
可以看到projectC是包含定時(shí)任務(wù)的項(xiàng)目。這樣部署成功后,除了該項(xiàng)目只能通過域名訪問之外,其余項(xiàng)目的訪問方式和之前保持不變。同時(shí)問題解決,定時(shí)任務(wù)只執(zhí)行一次。
網(wǎng)上的另一種說法
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context docBase="projectA" path="" reloadable="true" /> </Host>
只有一個(gè)host,tomcat在啟動(dòng)時(shí),會(huì)部署一次根目錄下的所有項(xiàng)目,然后Context又會(huì)單獨(dú)部署一次,所以也會(huì)導(dǎo)致定時(shí)任務(wù)執(zhí)行2次。
對(duì)于這種問題,解決的方案也有多種:
二、tomcat部署緩慢的問題
用的阿里云服務(wù)器,部署tomcat時(shí)速度非常慢,但是后來買的新阿里云又沒有這個(gè)問題。部署項(xiàng)目后一直會(huì)在
INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /opt/apache-tomcat-8.0.15-server/webapps/ROOT
這里卡好幾分鐘才會(huì)繼續(xù)下去。之前一直以為是服務(wù)器配置原因,后來無意中發(fā)現(xiàn)是jre的配置原因。參考了幾篇博客,發(fā)現(xiàn)oracle在WebLogic的文檔下Avoiding JVM Delays Caused by Random Number Generation給了原因和解決方案。
The library used for random number generation in Sun's JVM relies on /dev/random by default for UNIX platforms. This can potentially block the WebLogic SIP Server process because on some operating systems /dev/random waits for a certain amount of "noise" to be generated on the host machine before returning a result. Although /dev/random is more secure, BEA recommends using /dev/urandom if the default JVM configuration delays WebLogic SIP Server startup.
意思就是:
修改方式:
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。