昨天遇到個(gè)非常奇怪的bug:更新了一下后臺(tái)的代碼,結(jié)果每次點(diǎn)擊頁(yè)面都會(huì)導(dǎo)致servlet方法調(diào)用兩次,從而頁(yè)面報(bào)錯(cuò)(邏輯上不讓調(diào)兩次 ),我們的前臺(tái)采用gwt,servlet engine采用tomcat,debug的時(shí)候,斷點(diǎn)放在servlet所調(diào)用的method上,結(jié)果invoke兩次,由此斷定,前臺(tái)代碼的問題(有點(diǎn)武斷哦

),然后負(fù)責(zé)前臺(tái)的同事debugging前臺(tái)的代碼,噼里啪啦半天。。。,說是前臺(tái)好像沒有調(diào)兩次(之所以用好像,是debugging時(shí)部分代碼走兩次,部分走一次),而我當(dāng)時(shí)的想法是,后臺(tái)怎么操作,也不至于讓servlet調(diào)用兩次吧,所以我個(gè)人就認(rèn)定是前臺(tái)邏輯導(dǎo)致重復(fù)rpc調(diào)用(gwt),但是這個(gè)bug在這兩天才出現(xiàn)的,從svn的歷史記錄來(lái)看,前臺(tái)代碼在這兩天基本沒什么改變,同事只好從svn上一個(gè)version接一個(gè)version的check,最后確定出兩個(gè)相鄰的versions,前一個(gè)能用,后一個(gè)出bug,這時(shí)我隱約感覺到是后臺(tái)的問題,但是還是想不明白,后臺(tái)的邏輯怎么就能讓前臺(tái)重復(fù)調(diào)用,非常不解,沒辦法,在同事的建議下,在servlet的那個(gè)method上加上一條debug信息,做了兩次試驗(yàn),一次是完整的代碼,一次是把method中調(diào)用后臺(tái)的接口注釋掉,結(jié)果從日志上看出,前一次試驗(yàn)debug信息打印了兩次,后一次試驗(yàn)debug只打印了一次,此時(shí),確定是后臺(tái)邏輯影響了前臺(tái)的調(diào)用(此時(shí),覺得走彎路了,為什么不早點(diǎn)做這個(gè)試驗(yàn),其實(shí)確定是前臺(tái)還是后臺(tái)的問題,只需要做這樣一個(gè)簡(jiǎn)單的試驗(yàn)。。。)。接下來(lái),我思考的就是到底是什么在作怪呢,對(duì)比svn上的兩個(gè)版本,只有兩處可能的改動(dòng),一處是將return改成throw exception, 一處是調(diào)用了Thread.currentThread.interrupt(),我一個(gè)感覺是后者,注掉這句后,一切OK,呵呵,慶幸沒有先嘗試前者,要不改動(dòng)很大,。。。
剛剛看了gwt的源碼,還沒找到問題的根源,我的觀點(diǎn)是,thread接收到interrupt信號(hào)時(shí),會(huì)重復(fù)發(fā)送rpc調(diào)用,(呵呵,還沒確定)。。。