摘要:背景項(xiàng)目中通過遠(yuǎn)程調(diào)用服務(wù)框架調(diào)用了許多其它的服務(wù)其中有一個(gè)服務(wù)需要升級其升級不是版本上的升級而是整個(gè)服務(wù)重新取了一個(gè)名字使用的也是全新的包但是調(diào)用的方法沒有改變因此在升級時(shí)只是在調(diào)用服務(wù)類中修改了調(diào)用地址和調(diào)用返回實(shí)體由改為該中返回該調(diào)用
背景
項(xiàng)目中通過遠(yuǎn)程調(diào)用服務(wù)框架調(diào)用了許多其它的服務(wù),其中有一個(gè)服務(wù)wx/subscribe/contract/CircleService 需要升級,其升級不是版本上的升級,而是整個(gè)服務(wù)重新取了一個(gè)名字,使用的也是全新的jar包wuxian/social/contract/SocialService,但是調(diào)用的方法沒有改變,因此在升級時(shí),只是在調(diào)用服務(wù)service類中修改了調(diào)用地址,和調(diào)用返回實(shí)體(由CircleService改為SocialService),該service中返回該調(diào)用實(shí)體使用的是static方法.修改完畢過后本地運(yùn)行一切正常,于是將修改service的class文件以及對應(yīng)的jar包上到沙箱環(huán)境,并將沙箱環(huán)境中原來的CircleService jar包刪除,然后重啟,但是報(bào)錯(cuò)了.代碼修改如下:
將
private static volatile CircleService subCircleService = null; subCircleService = ProxyFactory.create(CircleService .class,"tcp://circle/CircleServiceImpl" ); public static CircleService getSubCircleService() { return subCircleService; }
修改為
private static volatile SocialService subCircleService = null; subCircleService = ProxyFactory.create(SocialService.class,"tcp://social/SocialServiceImpl" ); public static SocialService getSubCircleService() { return subCircleService; }
其它地方的調(diào)用都是用類名+方法名(SCFService.getSubCircleService())的方式訪問,故此,在修改時(shí)只改動(dòng)了這個(gè)文件,其它文件都沒有修改,增量上線的時(shí)候也只上線該文件即可.
報(bào)錯(cuò)現(xiàn)象重啟服務(wù)器的時(shí)候無法啟動(dòng)服務(wù),一直報(bào)如下錯(cuò)誤
錯(cuò)誤內(nèi)容為找不到wx/subscribe/contract/CircleService這個(gè)jar包提供的方法,很奇怪為什么會提示這個(gè)錯(cuò)誤,剛開始懷疑是上線的class文件有問題,沙箱上部署class文件沒有成功,還是原來的文件,所以又部署了一次,但是還是報(bào)同樣的錯(cuò)誤.
解決過程將部署到沙箱上的文件下載下來,進(jìn)行反編譯,看引用中是否存在CircleService相關(guān)的jar包應(yīng)用,結(jié)果反編譯后,發(fā)現(xiàn)報(bào)錯(cuò)的文件中都沒有CircleService相關(guān)的jar包引用,于是在cmd窗口中使用javap編譯class文件
javap -v xx.class > D:/result.txt
使用該命令后,在result.txt中的常量池中,驚人的發(fā)現(xiàn)居然還有引用CircleService相關(guān)jar包的行
故此解開了為何代碼中為何會報(bào)上述錯(cuò)誤的問題,于是將雖然代碼沒有改動(dòng),但是重新編譯過后的class文件上到沙箱,重啟,結(jié)果果然沒有報(bào)錯(cuò)了,于是上線.但是上線過后才發(fā)現(xiàn),其它類在訪問時(shí)候才會調(diào)用該方法的類依舊會報(bào)上述錯(cuò)誤,于是重新檢查了一遍所有引用過上述修改過的方法的類,將重新編譯過后的文件都上線,才解決了報(bào)錯(cuò)的問題,這就是增量上線class文件引發(fā)的一起血案.
思考我們觀察在在上述報(bào)錯(cuò)中,報(bào)錯(cuò)內(nèi)容為NoSuchMethodError,而不是ClassNotFound,這是為什么呢?在其它代碼引用上述修改的方法時(shí),都是通過SCFService.getSubCircleService()的方式調(diào)用,而沒有寫返回類,在調(diào)用上述方法時(shí),老的class文件常量池中,getSubCircleService()返回的是CircleService方法,而新上線的SCFService中該方法的返回值已經(jīng)修改為SocialService,故此會先報(bào)NoSuchMethodError錯(cuò)誤.
這種錯(cuò)誤類似于我們在常量類中定義
public static final CONST = 100;
后,要修改常量CONST值為1000后,只增量上線了該常量class文件,而其它引用該常量的類的文件都更新上線所引發(fā)的CONST依舊為100的問題.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70417.html
摘要:除非使用了分塊編碼,否則首部就是帶有實(shí)體主體的報(bào)文必須使用的。 背景 新項(xiàng)目上線, 發(fā)現(xiàn)一個(gè)奇怪的BUG, 請求接口有很小的概率返回400 Bad Request,拿到日志記錄的請求的參數(shù)于POSTMAN中測試請求接口, 發(fā)現(xiàn)能夠正常響應(yīng). 排查過程 首先服務(wù)器能夠正常響應(yīng)400 Bad Request, 排除接口故障問題. 對比日志過程中發(fā)現(xiàn) { hello:world ...
摘要:項(xiàng)目組長給我看了一道面試別人的面試題。打鐵趁熱,再來一道題來加深下理解。作者以樂之名本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。 showImg(https://segmentfault.com/img/bVbur0z?w=600&h=400); 剛?cè)肼毿鹿荆瑢儆诠久刃乱幻?,一天下午對著屏幕看代碼架構(gòu)時(shí)。BI項(xiàng)目組長給我看了一道面試別人的JS面試題。 雖然答對了,但把理由說錯(cuò)了,照樣不及格。 ...
摘要:在群里討論,然后得出了這幾種寫法,感覺是層層遞進(jìn),想了想,最后選擇發(fā)布成文章大頭兒子小頭爸爸叫去吃飯大頭兒子小頭爸爸叫去吃飯大頭兒子小頭爸爸叫去吃飯吃完了背小頭兒子回去正在牽著的手正在吃給所有對象擴(kuò)展一個(gè)繼承的方法繼承爸爸要繼承人的功能正在 在群里討論JavaScript,然后得出了這幾種寫法,感覺是層層遞進(jìn),想了想,最后選擇發(fā)布成文章 ({ baby : 大頭兒子, ...
摘要:在我們向廠商提交漏洞,發(fā)布了相關(guān)的漏洞分析文章后,由于內(nèi)聯(lián)函數(shù)導(dǎo)致的類似安全問題在其他的應(yīng)用程序中陸續(xù)曝出。淺析的函數(shù)自帶了一個(gè)內(nèi)聯(lián)函數(shù)用于在應(yīng)用程序中發(fā)送電子郵件。 前言 在我們 挖掘PHP應(yīng)用程序漏洞 的過程中,我們向著名的Webmail服務(wù)提供商 Roundcube 提交了一個(gè)遠(yuǎn)程命令執(zhí)行漏洞( CVE-2016-9920 )。該漏洞允許攻擊者通過利用Roundcube接口發(fā)送一...
摘要:但是在這個(gè)判斷的情況下,則會很神奇的發(fā)現(xiàn)打印出來了,說明此時(shí)為,為什么呢因?yàn)檫@里執(zhí)行了一個(gè)對象到布爾值的轉(zhuǎn)換故返回。 ????之前做項(xiàng)目的時(shí)候,總會處理各式各樣的數(shù)據(jù),來進(jìn)行繪圖。但是當(dāng)后臺返回一個(gè)空數(shù)組的時(shí)候,頁面中并不會顯示沒有數(shù)據(jù)的圖。代碼如下: var arr = [] if(arr){console.log(124)}else{console.log(無數(shù)據(jù))} 我明明判斷了...
閱讀 1355·2021-11-11 16:54
閱讀 2398·2021-09-22 10:51
閱讀 2663·2019-08-30 15:44
閱讀 3214·2019-08-29 17:05
閱讀 1459·2019-08-29 17:01
閱讀 2918·2019-08-29 12:28
閱讀 2481·2019-08-26 13:50
閱讀 1738·2019-08-23 16:47