你是不是經(jīng)常這么想, 假如有一天我能寫服務(wù)端程序, 我就能自己做出balabalabala .
最近在學(xué)習(xí)Java
做后臺,這可能是每個程序員必經(jīng)之路,Java
的好處不必多談,畢竟是第一大語言,掌握它只有百利而無一害,如果你有扎實的面向?qū)ο罄斫饽芰δ茏屇憧焖偕鲜炙?而且,它也是Android
的切入點. 呵呵. 確實前臺會寫接口之后, 就可以去做一個有夢想的人了.
很多人說java
開發(fā)麻煩,服務(wù)器麻煩,接觸下來發(fā)現(xiàn)并非說得那樣,仁者見仁,有些事情要自己體會了才有感受,相對于嚴(yán)謹(jǐn)?shù)膞code開發(fā)環(huán)境,確實在服務(wù)器配置上,有各種配置是比較耽誤時間的,但這些東西,一旦過去了就不是問題了,我差不多用了一周的時間就能寫自己的api
,完成一些企業(yè)應(yīng)用的小項目.說白了,用于一般的業(yè)務(wù),后臺無非是MVC
和數(shù)據(jù)庫. 學(xué)java主要學(xué)習(xí)ssh框架. 或者你也可以找一套restful框架, 就能給自己的移動端做接口了. 很有意思 .
好了, 開始正文吧,本文記錄一個帶有ServletContextListener
定時器應(yīng)用出現(xiàn)的問題,并且本地運行一切正常,只有在服務(wù)器上才會出現(xiàn),需要對Tomcat
有個小小的理解.
這里提到的是除了直接把項目.war
文件夾放在webapps
里之外的方式.
為什么要提這個?
這要扯到Tomcat
中ServletContextListener
監(jiān)聽器重復(fù)執(zhí)行的問題
做一個Tomcat
的ServletContextListener
監(jiān)聽腰鬼,在系統(tǒng)啟動時創(chuàng)建一個定時器袁滥,在定時器任務(wù)中判斷時間并做相關(guān)操作。這步怎么做網(wǎng)上有很多,就不再說明了。
問題是妻怎,系統(tǒng)部署到Tomcat
下之后,這個定時器里執(zhí)行的方法會被執(zhí)行兩次.
并不是程序問題,而是tomcat
配置的問題, 這簡直就是坑爹.
原因是這樣的,我將項目的war
包放在webapps
目錄下渠概,Tomcat啟動時會解壓并部署。然后在Tomcat的server.xml
中配置了虛擬目錄嫂拴,讓用戶輸入網(wǎng)站域名可以直接訪問高氮。
這樣就在Tomcat
下啟動了兩個項目系統(tǒng),雖然用戶只用其中一個系統(tǒng)顷牌,但兩個系統(tǒng)中的ServletContextListener
的定時器都會執(zhí)行剪芍。所以只需要將項目放到其他目錄,只要不在webapps目錄下就行窟蓝。經(jīng)測試罪裹,問題解決!
方式如下:
在tomcat\conf\server.xml
中的<host></host>
內(nèi)部添加<context/>
標(biāo)簽:<Context debug="0" docBase="D:\demo1\web" path="/demo1" privileged="true" reloadable="true"/>
docBase:
是項目路徑运挫,可以使用絕對路徑或相對路徑状共,相對路徑是相對于webapps path:
訪問項目的路徑,如:http://127.0.0.1:8080/demo1
reloadable:
是否自動加載新增或改變的class
文件.