场景:
系统一通过FeignClient进行调用系统二导出Excel文件时,系统一导出的文件损坏或数据不全问题
问题寻找思路:
通过postman调用系统二的接口并下载文件并没有出现之前问题,也就是文件损坏或者是文件丢失数据问题。然后进行系统一的调查,每次请求响应体的长度都不一致,导致文件输出失败。
问题确定:
进行各种资料查找后,观察到文件的生成是先通过response.asInputStream,再通过response.availabel()生成一个字节数组,然后进行返回,但是这里有一个问题,InputStream类的available()方法读取字节的时候,能知道有多少字节需要读取,这个方法从本地读取数据一般不会出现什么问题。但是通过网络FeignClient传输就有可能出现数据间断传输问题,因为网络通讯是间断性的一串字节往往分几批进行发送。本地程度调用availabel()方法有时得到0,这可能是对方还没有响应,也可能是对方已经响应了,但是数据还没有送达本地。对方比如发送了9000个字节给你,可续分成3批到达,这就可能得调用3此available()方法才能将数据总数全部得到。