我正在从后端数据库(vertx代码)读取数据,每行都有一个url,我将在该url上对状态字段执行“GET”http请求作为响应,我将其存储回数据库并发送到UI。
CreateRequests 方法发出 http 请求。我想同时执行此操作。
List<Future> toComplete=new ArrayList<>();
Vertx vertx = Vertx.vertx();int i;
for(i=0;i<requestsListInDept.size();i++)
{
String reqtype = requestsListInDept.getString(i);
JsonObject requestProperties = dataReader.getRequestProperties(dept,reqtype);
toComplete.add(Future.future());
int currrent=i;
vertx.executeBlocking(future->{
System.out.println("calling for ");
String individualResponse = accReq.createRequests(requestContext,reqtype,empid,requestProperties);
toComplete.get(currrent).complete(individualResponse);
future.complete(individualResponse);
},false,res->{
JsonArray obj=new JsonArray( (res.result()).toString() );
for(int index=0;index<obj.size();index++)
{
JsonObject requestResponse=obj.getJsonObject(index);
response.add(requestResponse);
}
toComplete.get(currrent).complete(res.result());
});
}
CompositeFuture.all(toComplete).setHandler(e -> {
String collect = e.result()
.list()
.stream()
.map(Object::toString)
.collect(Collectors.joining(" ------- "));
System.out.println(collect);
});
return ;
如何有效地进行并发获取调用并组合响应(我将发送到 UI)并将它们存储回数据库
我正在循环所有网址并在循环中发出获取请求。如果有大量数据,我会超时(这是显而易见的)
请您参考如下方法:
Vert.x 使用 react 器模式,因此您可以使用该模式而不是多线程和executeBlocking 获得类似的结果。仅当无法支持该模式时才建议在 Vert.x 中使用多线程和阻塞调用(这意味着没有异步方法可以做到这一点)。
也许这个例子可以帮助你
public void doCall() {
List<Future> toComplete = new ArrayList<>();
WebClientOptions options = new WebClientOptions().setSsl(true);
WebClient webClient = WebClient.create(Vertx.vertx(), options);
IntStream.range(0, 15).forEach(counter -> {
toComplete.add(Future.future());
int current = counter;
webClient.get(443, "google.com", "/")
.send(httpResponseAsyncResult -> {
String googleResult = httpResponseAsyncResult.result().bodyAsString();
toComplete.get(current).complete(googleResult);
});
System.out.println("Calling google: times " + ++counter);
});
CompositeFuture.all(toComplete).setHandler(e -> {
String collect = e.result()
.list()
.stream()
.map(Object::toString)
.collect(Collectors.joining(" ------- "));
System.out.println(collect);
});
}
希望这有帮助