私は春のwebfluxを勉強していて、理解できない状況に直面しています。
春バージョン= 2.2.4.RELEASE私のコンピューターには4つのコアがあります。
私のクラス:
@RestController
@RequestMapping("rest/v1/")
public class RootController {
private final WebClient webClient =
WebClient.create("http://localhost:8081");
@GetMapping("/booking")
public Mono book() {
return Mono.just("A");
}
@GetMapping("/sleep")
public Mono<String> sleep(@RequestParam("time") long time) throws InterruptedException {
System.out.printf("Thread name is %s, date is %s. \n", Thread.currentThread().getName(), new Date());
String uri = "/rest/v1/sleep?time=" + time;
String uuid = UUID.randomUUID().toString();
System.out.println(">>>>>>>>>>>>" + uuid);
Mono<String> stringMono = webClient.get().uri(uri)
.retrieve()
.bodyToMono(String.class);
System.out.printf("Finish -> Thread name is %s, date is %s. \n", Thread.currentThread().getName(), new Date());
return stringMono;
}
}
私のマシンには別のアプリケーションがあり、ポート8081で実行されています。このエンドポイントは、paramが受け取った時間だけスリープします。
目標は、遅いエンドポイントを呼び出したときのwebfluxの動作をテストすることです。
私はこのようなリクエストを実行しています:
http:// localhost:8082 / rest / v1 / sleep?time = 20000
この場合、応答には20秒かかります。
この期間中に別のリクエストを実行すると、コントローラーはリクエストを処理せず、このリクエストの終了(20秒)を待ち続けます。
Springはネットワーク呼び出しを待っている間に別のリクエストを処理する必要がありますか?
これはログです:
Thread name is reactor-http-epoll-3, date is Sat May 16 19:06:54 BRT 2020.
>>>>>>>>>>>>22b36a46-e36b-4104-981a-e132483a334e
Finish -> Thread name is reactor-http-epoll-3, date is Sat May 16 19:06:54 BRT 2020.
Thread name is reactor-http-epoll-3, date is Sat May 16 19:07:14 BRT 2020.
>>>>>>>>>>>>076a0eec-3bb1-485a-ab88-9b11c6b9a5bd
Finish -> Thread name is reactor-http-epoll-3, date is Sat May 16 19:07:14 BRT 2020.
問題は、「MartinTarjányi」がコメントで言ったように、私のリクエストをキューに入れているクロムの問題でした:
Chromeブラウザからエンドポイントにアクセスしましたか?理由はわかりませんが、同様の問題が発生しました。覚えていますが、FirefoxでもEdgeでもうまくいきました。別のアプリからプログラムで呼び出すこともできます。編集:stackoverflow.com/a/53236741/6051176
どうもありがとう@MartinTarjányi
他のクライアントを使用したリクエストまたはパラメータの変更はうまく機能します。同じリソースChromeがリクエストをキューに入れます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加