方法参数由int改成了Integer引发的惨案

今天早上来收到报障,视频生产流程不同了,都进不了lego,经排查,一个pingback服务访问超时,程序每次访问都起一个线程,由于服务已经挂掉了,占用太多的线程不能释放,服务坚挺了1天后,终于OutOfMemoryError: unable to create new native thread了。

 

经了解pingback的服务已经被人下线了,机器都找不着了,听说是个没有的东西,所以决定把代码中相关的逻辑都去掉。发现同事负责的模块也需要修改,让他一起修改。总共改了三四个模块,到1点钟终于上线完成了,好了吃饭去。吃完饭往回走的路上,收到别人反馈,给我发了一张图,曲线开始下降 的时间刚好是上线的时间,吓死宝宝了,赶快查,半天没有查出来问题,赶快回滚,回滚完还是没有好。后来发现我查错地方了,根本不需要回滚,汗,查到原因是没有meta所以流程中止,同时接到反馈api服务报500错误,不能设置meta。终于对上了,最终查到500错误的原因是,

把:

public boolean isPPSAppList(int appId) {

boolean result = false;

List wirtelist = opConfigService.getChildrenNodes("pps_app_id_list");

if(wirtelist != null && wirtelist.size() > 0) {

for(OpConfig config : wirtelist) {

String value = config.getValue();

if(appId == StringUtil.parseInt(value)) {

return true;

}

}

}

return result;

}

 

改成了:

public boolean isPPSAppList(Integer appId) {

if(appId == null){

return false;

}

boolean result = false;

List wirtelist = opConfigService.getChildrenNodes("pps_app_id_list");

if(wirtelist != null && wirtelist.size() > 0) {

for(OpConfig config : wirtelist) {

String value = config.getValue();

if(appId == StringUtil.parseInt(value)) {

return true;

}

}

}

 

修改了方法的参数声明,导致了:

java.lang.NoSuchMethodError: com.qiyi.videocloud.openplatform.service.thridparty.PpsugcService.isPPSAppList(I)Z

com.qiyi.openplatform.api.FileController.uploadMeta(FileController.java:986)

sun.reflect.GeneratedMethodAccessor612.invoke(Unknown Source)

sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

java.lang.reflect.Method.invoke(Method.java:601)

 

org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)

 

把方法的参数由int改成interger竟然会出NoSuchMethod,好想不通,后来看到这篇文章http://blog.csdn.net/zgs_shmily/article/details/46604059  和http://blog.csdn.net/yuan_hai_long/article/details/51490850 略懂。原来编译器是会严格按照参数的类型和返回值来查找方法的,lib库修改了参数,没有编译调用方,调用方还按照之前的方法参数和返回值去找,就是找不到的。我去问了同事,他说他是整体编译的。我让他在测试环境重现一下这个问题,果真也出了问题,然后他再调用的类里面加了行日志,再次运行,就好了,因为加了日志就编译器就会重现编译。调用方和lib库同时做了修改就没有问题了,之前是用mvn package打包的,编译器发现java类没有变化所以没有重新编译,少了一个clean费了这么大的周折,也算是涨知识了。

你可能感兴趣的:(java,基础)