我们有一个项目中用到了多个子项目,即将多个子项目的连接地址整合在一起。在客户部署环境中,有一个主终端,负责接受用户登陆,在登陆时,由用户选择最终要登陆的子系统。当输入登陆信息之后,由主终端负责解析用户名和密码,待验证通过之后,再通过主终端负责将用户信息直接发往子系统并通过子系统接口转入到后台操作界面。整个流程就类似于一个统一授权中心,由主终端负责用户授权和访问,在获得授权之后,就可以直接操作子系统了。
前几天在客户方将数据copy回来并进行分析时,发现在首页显示其它子系统时非常的慢,甚至慢到不能忍受的地步。但这种情况在客户环境中并没有发现。待仔细地查看了数据逻辑处理,发现了后台在列举子系统数据时,首先需要判断当前的子系统是否能够连接,即有一个如下的连接代码:
/** 指定的子系统是否是断开连接的 */ public static boolean isOffline(SubSystem subSystem) { String url = subSystem.getRequestAddress(); try { URL requestURL = new URL(url); HttpURLConnection urlConnection = (HttpURLConnection) requestURL.openConnection(); urlConnection.connect(); urlConnection.disconnect(); return false; } catch(Exception ignore) { return true; } }
就是由于这段代码,导致系统长时间停留在这段处理代码中。发现代码在处理connect时,半天无法响应。由于数据是在客户方copy回来了,所要连接的子系统的ip地址为192.168.1.99,而当前在笔者机器的ip为192.168.0.*,即在连接子系统时会无法连接,但这个连接不到所返回的时间也太长了。
笔者测试了下时间,这段连接不的代码在windows下的异常时间(即开始连接到发生异常的时间)为20秒,而linux下这个时间就长了,达到了180秒,即java要经过180秒才能发现这个连接根本就连接不上。
笔者又在cmd下通过ping,来测试一下连接时间,也是发现连接时间长时间也没有响应。