2017-09-21 5 views
2

Java VertX 프레임 워크를 사용 중이고 VertX WebClient 및 간단한 HTTP 요청을 사용하여 여러 JSON 개체를로드하려고합니다. 나는 이것을 병렬로 수행하여 프로세스 속도를 높이고 싶습니다. 나는에서 계속하는 방법을 잘 모르겠습니다VertX HTTP 요청 병렬 처리

public static void useCompletableFutureWithExecutor(List<Endpoint> tasks) { 
    long start = System.nanoTime(); 
    ExecutorService executor = Executors.newFixedThreadPool(Math.min(tasks.size(), 10)); 
    List<CompletableFuture<JsonObject>> futures = 
     tasks.stream() 
      .map(t -> CompletableFuture.supplyAsync(() -> t.loadJsonObject(), executor)) 
      .collect(Collectors.toList()); 

    List<JsonObject> result = 
     futures.stream() 
       .map(CompletableFuture::join) 
       .collect(Collectors.toList()); 
    long duration = (System.nanoTime() - start)/1_000_000; 
    System.out.printf("Processed %d tasks in %d millis\n", tasks.size(), duration); 
    System.out.println(result); 
    executor.shutdown(); 
} 

: 내가 병렬 (source을)이 처리해야 다음과 같은 기능을 가지고 다른 클래스에서

import io.vertx.core.Vertx; 
import io.vertx.core.json.JsonObject; 
import io.vertx.ext.web.client.WebClient; 
import io.vertx.ext.web.codec.BodyCodec; 

public final class Endpoint { 

    private final String name; 
    private final String url; 

    public Endpoint (String name, String url) { 
     this.name = name; 
     this.url = url; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getUrl() { 
     return url; 
    } 

    public JsonObject loadJsonObject() { 
     WebClient client = WebClient.create(Vertx.vertx()); 
     client.getAbs(this.getUrl()).as(BodyCodec.jsonObject()).send(handler -> { 
      // what to do 
     }); 
     return null; 
    } 

} 

:

나는 끝점 개체가 이. VertX WebClient는 비동기 처리기를 사용하도록 강제합니다. 즉, JsonObject를 직접 반환 할 수 없습니다.

답변

0

문제는 서명에 있습니다. 이 의미 public Future<JsonObject> loadJsonObject() {

로 대신 public JsonObject loadJsonObject() {의 시작하자 대신 우리가 return future;을 할 수 있고, 미래가 남아 무엇 Future<JsonObject> future = Future.future();

가 도착하면 데이터를 넣어 같이 정의 될 수 return null;의 :

future.complete(result); 

최종 결과는 다음과 같습니다.

public Future<JsonObject> loadJsonObject() { 
     WebClient client = WebClient.create(Vertx.vertx()); 
     Future<JsonObject> future = Future.future(); 
     client.getAbs(this.getUrl()).as(BodyCodec.jsonObject()).send(handler -> { 
      // Do something with JSON and put in result 
      future.complete(result); 

      // Remember to future.fail() in case something went wrong 
     }); 
     return future; 
    } 

BTW, CompositeFuture.all()을 사용하여 모든 선물을 기다릴 수도 있습니다.

http://vertx.io/docs/vertx-core/java/#_async_coordination