Scala 如何选择在哪个ExecutorService中执行播放ws?

Scala 如何选择在哪个ExecutorService中执行播放ws?,scala,playframework,threadpool,Scala,Playframework,Threadpool,1) 我想在一个独立的线程池中执行特定的Play WS。因为我将在后台进行大量HTTP调用,我不希望它使我的主执行器服务过载 注意:我在这里还发现了一个我不理解的信息: 它解释了PlayWs已经拥有自己的线程池。在游戏2.6中仍然正确吗?在阅读播放文档时,我不理解这样的事情(请参阅:) 我创造了自己的环境: call-to-db-context { fork-join-executor { parallelism-factor = 1 parallelism-max = 2

1)
我想在一个独立的线程池中执行特定的Play WS。因为我将在后台进行大量HTTP调用,我不希望它使我的主执行器服务过载

注意:我在这里还发现了一个我不理解的信息: 它解释了PlayWs已经拥有自己的线程池。在游戏2.6中仍然正确吗?在阅读播放文档时,我不理解这样的事情(请参阅:)

我创造了自己的环境:

call-to-db-context {
  fork-join-executor {
    parallelism-factor = 1
    parallelism-max = 24
  }
}
但我不知道如何指定ws-request使用此上下文

ws.url("http://127.0.0.1:8080/b")
  .get() // How to specify executorContext here ?
2)

此外,对db上下文的调用必须具有较低的优先级,因为它是后台任务。我希望Akka处理用户请求具有更高的优先级和我的默认执行器上下文。做这件事的最佳方法是什么?

在早期的游戏中更容易,您可以自己配置客户机(只要WS-wrapper位于ning之上)

它在2.6中看起来更复杂一些。在成熟的产品中,当某些东西不容易改变时,最有可能的是,你不需要改变它

所以,我认为不需要为WS方法指定线程池。对于后处理可能是,如果是长的。但play客户端是异步的,这意味着它在等待响应时不会阻塞线程。如果您使用不可靠的网络发送请求,只需使用超时

查看有关play client的更多信息

不确定是否了解您关于优先级的要求。您知道akka部署配置吗?如果没有,你需要阅读 因此,可以为参与者指定线程池。对于参与者和ws-post-processing(从DB处理数据?)有不同的调度器,您将分离这些功能。如果ws-calls后处理非常繁重,请限制对db上下文的
调用的线程数量

评论后更新

在您的案例中,许多ws调用(如果您认为它们的数量可能会影响perormance)需要限制在两个地方:限制已启动调用的数量,限制并发后处理的数量。你需要理解。为ws本身设置特定的dispatcher不会限制任何东西:只要它是异步的,它就可以启动只有一个线程的1000个请求

所以,我想说,您可以将ws调用包装到actor中。参与者将处理消息以启动请求,并进行后期处理,例如

receive: Receive = {
    …
    case Get(url) =>
        ws.url(url).get().onComplete {
            case Success(response) => self ! GetSuccess(response)
            case Failure(exception) => self ! GetFailure(exception) 
        }
    case GetSuccess(response) => …..
    case GetFailure(exception) => ……
}

您可以使用循环池(设置工人数量)在特定的调度程序上部署此参与者。此解决方案不限制请求的启动(因此您可以获得长队列的响应)。您可以在未收到GetSuccess或GetFailure的情况下,通过禁用接受Get来添加Been(因此工作人员需要在开始下一步之前完全处理请求)。

我已经从play上阅读了这些文档。这对我没有帮助。我的问题是,为了响应请求(包括一些ws-call),我需要执行一些异步任务。另一方面,我在后台有很多ws-call要做(音量取决于小时)。所以我不希望后台ws调用缓慢的请求响应。所以我需要在不同的线程池中隔离这些调用,并可能给这个线程池一个低优先级,不是吗?