在@Scheduled 中运行协程

Posted

技术标签:

【中文标题】在@Scheduled 中运行协程【英文标题】:Run coroutine inside @Scheduled 【发布时间】:2021-08-24 02:48:52 【问题描述】:

我想运行一个周期性任务。在 Spring MVC 中它完美地工作。 现在我想集成 Spring Webflux + Kotlin Coroutines。 如何在@Scheduled 方法中调用挂起的函数?我希望它等到挂起的功能完成。

/// This function starts every 00:10 UTC
@Scheduled(cron = "0 10 0 * * *", zone = "UTC")
fun myScheduler() 
    // ???


suspend fun mySuspendedFunction() 
    // business logic

【问题讨论】:

【参考方案1】:
fun myScheduler() 
    runBlocking 
        mySuspendedFunction()
    

这样协程就会在被阻塞的线程中运行。如果您需要在不同的线程中运行代码或并行执行多个协程,可以将调度程序(例如Dispatchers.DefaultDispatchers.IO)传递给runBlocking() 或使用withContenxt()

【讨论】:

以上是关于在@Scheduled 中运行协程的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 每月测试@Scheduled

@Scheduled同一时刻执行两个任务。

Spring 定时任务Scheduled 开发详细图文

springboot + @scheduled 多任务并发

Spring @Scheduled 使用详解

quartz问题记录-missed their scheduled fire-time