我想知道使用异步服务的正确方法是什么(returns Future[OfResult])在Play后台akka任务中。在Play文档中没有关于它的信息,似乎我不能在最后返回Future[TaskResult]并以一种被动的方式完成事情,所以我对每个异步服务调用都使用Await.result。即使我使用自己的自定义执行上下文,有时我会从光滑的数据库层中得到奇怪的异常,任务停止工作,这根本没有弹性(我希望至少下一个时间表可以工作),所以我认为我做错了。
任务很简单,我在数据库中有一个事件表,其中包含一些字段和日期范围,每天我都会检查当前日期是否在日期范围内,我会删除已传递的事件并激活新事件。
1.获取所有事件-这是未来[事件]的列表
1.查看列表并修改或删除事件
我是用程序化的方式来做的,用blocking Await.result
对于小的事件计数,它失败的情况非常少,但对于成千上万的事件-它很快就失败了(我假设是因为有限的数据库池?)
这看起来不像是错误的数据库配置,因为在常规的异步控制器操作中,对于大量的数据,一切都工作正常,所以我认为我做错了
1条答案
按热度按时间zaq34kh61#
你不应该在应用程序逻辑中使用
Await.result
,因为它会阻塞调用线程,并有可能使你的线程池饥饿。https://doc.akka.io/docs/akka/current/typed/dispatchers.html#blocking-needs-careful-management。这可能就是您看到它失败的原因。如果一个未来依赖于另一个未来,则应使用
map
或flatMap
将它们链接起来。要将List[Future[T]]
转换为Future[List[T]]
,则可以使用Future.sequence
。如果你所说的“后台akka任务”是指使用
ActorSystem
like in this article的调度程序,那么操作就不需要在这段时间内阻塞传递给调度程序的Runnable
,只需让它触发你未来的任务,然后返回。了解将来的操作将在一个或多个其他线程上执行是很重要的,因此,如果您希望观察它的进展、完成或失败,则必须在将来上添加回调(例如,在最终的将来上添加
onComplete
)。