并发http请求到独立的Web服务

时间:2015-05-13 01:45:31

标签: java concurrency

我试图找到一种简单的方法将http请求同时发送到不同的Web服务。每个请求完全相互独立。

目前,我的实现看起来像这样(只是简化,不要注意设计)

让我们说我有一个List查询;

public class Service { 

       private List<HttpClient> httpClients; // one for each web service

       public List<QueryResult> doQueries(List<Query> queries) { 

               ExecutorService service = Executors.... ; 
               List<Callable<QueryResult>> .... ; 

               for ( Query q : queries ) { 
                          Future<> .....
               }

               service.invokeAll(...) ; 

                ***// what should i do from here ? 
                // how should i wait all those tasks to finish ?*** 


       }
}

我的问题是具体的。 我该怎么办?

2 个答案:

答案 0 :(得分:1)

您似乎创建了一个Callable列表,每个可调用对象都会从QueryResult返回List<Callable<QueryResult>>类型的结果。提交Future后,您将获得ExecutorService。所以以这种方式使用代码:

List<Future<QueryResult >> futures = executorService.invokeAll(callables);
for(Future<QueryResult> future : futures){
    System.out.println("future.get = " + future.get());
}
executorService.shutdown();

如果您想设置一些等待结果的最长时间,您也可以使用awaitTermination方法。 IMO ExecutorCompletionService更适合您的要求,您可以在dzone的文章中阅读相关内容。

答案 1 :(得分:0)

您有3个选择:

在单独的线程上执行每个请求。由于每个线程占用大量内存,如果&gt; 100个请求并行运行,则可以获得OutOfMemoreError。

以akhil_mittal建议限制线程数。并发请求的数量也将受到限制。

使用async io库,例如nio2。它们允许数千个同时具有适度内存消耗的请求。