我试图找到一种简单的方法将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 ?***
}
}
我的问题是具体的。 我该怎么办?
答案 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。它们允许数千个同时具有适度内存消耗的请求。