第3章 Eclipse Vert.x 4 で変更された内容
本セクションでは、Eclipse Vert.x 4 リリースと 3.x リリースの基本的な相違点を説明します。
3.1. 非同期操作に future メソッドを使用
Eclipse Vert.x 4 は、非同期操作に future を使用します。すべての callback メソッドには、対応する future メソッドがあります。Future は非同期操作の作成に使用できます。Callback と future メソッドの組み合わせを使用して、callback ベースのアプリケーションを Eclipse Vert.x 4 に移行できます。ただし、非同期操作の callback を引き続き使用することもできます。
以下の例は、Eclipse Vert.x 3.x リリースでコールバックが非同期操作に使用される方法を示しています。
WebClient client = WebClient.create(vertx); HttpRequest request = client.get("/resource"); request.send(ar -> { if (ar.succeeded()) { HttpResponse response = ar.result(); } else { Throwable error = ar.cause(); } });
WebClient client = WebClient.create(vertx);
HttpRequest request = client.get("/resource");
request.send(ar -> {
if (ar.succeeded()) {
HttpResponse response = ar.result();
} else {
Throwable error = ar.cause();
}
});
以下の例は、Eclipse Vert.x 4 で callback メソッドと future メソッドを非同期操作に使用する方法を示しています。
WebClient client = WebClient.create(vertx); HttpRequest request = client.get("/resource"); Future<HttpResponse> response = request.send(); response.onComplete(ar -> { if (ar.succeeded()) { HttpResponse response = ar.result(); } else { Throwable failure = ar.cause(); } });
WebClient client = WebClient.create(vertx);
HttpRequest request = client.get("/resource");
Future<HttpResponse> response = request.send();
response.onComplete(ar -> {
if (ar.succeeded()) {
HttpResponse response = ar.result();
} else {
Throwable failure = ar.cause();
}
});
Future でエラー処理が改善されました。Callback では構成の各段階で障害を処理する必要がありますが、future は障害を一度処理できます。基本的なアプリケーションでは、コールバックと future の使用との違いに気付かない場合があります。
以下の例は、callback を使用して 2 つの非同期操作を作成する方法を示しています。すべての構成でエラーが処理されることが確認できます。
client.get("/resource1").send(ar1 -> { if (ar1.succeeded()) { HttpResponse response = ar.result(); JsonObject json = response.body(); client.put("/resource2").sendJsonObject(ar2 -> { if (ar2.succeeded()) { // Handle final result } else { Throwable failure2 = ar.cause(); } }); } else { Throwable failure1 = ar.cause(); } });
client.get("/resource1").send(ar1 -> {
if (ar1.succeeded()) {
HttpResponse response = ar.result();
JsonObject json = response.body();
client.put("/resource2").sendJsonObject(ar2 -> {
if (ar2.succeeded()) {
// Handle final result
} else {
Throwable failure2 = ar.cause();
}
});
} else {
Throwable failure1 = ar.cause();
}
});
以下の例は、Eclipse Vert.x 4 で callback および future を使用して 2 つの非同期操作を作成する方法を示しています。エラーは最後に一度のみ処理されます。
Future<HttpResponse> fut1 = client.get("/resource1").send(); Future<HttpResponse> fut2 = fut1.compose(response -> client.put("/resource2").sendJsonObject(response.body())); fut2.onComplete(ar -> { if (ar.succeeded()) { // Handle final result } else { Throwable failure = ar.cause(); } });
Future<HttpResponse> fut1 = client.get("/resource1").send();
Future<HttpResponse> fut2 = fut1.compose(response -> client.put("/resource2").sendJsonObject(response.body()));
fut2.onComplete(ar -> {
if (ar.succeeded()) {
// Handle final result
} else {
Throwable failure = ar.cause();
}
});