4

Kotlin,Gradle,M7およびWeb-reactiveを選択して、Spring Initializrから新しいプロジェクトを作成しました。私はデータベースに三人を保存しようサブスクリプションの仕事とブロックがSpring反応Mongoにないのはなぜですか?

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 
    } 
} 

は、私は小さなプロジェクトを作りました。 saveメソッドは、実行する必要がある Monoを返します。私は単純に加入することによって、それを実行しようとすると、すべてが素敵な作品:

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 

私は手動でデータベースを照会する場合は、私が見ますそのジムが保存されましたが、JackとJohnは保存されていません。

これはバグですか、何か間違っていますか?私は、コードがそれ以上になる前にユーザがデータベースにいることを保証したいので、私は本当にblockを使いたいと思います。

私はそれが関連しているかどうかわからないが、私は、コンストラクタ

最小限の作業例があるに非最終プロパティtemplateへのアクセス

警告コンパイラを取得します。それは2つの枝を含んでいる。 1つは問題の回避策です。

https://github.com/martin-drozdik/spring-mongo-bug-example

答えて

2

私は、これはSpringフレームワークのバグ/ユーザビリティの問題かもしれないと思います。

まず、私はsubscribeblockとの違いを強調してみましょう:

  • subscribe方法が作業をキックオフし、すぐに戻ります。したがって、アプリケーションの他の部分が実行されたときに操作が行われるという保証はありません。
  • blockは、ブロック操作です。操作をトリガーし、その完了を待ちます。

    blockを使用して、あなたが述べてきたように
    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(); 
    

    は、アプリケーションがハング:初期化作業、操作を構成し、一度ブロックを呼び出すための

は、おそらく最良の選択です。私はこれがSpringコンテキストの初期化の問題である可能性があると思う - 私が正しく覚えていれば、このプロセスはいくつかの部分では単一のスレッドを仮定し、反応パイプラインを使用して、

(Java/Spring Boot/Spring Data Reactive Mongoを使用して)最小サンプルアプリケーションを作成し、それをhttps://jira.spring.ioに報告できますか?

+0

ありがとうございました!私はすでに、Github https://github.com/spring-projects/spring-boot/issues/11438#issuecomment-354259225に関するMWEの問題をhttps://github.com/martin-drozdik/spring-mongo-に公開しました。バグの例(回避策のあるブランチでも)が閉じられました。開発者はそれをSOに置くだけで十分だと教えてくれました。私はJiraに代わりにそれを掲示すべきですか? –

+0

はい、これはSpring Frameworkの問題ではなく、Spring Bootの問題だと思います。だから私があなたに与えたJiraリンクはうまくいくはずです。 –

+0

完了:https://jira.spring.io/browse/DATAMONGO-1841 –

関連する問題