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