Kotlin协程-在api调用中启动函数并返回api调用而不等待



我有一个api调用,我想启动一个长时间运行的作业,然后返回一个200 ok。目前,它将踢掉任务并继续前进,但是一旦初始函数完成了它需要做的事情,它似乎仍然要等待协程完成。我相信这与我对kotlin协程的新理解有关。

fun apiCall() {
   log.info("started")
   longJob()
   log.info("finished")
   
   return ResponseEntity.ok()
}
fun longJob() {
   runBlocking{
      launch {
        do stufff...
      }
   }
}

所以基本上我希望看到日志打印,然后启动longJob,然后在postman中看到200。但是,我实际上打印出了两个日志,同时作业也启动了,但是直到作业完成我才看到200ok。

如果我理解正确,您希望在后台启动longJob,并返回200ok状态,而不等待longJob完成。如果是这种情况,那么您就不能在这里使用runBlocking,它会阻塞当前线程,直到在其中启动的所有作业完成。您可以创建CoroutineScope,然后启动并忘记长时间运行的任务。示例代码:

val scope = CoroutineScope(Dispatchers.IO) // or CoroutineScope(Dispatchers.IO + SupervisorJob())
fun apiCall() {
   log.info("started")
   scope.launch { longJob() }
   log.info("finished")
   
   return ResponseEntity.ok()
}

在这个示例中,日志"started"one_answers";finished"将在longJob()开始执行前打印。

相关内容

  • 没有找到相关文章

最新更新