如何发送并行POST请求Java

时间:2015-05-27 18:06:24

标签: java multithreading

我目前正在尝试加载测试服务器。由于我无法控制的问题,我无法使用jmeter进行测试。什么是创建一组线程的最佳方法,让每个线程在同一时刻发送帖子,或者尽可能接近它?我的当前实现在运行发送到服务器的POST的方法之前创建了许多带有for循环的线程。但这根本不是并发的。

3 个答案:

答案 0 :(得分:3)

我想你会想要在群集中执行此操作,而不是在同一台计算机上的多个线程中执行此操作,除非您的计算机具有多个网络接口卡(NIC)。你的瓶颈不是核心,而是你的网卡。您的NIC仍将按顺序清空其缓冲区。

我建议您拥有尽可能多的机器群集。在每台机器上,有一些线程(只是为了确保NIC的缓冲区保持满)。不要打扰同步群集以同时发送请求,因为往返时间(RTT)将花费太长时间,它将使您的负载测试无效。让每个Thread锤走了......从统计学上讲,只要你的集群足够大,你就必须同时获得几个POST请求。

答案 1 :(得分:1)

假设这个问题只是同步你的线程,而不是创建/运行线程,那么我建议CountDownLatch。链接中的示例很棒。

答案 2 :(得分:0)

我肯定会建议使用一些负载测试应用程序框架。有很多可供选择。

话虽如此,你可以使用这样的东西开始。这将是我从哪里开始的。您需要实现libraries方法。至少可以说,这不是很强大。没有记录,没有报告没有错误处理 - 所有这些都是“免费”(对于“免费”的某些定义)和负载测试应用程序。

performRequest

您可能想要做出的一些值得注意的改进

  • 默认线程池非常小。它等于系统上的CPU核心数。创建自己的public class HttpClient { enum RequestType{ POST,GET } private RequestType type; private String url; public HttpClient(RequestType rt, String url){ type = rt; this.url = url; } public void performRequest(){ // your code here. } public static void main(String[] args){ List<HttpClient> clients = new ArrayList<>(); int clientCount = Integer.parseInt(args[0]); String url = args[1]; for(int i=0; i<clientCount; i++){ clients.add(new HttpClient(RequestType.POST,url)); } clients.parallelStream().forEach(HttpClient::performRequest); } } 实例可以让您获得更大的控制权。
  • 移动到一个单独的类来启动和解析args会好得多。