摘要:背景项目中通过远程调用服务框架调用了许多其它的服务其中有一个服务需要升级其升级不是版本上的升级而是整个服务重新取了一个名字使用的也是全新的包但是调用的方法没有改变因此在升级时只是在调用服务类中修改了调用地址和调用返回实体由改为该中返回该调用
背景
项目中通过远程调用服务框架调用了许多其它的服务,其中有一个服务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的问题.
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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(无数据)} 我明明判断了...
阅读 1310·2021-11-11 16:54
阅读 2364·2021-09-22 10:51
阅读 2635·2019-08-30 15:44
阅读 3192·2019-08-29 17:05
阅读 1419·2019-08-29 17:01
阅读 2834·2019-08-29 12:28
阅读 2452·2019-08-26 13:50
阅读 1706·2019-08-23 16:47