使用Webflux和Kotlin的Spring Boot :从订阅的Mono内部执行CRUD操作失败

rvpgvaaj  于 2022-11-05  发布在  Spring
关注(0)|答案(1)|浏览(218)

我正在测试如何从“jsonplaceholder”API查询数据,并将接收到的数据保存到本地Postgresql数据库中。当我从Postman发出调用时,“jsonplaceholder”正确地返回了接收到的数据,但奇怪的是,数据库中没有存储任何内容。也许我的代码中遗漏了一些东西(见下),我不知道!这是一个Sping Boot 应用程序,使用Webflux和Kotlin以及Postgres的SQL作为本地数据库。提前感谢您的帮助!
第一个问题:

guz6ccqo

guz6ccqo1#

问题是你试图在数据库中保存帖子的方式。
此时不保存,因为这部分代码没有时间执行。subscribe并不意味着主线程将在执行完这些行后完成。

ret.log().subscribe(
            {
                val x:List<Post> = it.body as List<Post>
                for (t in x){
                    print(t)
                    appService.createPost(t)
                }
            },null,
            { }
        )

在你的例子中,保存是在一个单独的线程上运行的,它不会阻塞主线程。主线程在保存操作发生之前完成。这就是为什么数据库是空的。
保存发布操作应该是你已经拥有的React流的一部分。如果你把它放在Map到ResponseEntity之前,你将忽略来自响应实体的额外Map来再次发布。
这样应该可以。

return appService.fetchPosts()
            .take(3)
            .flatMap { appService.createPost(it) }
            .collectList()
            .map { body -> ResponseEntity.ok().body(body) }
            .toMono()

相关问题