问题描述:
工行代发单提交银企失败,银行报文日志显示:读取流失败,Server returned HTTP response code: 500 for URL。详细日志如下:
[2023-03-10 10:42:28,108 ERROR] 支付业务过程中出现异常。
com.kingdee.bos.ebgateway.exception.BankServiceException: 读取流失败
…………
Caused by: java.io.IOException: Server returned HTTP response code: 500 for URL: http://xxx.xxx.xxx.xxx:448/servlet/ICBCCMPAPIReqServlet
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
at com.kingdee.bos.ebgateway.communication.protocol.impl.HttpClientImpl.getInputStream(HttpClientImpl.java:104)
查询付款状态又提示:
交易未确认
银行返回:同步付款状态信息=没有符合条件的记录
银企返回:银行报文头返回错误码无法确认付款状态
分析解答:
现场反馈,早上付款成功了一笔之后,再去发起付款,还是返回读取流失败。
对比了付款成功和付款失败的银行报文,发现付款成功的这笔只有一笔付款,付款失败的有多笔付款(批量支付)。
通过分析日志,看到读取流失败都是在发送请求到工行前置机的时候抛出来的。
付款成功的这笔日志显示发送的字节比较少;而付款失败的几笔,日志显示发送的字节比较多。
由此,分析可能是跟前置机的配置有关,获取到工行前置机的error.log日志,发现在付款失败的时间点工行前置机抛出了如下错误:
[2023-03-10 11:46:54,222] - [cn.com.infosec.nc.service.Https] [100008]Exception in HTTPS work thread
java.lang.Exception: data length MUST less than 10240 bytes
at cn.com.infosec.nc.util.http.HttpRequest.receiveRequest(Unknown Source)
at cn.com.infosec.nc.service.HttpsWorker.run(Unknown Source)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
据现场反馈,之前付款是正常的,近期重装了工行前置机之后才出现的问题;结合上面错误信息,可以推断,前置机上应该有某个配置限制了前置机可以接收的报文的长度。将这个error.log日志发给工行人员,排查是下面这个参数做了限制,如下图所示:
通过调大这个参数解决了批量支付失败的问题:
拓展:
如何取工行前置机的日志,可以看这个帖子:https://vip.kingdee.com/article/381497655941335040?productLineId=8)
推荐阅读