Playframework 播放2.7后台任务和异步服务

Playframework 播放2.7后台任务和异步服务,playframework,akka,Playframework,Akka,我想知道在播放背景akka任务中使用异步服务返回未来[OfResult]的正确方法是什么。play文档中没有关于它的信息,似乎我不能在最后返回Future[TaskResult]并以反应式方式完成任务,所以我对每个异步服务调用都使用wait.result。即使我使用我自己的自定义执行上下文,有时我会从slick db层得到奇怪的异常,任务停止工作,这一点都不具有弹性,我希望至少下一个计划可以工作,所以我认为我做得不对 任务很简单,我在数据库中有一个带有一些字段和日期范围的事件表,每天我检查当前日

我想知道在播放背景akka任务中使用异步服务返回未来[OfResult]的正确方法是什么。play文档中没有关于它的信息,似乎我不能在最后返回Future[TaskResult]并以反应式方式完成任务,所以我对每个异步服务调用都使用wait.result。即使我使用我自己的自定义执行上下文,有时我会从slick db层得到奇怪的异常,任务停止工作,这一点都不具有弹性,我希望至少下一个计划可以工作,所以我认为我做得不对

任务很简单,我在数据库中有一个带有一些字段和日期范围的事件表,每天我检查当前日期是否在日期范围内,我删除传递的事件并激活新事件。它要求我:

获取所有事件-这是未来[事件]的列表 浏览列表并修改或删除事件 我正在以程序化的方式做这件事,阻止等待结果

对于小事件计数,它失败的情况非常罕见,但对于数千个事件,它很快就会失败,我想是因为数据库池有限

这看起来不像是错误的数据库配置,因为在常规异步控制器操作中,所有操作都可以处理大量数据,所以我想我做错了,您永远不应该使用wait.result,因为它会阻塞调用线程,并可能耗尽线程池。请参阅Akka文档中的更多信息:。这可能就是你看到它失败的原因

如果一个未来依赖于另一个,你应该使用map或flatMap链接它们。要将列表[Future[T]]转换为Future[List[T]],可以使用Future.sequence

如果您对后台akka任务的意思是使用ActorSystem的调度程序,则操作无需在持续时间内阻止传递给调度程序的Runnable,只需让它触发您未来的任务,然后返回即可

重要的是要了解未来的操作将在一个或多个其他线程上执行,因此,如果您想观察它的进展、完成或失败,您必须在将来的回调中添加这些操作,例如在最终的将来的onComplete