【发布时间】:2019-07-05 04:18:47
【问题描述】:
我有两种方法:
def getNextJob: Future[Option[Job]]
def process(job: Job): Future[Unit]
我想处理所有作业,直到没有剩余作业为止。
我可以使用Await 来做到这一点,例如
private def process()(implicit ctx: ExecutionContext): Future[Unit] = {
var job: Option[Job] = Await.result(service.getNextJob, FiniteDuration(2, TimeUnit.SECONDS))
while(job.isDefined) {
Await.result(process(job.get), FiniteDuration(2, TimeUnit.SECONDS))
job = Await.result(service.getNextJob, FiniteDuration(2, TimeUnit.SECONDS))
}
Future.successful()
}
但这很丑陋,并且不能正确使用 Futures。有没有办法以某种方式链接期货来代替它?
【问题讨论】:
-
你想像你的示例代码那样按照严格的顺序
process作业,还是可以按任何顺序执行? -
@Tim 任何订单都可以,我只需要确保一次运行 1 个
-
我想我对为什么
process返回Future感到困惑,如果您总是等待它完成,然后再继续下一份工作。如果您不等待它完成,那么可以同时处理多个作业。 -
@Tim 我不打算进入实现,但
getNextJob只是从数据库中拉出一份状态为unprocessed的工作。process处理它并将状态更新为done。如果我并行处理多个,则无法保证(使用我当前的实现)该作业只会运行一次,因为对getNextJob的两次调用可能会两次返回相同的作业` -
在这种情况下,您可能应该避免从
process返回Future,而是让它进行处理,然后返回Unit。这已经在getNextJob的Future中运行,因此无需在第一个Future中嵌套另一个Future。