1. ホーム
  2. java

[解決済み] ジップタイプの異なる3つのモノ

2022-02-18 05:20:17

質問

私はSpring Webfluxを使った新しいプロジェクトを始めましたが、このリアクティブ・コーディング・パラダイムについてはかなり初心者です。そのため、初心者のような質問をすることを事前にお詫びします。

私のコントローラメソッドは、レスポンスを Mono<ResponseEntity<String>> で、3つの異なるサービスを呼び出すと、3つの異なる Mono オブジェクトを作成します。

Mono<CustomObject> customMono = serivce1.method();
Mono<Boolean> booleanMono = service2.method();
Mono<String> stringMono = service3.method();

そこで、レスポンスを用意するために( Mono<ResponseEntity<String>> )、次のようなことをする必要があります。

Mono.zip(customMono, booleanMono, stringMono, (customData, booleanData, stringData) -> {
------
return Mono.just(ResponseEntity.ok().body("-----"));
});

問題は、そのような zip メソッドで3つの Mono と関数をパラメータとする。私はすでにこれを見つけました。 https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html#zip-reactor.core.publisher.Mono-reactor.core.publisher.Mono-java.util.function.BiFunction-

しかし、それは私の要件を満たしていない。そこで、私が直面している問題

  • を使用することができません。 Mono.mergeWith または Mono.concaWith というメソッドで、Monoオブジェクトの種類が異なるためです。
  • すべてのMonoをflatMap/mapし、チェーンを作ることができます。しかし、service2はservice1の呼び出しに依存しないので、別のスレッドで並列に呼び出されるようにしたい。しかし、service3の呼び出しはservice1のレスポンスに依存する。

要約すると、私がしなければならないこと。

  • 最初にservice1を呼び出す
  • サービス2を別スレッドで呼び出す
  • service1呼び出しデータに依存するservice3呼び出しを行う。
  • 最終的なレスポンスオブジェクトを生成する ( Mono<ResponseEntity<String>> ) のすべてのサービスコールのデータを使用しています。

よろしくお願いします。初心者なので、どんな提案でもありがたいです。

どのように解決するのですか?

特定の条件下では Mono.zipWhen() これにより、3番目のサービスコールは、サービスコール1からの応答から必要なデータを取得することができます。

Mono.zip(monoResponse1,monoResponse2).zipWhen(data ->serviceCall3(data.getT1())).flatMap(response ->{
    response.getT1().getT1();//response from mono1
    response.getT1().getT2();//response from mono 2
    response.getT2();//response from mono 3
    return {create your mono response here};
} );