IT源码网

java之vertx 中的并行/并发调用

daizhj 2024年10月01日 程序员 41 0

我正在从后端数据库(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); 
    }); 
  } 

希望这有帮助


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!