ダウンストリーム バックエンド コールでリクエスト タイムアウトを設定する必要があります。しかし、Vert.x 3.9 の WebClient クラスは期待どおりに動作しないようです。そのためのテストコードを次に示します。
package client;
import io.vertx.reactivex.core.AbstractVerticle;
import io.vertx.reactivex.core.Vertx;
import io.vertx.reactivex.ext.web.client.WebClient;
public class Timeout extends AbstractVerticle {
private static final int port = 8080;
private static final String host = "localhost";
private static final int timeoutMilliseconds = 50;
@Override
public void start() {
WebClient client = WebClient.create(vertx);
for (int i = 0; i < 100; i++) {
client.get(port, host, "/").timeout(timeoutMilliseconds).send(
ar -> {
if (ar.succeeded()) {
System.out.println("Success!");
} else {
System.out.println("Fail: " + ar.cause().getMessage());
}
});
}
vertx.timerStream(1000).handler(aLong -> { vertx.close(); });
}
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
vertx.deployVerticle(new Timeout());
}
}
テストのために、同じホストで次の Go サーバーを実行しています。
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", HelloServer)
http.ListenAndServe(":8080", nil)
}
func HelloServer(w http.ResponseWriter, r *http.Request) {
fmt.Println("Saying hello!")
fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:])
}
私のテスト サーバーの出力は、WebClient が 5 つの同時接続を開き、すべての要求がタイムアウトによって停止されることを示しています。ここで何が間違っていますか?リクエストに接続タイムアウトを設定するにはどうすればよいですか? クライアントからの出力は次のとおりです。
Fail: The timeout period of 50ms has been exceeded while executing GET / for server localhost:8080
Fail: The timeout period of 50ms has been exceeded while executing GET / for server localhost:8080
Fail: The timeout period of 50ms has been exceeded while executing GET / for server localhost:8080
Fail: The timeout period of 50ms has been exceeded while executing GET / for server localhost:8080
Fail: The timeout period of 50ms has been exceeded while executing GET / for server localhost:8080
Fail: The timeout period of 50ms has been exceeded while executing GET / for server localhost:8080
Fail: The timeout period of 50ms has been exceeded while executing GET / for server localhost:8080
...
「成功!」だけが表示されると思います。これは、同じホストで実行されている Go サーバーが 50 ミリ秒以内に適切に応答するためです。
編集: vertx.close() を削除し、元の質問を明確にしました...実際には元のテスト コードに vertx.close() はありませんでしたが、SO 投稿を編集するときに追加したので、それを実行している人は必要ありません。 CTRL-C を押します。