使用HttpClient在效率方面发布文件的最佳方式

时间:2013-10-03 20:46:18

标签: java httpclient load-testing

我必须构建一个相当自定义的负载测试工具,因此我不想使用JMeter(我们暂时假设使用jmeter无法完成自定义级别)。

此负载测试工具的一个导入部分是将XML发送到API端点。

如何改进以下代码以使其快速/高效?

private boolean PostErrorToApi() throws IOException {
       File xmlSample = new File("/path/to/file/sample.xml");

       CloseableHttpClient httpClient = HttpClients.createDefault();

       HttpPost httpPost = new HttpPost("http://localhost:8090/some/api/method/get/");
       httpPost.setEntity(new FileEntity(xmlSample, "text/xml, application/xml"));

       CloseableHttpResponse response = httpClient.execute(httpPost);

       String line = "";

       try {
           BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));

           while ((line = reader.readLine()) != null) {
               System.out.println(line);
           }
       } finally {
           response.close();
       }

       if (line.equals("200 OK"))
           return true;
       else
           return false;
   }

我的目标是每秒获得几千个请求(http延迟不应该是一个问题,因为这将是一个私有网络)。

我不是想在这里获得一个真实世界的场景,目标是看看这些服务是否可以保持48小时,并且只是为了监控可能出现的任何问题等。

1 个答案:

答案 0 :(得分:2)

主要是IO绑定任务,而不是CPU。 您可以尝试将文件缓存在内存中,而不是每次都从光盘读取它。 httpClient的缓存实例,使用相同的连接多次发送文件。在一个JVM中生成多个线程,每个线程将创建单独的连接。如果还不够,请创建多个流程,在不同的计算机上运行并收集结果

同样readLine将阻止,直到数据可用,因此您的任务将被卡住,您永远不会知道您是否有任何问题。设置SO_TIMEOUT以读取响应。