我有一个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()
开始执行前打印。