如何在 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.
        }
    }
}

该行周围的内容应该适用于您的用例。