現状SpringBoot2でReactorをやる場合、STSでSpringBoot2M2プロジェクトを生成後、
spring-boot-starter-reactor-nettyとspring-webfluxを追加する。(Maven/Gradle)
以下のような感じで、RouterFunctionを返すルータを作れば、Nettyが起動され動作確認ができる。
@Bean
public RouterFunction<ServerResponse> routes() {
return route(GET("/"), req -> ok().body(UserService.getUser(req), Object.class));
}
せっかくのノンブロッキングなので、複数のAPIを呼んで、待ち合わせして応答するなどは
以下のような感じでできそう。
public static Mono<Object> getUser(ServerRequest req) {
WebClient client = WebClient.create("http://localhost:8080/");
return Mono.create(sink -> {
Mono.when(
client.get().uri("/api1/").retrieve().bodyToMono(String.class),
client.get().uri("/api2/").retrieve().bodyToMono(String.class),
client.get().uri("/api3/").retrieve().bodyToMono(String.class),
client.get().uri("/api4/").retrieve().bodyToMono(String.class),
client.get().uri("/api5/").retrieve().bodyToMono(String.class),
client.get().uri("/api6/").retrieve().bodyToMono(String.class)
).subscribe(e -> {
sink.success(e.getT1() + "," + e.getT2() + "," + e.getT3() + "," + e.getT4() + "," + e.getT5() + "," + e.getT6());
});
});
}
Mono.createをリターンするようにすることで、一旦Monoを返して終了し、非同期処理が終わってからレスポンスされる。
また、Mono.whenとsubscribeで並列実行を行い、結果をTupleで受け取れるので、まとめてMonoで返すことができる。
ちなみに、Mono.whenの引数は6個が限界っぽい。
0コメント