这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战
一次奇怪的hystrix异常解决方案
前文
本文仅为遇到的一次比较奇怪的技术问题,解决方案并非最佳。
问题描述
最近在处理一个springcloud项目,遇到了一个十分奇怪的问题。某一个接口负责从第三方拉取zip包,同时将zip包解压后,取其中的某个类型的文件,上传到本地的文件服务器中。今天在进行该操作的处理时,突然遇到了异常,org.apache.commons.io.IOUtils.readFully(Ljava/io/InputStream;[B)V、failed and encountered unrecoverable error,异常为熔断器所报。以上为问题背景。
排查思路
遇到问题首先进行了日志的排查,从日志中看到熔断器报告异常。同时检查了文件上传服务器的日志,并没有相关上传日志,也就是在上传过程中遭遇异常,请求并未到达文件服务器,问题内容应该出现在微服务请求发送方。而代码断点跟踪也是在发送前直接进入到catch部分代码。
try{
Result result = feignFileService.uploadAnonymous(multipartFile);
} catch (Exception e) {
e.printStackTrace();
}finally {
}
按此思路继续,在发送方的日志中查看到问题描述中的相关记录,目前了解到的信息为出现了一个熔断器意料之外的问题,同时该问题与io操作有关。至此,大概确定问题出现在io上。考虑到大概一周前代码是没有问题的,因此推断与本周内代码改动存在关系。由于该接口代码并未进行修改,因此推测与项目环境或项目包有关。
查看代码提交日志及请求调用堆栈,堆栈中能看到的信息大概与日志内容类似,而提交版本曾经对pom文件进行过改动。
<dependency>
<groupId>com.artofsolving</groupId>
<artifactId>jodconverter</artifactId>
<version>2.2.1</version>
</dependency>
如上所示,测试代码曾引用过一个测试包,该包与feign中io操作的版本产生了冲突。将上述无用包注释后即解决了题目所描述的问题。
总结
在引用包时一定要对版本信息有所了解,尤其要注意一下版本之间的冲突关系。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。