私はそのMono<FooBar>
値に基づいてリアクティブリポジトリから取得します。他の2つのオブジェクトを作成し、リアクティブリポジトリを使用してそれらを保存し、FooBar
オブジェクトを変更して保存する必要があります。
私はリアクティブプログラミングに慣れていないので、次のソリューションを使用しました。これは機能していますが、リアクティブAPIを正しく使用しているかどうかはわかりません。
@Test
void createAndSave() {
Mono<FooBar> fooBarMono = findFooBar() // returns Mono<FooBar>
.map(fooBar -> {
createAndSaveLoremBar(fooBar).subscribe(); // returns Mono<LoremBar>
createAndSaveDoloremBar(fooBar).subscribe(); // returns Mono<DoloremBar>
fooBar.setActive(true);
return saveFooBar(fooBar); // returns Mono<FooBar>
}).flatMap(Function.identity());
StepVerifier.create(fooBarMono)
.expectNextMatches(Objects::nonNull)
.expectComplete()
.verify();
}
コンソールログから:
saved lorem bar
saved dolorem bar
saved foo bar
最初は、非同期(リアクティブ)の世界でオブジェクトを変更することはお勧めできません。
とにかく、あなたのソリューションでは、loremとdoloremの保存で発生する可能性のあるエラーは無視されます。あなたはそれを次のように改善することができます:
Mono<FooBar> fooBarMono = findFooBar()
.flatMap(fooBar -> Flux.merge(
createAndSaveLoremBar(fooBar),
createAndSaveDoloremBar(fooBar)) // asynchronously saving lorem and dolorem
.then(Mono.fromCallable(() -> { // if there wasn't errors, mutate and save fooBar
fooBar.setActive(true);
return fooBar;
}).flatMap(fooBar1 -> saveFooBar(fooBar1))));
fooBar
trueactive
フラグを使用してコピーを作成できれば、コードはより単純になる可能性があります。たとえば、lombokを使用します。
@Builder(toBuilder = true)
public class FooBar {
...
}
Mono<FooBar> fooBarMono = findFooBar()
.flatMap(fooBar -> Flux.merge(
createAndSaveLoremBar(fooBar),
createAndSaveDoloremBar(fooBar))
.then(saveFooBar(fooBar.toBuilder().active(true).build())));
また、結果に関心saveFooBar(...)
がなく、完了シグナルのみに関心がある場合は、3つすべての保存を非同期で行うことができます。
Flux<Object> flux = findFooBar()
.flatMapMany(fooBar -> Flux.merge(
createAndSaveLoremBar(fooBar),
createAndSaveDoloremBar(fooBar),
saveFooBar(fooBar.toBuilder().active(true).build())));
実際、最後のアプローチでは3つの結果すべてを収集でき、このアプローチを好むはずですが、完全な例を作成するためのクラスと要件に関する十分な情報がありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加