私はプロジェクト新鮮なうちに作成春Initializrを選択することによりKotlin
、Gradle
、M7
とWeb-reactive
。
私は小さなプロジェクトを作りました:
data class Person (val id: String)
@Component class PersonHandler(val template: ReactiveMongoTemplate)
{
init
{
println("Initializing")
val jim: Mono<Person> = template.save(Person("Jim"))
val john: Mono<Person> = template.save(Person("John"))
val jack: Mono<Person> = template.save(Person("Jack"))
launch(jim)
launch(john)
launch(jack)
println("Finished Initializing")
}
fun launch(mono: Mono<Person>)
{
mono.subscribe({println(it.id)}, {println("Error")}) // This works
// mono.block() This just hangs
}
}
私は3人をデータベースに保存しようとしています。このsave
メソッドは、Mono
実行する必要があるaだけを返します。サブスクライブするだけで実行しようとすると、すべてがうまく機能します。
Initializing
Finished Initializing
2017-12-21 13:14:39.513 INFO 17278 --- [ Thread-13] org.mongodb.driver.connection : Opened connection [connectionId{localValue:3, serverValue:158}] to localhost:27017
2017-12-21 13:14:39.515 INFO 17278 --- [ Thread-12] org.mongodb.driver.connection : Opened connection [connectionId{localValue:4, serverValue:159}] to localhost:27017
2017-12-21 13:14:39.520 INFO 17278 --- [ Thread-14] org.mongodb.driver.connection : Opened connection [connectionId{localValue:5, serverValue:160}] to localhost:27017
Jim
Jack
John
ただし、アプリケーションのblock
代わりに使用するとsubscribe
、ハングします。
Initializing
2017-12-21 13:16:47.200 INFO 17463 --- [ Thread-14] org.mongodb.driver.connection : Opened connection [connectionId{localValue:3, serverValue:163}] to localhost:27017
データベースを手動でクエリすると、ジムは保存されていますが、ジャックとジョンは保存されていないことがわかります。
これはバグですか、それとも私は何か間違ったことをしていますか?コードが先に進む前に、ユーザーがデータベースにいることを保証したいので、本当に使用したいと思いますblock
。
関連性があるかどうかはわかりませんが、コンパイラの警告が表示されます
template
コンストラクターで非最終プロパティにアクセスする
最小限の実例があります。2つのブランチが含まれています。1つは、この問題の回避策です。
これはSpringFrameworkのバグ/ユーザビリティの問題かもしれないと思います。
まず、subscribe
との違いを強調しておきますblock
。
subscribe
すぐにメソッドの仕事キックオフと戻ります。したがって、アプリケーションの他の部分が実行されたときに操作が実行されるという保証はありません。block
はブロッキング操作です。操作をトリガーし、完了を待ちます。初期化作業の場合、操作の作成とブロックの1回の呼び出しがおそらく最良の選択です。
val jim: Mono<Person> = template.save(Person("Jim"))
val john: Mono<Person> = template.save(Person("John"))
val jack: Mono<Person> = template.save(Person("Jack"))
jim.then(john).then(jack).block();
あなたが述べたように、を使用block
するとアプリケーションがハングします。これはSpringコンテキストの初期化の問題である可能性があります-正しく覚えていれば、このプロセスは一部の部分で単一のスレッドを想定し、リアクティブパイプラインを使用して多くのスレッドで作業をスケジュールする可能性があります。
最小限のサンプルアプリケーションを作成して(Java / Spring Boot / Spring Data Reactive Mongoのみを使用)、https: //jira.spring.ioで報告できますか?
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加