Socket发送请求“超时”——接收数据方式引起的bug

Socket发送请求“超时”——接收数据方式引起的bug


一、场景描述

前段时间对接某家银行的资管外围系统,测试环境测试通过,联调报告经银行风控部门审批通过,上线时出现严重问题(不能正常发送/接收请求):发送请求成功、接收数据失败并抛出SocketTimeoutException。

对接使用的技术:Socket(接触的两家银行(一家股份制商业银行、一家国有银行(四大行之一))的外围系统都是使用Socket,是不是银行对外接口大多使用Socket?)

二、分析过程

出现问题后,马上向银行方技术团队反馈,希望他们能够给出一些有效的解决方案;首先要确定的就是他们是否接收到请求,因为他们没有权限登录到服务器查看信息,所以只能第二天去看(正好第二天要去投产),所以约定好投产之后查看日志确定是否接受到请求(第二天告诉我没收到我们这边的请求,表示很无奈);我这边也跟踪一下路由,看看网络通信这些是否正常,使用traceroute命令看时并没有发现问题,发送/接收都很正常。这时候猜想可能是银行方给的请求的jar有点小瑕疵。在对接群里找其他接入方问问吧,看看他们有没有出现过类似的问题,我勒个去,除了我 没人有这问题。

个人感觉代码的问题应该也不大,但就是不知道问题在哪(后来问银行的技术团队,他们的告诉我那个jar(其实就是几个java文件)后来改过,但是他们手上没有最新的,要第二天才能给我,找其他对接方要吧,人在出差得回去才能给我)。

没办法,只能根据他们说的问题自己改了(原来的接收数据方式比较慢);首先试了下把超时时间加大,从原来的60秒增加到120秒(我的天,一个请求完成大概用了70秒左右),接收数据正常,确定能够正常发送/接收后,改了下接收数据的方式(先获取数据长度,再根据长度获取报文数据)。

三、部分代码

原来的接收数据处理方式:

				// 接收消息
				BufferedReader socketIn = new BufferedReader(
						new InputStreamReader(sslSocket.getInputStream()));// 接受到的信息
				String rtnStr = "";
				String valueString = "";
				while ((valueString = socketIn.readLine()) != null) {
					rtnStr += valueString;
				}
				if (StringUtils.isEmpty(rtnStr) || rtnStr.length() <= 8) {
					throw new FcsAppException("SDER01", "银行无应答数据");
				}

更改后的接收数据处理方式:

				// 接收消息
				BufferedReader socketIn = new BufferedReader(
						new InputStreamReader(sslSocket.getInputStream()));// 接受到的信息
				char[] messageLenChars = new char[XML_MESSAGE_LENGTH];
				socketIn.read(messageLenChars);
				int dataLen = Integer.valueOf(new String(messageLenChars));// 先获取报文长度
				String rtnStr = "";
				if (dataLen > 0) {
					char[] dataChars = new char[dataLen];
					socketIn.read(dataChars);
					rtnStr = new String(dataChars);
				}
				if (StringUtils.isEmpty(rtnStr) || rtnStr.length() <= 8) {
					throw new FcsAppException("SDER01", "银行无应答数据");
				}

三、总结

测试环境使用的是Socket

正式环境使用的是SSLSocket


使用readLine时,连接正式环境出现SocketTimeoutException,可能是外围资管系统响应数据后没有主动结束,导致已知等待;已知数据长度,直接使用read(char[])读取数据,避免等待。



你可能感兴趣的:(工作记录,Socket)