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

问题描述 投票:0回答:1

我想知道在Play后台Akka任务中使用异步服务(返回Future [OfResult])的正确方法是什么。播放文档中没有关于此的任何信息,似乎我不能只在最后返回Future [TaskResult]并以反应方式完成工作,因此我在每个异步服务调用中都使用Await.result。即使我使用自己的自定义执行上下文,有时我也会从光滑的db层收到怪异的异常并且任务停止工作,这根本没有弹性(我希望至少下一个时间表可以工作),所以我认为我正在这样做错误。

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

  1. 获取所有事件-这是Future [Event]的列表
  2. 浏览列表并修改或删除事件

我正在以程序化方式进行操作,并阻止了Await.result

通过小事件计数,它很少会失败,但有数千个失败-它很快就会失败(我想是因为数据库池有限?)

这看起来不只是错误的数据库配置,因为在常规的异步控制器操作中,所有数据都可以正常工作,所以我想我做错了

playframework akka
1个回答
0
投票

您永远不应在应用程序逻辑中使用Await.result,因为它会阻塞调用线程并可能使线程池饿死。在Akka文档中查看更多信息:https://doc.akka.io/docs/akka/current/typed/dispatchers.html#blocking-needs-careful-management。这可能就是您看到它失败的原因。

如果未来取决于另一个,则应使用mapflatMap将它们链接起来。要将List[Future[T]]转换为Future[List[T]],可以使用Future.sequence

[如果您的意思是“后台Akka任务”是使用ActorSystem like in this article的调度程序,则无需在整个持续时间内阻止传递给调度程序的Runnable的操作,只需让它触发您的将来的任务,然后返回。

重要的是,将来的操作将在一个或多个其他线程上执行,因此,如果您要观察它的进行,完成或失败,则必须在将来的回调中添加它(例如onComplete在最后的未来)。

© www.soinside.com 2019 - 2024. All rights reserved.