SpringBoot2でReactor(RouterFunction)

現状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コメント

  • 1000 / 1000