处理{}的请求时遇到的I / O异常 - > http:// IP:80:打开的文件过多

时间:2015-09-20 21:37:36

标签: java rest stress-testing

我有这个架构,3个系统:

  1. 后端
  2. 中间件
  3. 前端(客户端应用程序)。
  4. 我在后端和中间件之间有休息的Web服务,还有前端和中间件之间的另一个不同的休息服务(如下图所示)

    enter image description here

    如上图所示,客户端正在调用中间件,而中间件正在调用后端休息服务。

    现在一切正常,当我运行少量请求时,但当我从客户端开始进行压力测试时(我使用JMeter进行此测试并调用中间件服务),我开始收到此异常

    enter image description here

    我正在使用此代码来调用后端服务:

    public static String makeHttpPostCall(String url2, String param1, String type,
                String username, String password) throws IOException {
    
            String response1 = "";
    
    
            CredentialsProvider credsProvider = new BasicCredentialsProvider();
            credsProvider.setCredentials(
                    AuthScope.ANY,
                    new UsernamePasswordCredentials(username, password));
    
            CloseableHttpClient client = HttpClients.custom()
                    .setDefaultCredentialsProvider(credsProvider)
                    .build();
    
    
                HttpPost post = new HttpPost(url2);
    
                List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
                urlParameters.add(new BasicNameValuePair("param1", param1));
                urlParameters.add(new BasicNameValuePair("type", type));
    
                post.setEntity(new UrlEncodedFormEntity(urlParameters));
    
                HttpResponse response = client.execute(post);
    
    
    
                System.out.println("Response Code : "+ response.getStatusLine().getStatusCode());
                BufferedReader rd = new BufferedReader(new InputStreamReader(
                        response.getEntity().getContent()));
    
    
                String line;
                while ((line = rd.readLine()) != null) {
                    response1 += line;
                }
                System.out.println("response1: "+ response1);
                return response1;
        }
    

    请有人告诉我中间件或后端的问题在哪里,为什么会发生?

1 个答案:

答案 0 :(得分:2)

您不关闭客户端http连接。尝试:

...
 }
            System.out.println("response1: "+ response1);

            client.close();

            return response1;
...

异常显示尝试打开新的http连接时发生错误。请注意,虽然它是一个网络连接,但对于底层操作系统来说,它只是一个开放的文件描述符。 如果您只拨打几个电话,gc可能会丢弃连接,一切似乎都很好。进行压力测试将打开尽可能多的“文件”,然后抛出此异常。