Kotlin 协程 Coroutine 与 Spring Boot 项目整合的最佳实践是怎样的?

2023-09-11 23:07:09 +08:00
 Akitora

RT ,前几天无意间发现 Spring MVC + JDBC 经典组合中的事务与 Kotlin 协程似乎存在一定的兼容问题

依据 Spring 官方文档 的说明是,Spring 目前仅支持 R2DBC 事务与 Kotlin 协程的组合,JDBC 事务需要用到 ThreadLocal ,在协程中启动事务会出问题,相关讨论和问题可以参考以下链接:

Spring Framework GitHub Issue

Stack Overflow 问题

我目前对响应式框架的了解还不足,所以我想请教一下,是不是为了充分发挥 Kotlin 协程的优势,就必须将项目整体迁移到 WebFlux + R2DBC 下?

另外,我也想了解一下,即将到来的 JDK 21 的虚拟线程和 Kotlin 协程会有怎样的关系?

感谢各位的帮助与意见。

2764 次点击
所在节点    Kotlin
10 条回复
iPisces77
2023-09-11 23:11:37 +08:00
kt 协程也只有 webflux 支持的好,servlet 本身就没有原生支持 kotlin 的协程,所以 webmvc 不太适用,一般也就自己执行多任务会用到 kt 协程
Leviathann
2023-09-11 23:14:10 +08:00
kotlin conf 2023 有 kotlin team leader Roman 关于这个话题的 talk
iPisces77
2023-09-11 23:22:36 +08:00
补充:所有用到 ThreadLocal 的基本对协程都是不支持
dlimeng
2023-09-11 23:27:20 +08:00
[Feature][SolidUI-Web] Design the page, hide the static legends and the legends data tab
https://github.com/CloudOrc/SolidUI/issues/141
netabare
2023-09-12 04:02:07 +08:00
不了解 Webflux ,不过用过 Quarkus ,印象中协程可以和响应式编程类库提供的 Future (我这里是 Uni/Multi )互转,但在类似 Event bus 、ORM 等地方的兼容性欠佳。可能在 Spring 也是类似的状态?

不清楚 op 想要引入 coroutine 是什么作用,如果只是用来写简单 API 可能可行? Quarkus 里面是可以的。如果是配合 ORM 或者 handler 来写的话,框架提供的响应式写法是原生支持最好的,考虑到现在 Java 的发展状况,我也不认为 Spring 会提供原生的对 coroutine 的支持。如果 op 坚持想要用 coroutine 的话可能需要对 handler 做分层设计。

另外这些都是响应式和完全异步的技术栈,如果是基于 servlet 的话还是洗洗睡吧。ThreadLocal 应该也很难。
yazinnnn
2023-09-12 09:05:33 +08:00
写 reactive 会变得不幸


慎重
HollowDreamStar
2023-09-12 09:37:06 +08:00
直接冲 j21, 大道至简
githmb
2023-09-12 10:34:00 +08:00
JDBC 只有事务有问题吗,它不是古老的 BIO 吗?就算用协程也得 spawn 一个单独的线程吧
mmdsun
2023-09-13 16:10:24 +08:00
kotlin 协程调度器是不是可以传个 Executors 池的参数?
到时候应该可以用 Executors.newVirtualThreadPerTaskExecutor()给协程调度器。类似这种关系吧

Java 虚拟线程支持 ThreadLocal: https://openjdk.org/jeps/444#Thread-local-variables ,kotlin 协程应该需要单独处理。

Reactive transaction 只支持 webflux ,要用得话只能换。但迁移很麻烦

kotlin 协不太清楚是怎么实现的,一般来说协程是一种基于状态机( state machine )的编译器技术,可以把将异步代码分解为多个挂起点( suspension point ),并在每个挂起点保存和恢复协程的状态。
Akitora
2023-09-13 19:18:10 +08:00
@mmdsun #9
确实可以通过自定义 Dispatcher 来达到手动指派线程池的效果 https://kotlinlang.org/docs/coroutine-context-and-dispatchers.html

虚拟线程支持 ThreadLocal 的话,到时候现有的基于 JDBC 的 ORM 能直接兼容就好了,支持 R2DBC 的 ORM 略少…

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/972871

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX