报错信息如下:
[2023-01-04 13:36:02.185]-ERROR-[biz:aplus-task-oms1060189862335877121][sys:aplus-cms-tran1060189866052390912][com.phfund.aplus.cms.tran.module.counter.service.impl.OcrServiceImpl-102][调用远程服务发送文件异常:]
cn.hutool.http.HttpException: Error writing to server
at cn.hutool.http.HttpResponse.init(HttpResponse.java:423)
at cn.hutool.http.HttpResponse.initWithDisconnect(HttpResponse.java:396)
at cn.hutool.http.HttpResponse.+init+(HttpResponse.java:76)
at cn.hutool.http.HttpRequest.execute(HttpRequest.java:966)
at cn.hutool.http.HttpRequest.execute(HttpRequest.java:930)
at com.phfund.aplus.cms.tran.module.counter.service.impl.OcrServiceImpl.sendDataToOcr(OcrServiceImpl.java:82)
分析
排查出该报错为外调其他系统时发生,当传入参数数据过大(10M左右)就会必现
工具类
开始以为是hutool工具类发送请求参数过大的问题,换成apache自带的HTTP工具类,结果依然出现报错
报错如下:
Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method) ~[na:1.6.0_43]
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) ~[na:1.6.0_43]
at java.net.SocketOutputStream.write(SocketOutputStream.java:136) ~[na:1.6.0_43]
请求方
初步猜测是请求方将数据上传给服务端时写入有误
1、是不是请求方HTTP链接时间过短,导致数据还没有传递完就断开了。所以设置了HTTP超时时间为30s,测试仍旧会报错。
2、或许请求方还有别的设置有问题,现在换了一个本地的服务发送同样的数据,发现成功了,所以现在开始怀疑的服务方的问题
3、用POSTMAN发送请求到服务方,报错一致,更加坚定是服务方的问题
服务方
果然在服务方有报错:
01-04 16:26:54.443 ERROR [c.d.a.framework.boot.error.RestExceptionTranslator] - 消息不能读取
01-04 16:26:54.451 ERROR [c.d.a.framework.boot.error.RestExceptionTranslator] - 消息不能读取
01-04 16:26:54.460 ERROR [c.d.a.framework.boot.error.RestExceptionTranslator] - 消息不能读取
01-04 16:26:54.471 ERROR [c.d.a.framework.boot.error.RestExceptionTranslator] - 消息不能读取
接收请求的buffer设置得有点小,然后关闭了TCP连接,请求方没拿到HTTP报错返回,再继续写TCP连接得时候,遇到了关闭TCP得错误,所以打了这个日志
查询资料,发现springboot在接收文件和request请求时,会设置默认的大小,参数如下:
将maxRequestSize调大,测试,可行