2017-09-21 18 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 JsonObject loadJsonObject() {のこの代わりに、我々はreturn future;をすることができ、そして未来が残っているものFuture<JsonObject> future = Future.future();

として定義されるだろうreturn null;のは、それが到着したときにデータを置くことであることを意味public Future<JsonObject> loadJsonObject() {

で始めてみましょう:

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; 
    } 

ところで、CompositeFuture.all()を使ってすべての先物を待つこともできます。

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