0:12:2881[http-nio-8200-exec-3]ERRORy.s.GlobalExceptionHandler-[handleRuntimeException,82]-请求地址’/doit’,发生未知异常.orspringframeworhttp.converter.HttpMessageNotReadableException:JSONparseerror:Illegalcharacter((CTRL-CHAR,code:onlyregularwhitespace( , , )isallowedbetweentokens;nestedexceptioniscofasterxmjacksocorJsonParseException:Illegalcharacter((CTRL-CHAR,code:onlyregularwhitespace( , , )isallowedbetweentokens
问题分析
为什么每次传一条数据可以,但是传输列表的时候就出错了呢?
此时,Feign的配置如下:
# feign 配置
feign:
sentinel:
enabled: true
okhttp:
enabled: true
httpclient:
enabled: false
client:
config:
default:
connectTimeout: 10000
readTimeout: 10000
compression:
request:
enabled: true
response:
enabled: true
结合以前配置Nginx时的gzip压缩的经验,感觉这跟Feign的压缩配置有关系。可参考官方文档:https://docs.sprinio/spring-cloud-openfeign/docs/0.3/reference/html/#feign-requestresponse-compression
在一个定时任务中,每隔一个小时会调用远程接口进行数据同步。本着“先实现,再优化”的原则,刚开始实现方式是在循环里每次调用远程接口,传入单条记录,因为每次都需要完成建立连接、数据传输、断开连接的操作,这样的话比较耗费网络与连接资源;后来测试没问题后,就改成了在循环完成后传入一个List进行批量操作,然后问题出现了。
从配置中,我们可以了解到当前配置开启了请求与响应的压缩功能。我们知道,什么时候进行压缩其实跟请求体的大小有关,如果本身请求的数据体较小,完全可以不进行压缩直接传输即可,这样可以节省压缩用的CPU资源;那么我们可以大胆地猜测:压缩是有一个阈值的,超过某个阈值才会进行压缩。这可以解释前面的疑问:为什么每次传一条数据可以,但是传输列表的时候就出错了呢?
环境信息
解决方法
用到的OpenFeign的版本信息:
明确了问题的原因,解决起来就比较容易了。我们可以简单粗暴地将压缩关闭即可。。
https://docs.sprinio/spring-cloud-openfeign/docs/0.3/reference/html/#feign-requestresponse-compression
文章为作者独立观点,不代表股票交易接口观点