如何在 Spring/Kotlin 协程项目的后台 运行 EventListener
How to run EventListener in background in a Spring/Kotlin Coroutines project
目前我在项目中使用Spring 2.6.7 + WebFlux/Kotlin协程堆栈。
在 Java 项目中,像这样在异步线程中 运行 EventListener 很容易。
@Component
class MyEventListener{
@EventListener
@Async
void onOrderPlaced(event) {
}
}
但是在 Kotlin 协程中,@Async
不起作用,EventListener
不接受 suspend
乐趣。
@Component
class MyEventListener{
@EventListener
@Async //does not work
fun onOrderPlaced(event) {
}
@EventListener
suspend fun onOrderPlaced(event) { // `suspend` does not work
}
@EventListener
fun onOrderPlaced(event) = runBlocking { // works, but did not run this continuation in background like `@Async`
}
}
我能想到的一种方法是在您的应用程序配置中使用特定于应用程序的协程上下文。
@Configuration
class ApplicationConfiguration {
private val applicationCoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
@Bean
fun applicationScope(): CoroutineScope = applicationCoroutineScope
}
然后
@Component
class MyEventListener(private val applicationScope: CoroutineScope) {
@EventListener
fun onOrderPlaced(event) {
applicationScope.launch {
// Do something with the event.
}
}
}
该行周围的内容应该适用于您的用例。
目前我在项目中使用Spring 2.6.7 + WebFlux/Kotlin协程堆栈。
在 Java 项目中,像这样在异步线程中 运行 EventListener 很容易。
@Component
class MyEventListener{
@EventListener
@Async
void onOrderPlaced(event) {
}
}
但是在 Kotlin 协程中,@Async
不起作用,EventListener
不接受 suspend
乐趣。
@Component
class MyEventListener{
@EventListener
@Async //does not work
fun onOrderPlaced(event) {
}
@EventListener
suspend fun onOrderPlaced(event) { // `suspend` does not work
}
@EventListener
fun onOrderPlaced(event) = runBlocking { // works, but did not run this continuation in background like `@Async`
}
}
我能想到的一种方法是在您的应用程序配置中使用特定于应用程序的协程上下文。
@Configuration
class ApplicationConfiguration {
private val applicationCoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
@Bean
fun applicationScope(): CoroutineScope = applicationCoroutineScope
}
然后
@Component
class MyEventListener(private val applicationScope: CoroutineScope) {
@EventListener
fun onOrderPlaced(event) {
applicationScope.launch {
// Do something with the event.
}
}
}
该行周围的内容应该适用于您的用例。