当第三方库请求ExecutorService时,请使用Scala ExecutionContext

时间:2014-09-23 21:52:22

标签: java scala amazon-s3 playframework-2.3

我正在使用Play Framework(Scala版本)和Amazon AWS Java SDK将Amazon S3集成到应用程序中。

AWS SDK有一个TransferManager类,它提供了一个抽象来管理线程池,以处理下载/上传到S3。

我正在尝试确定是否可以将自定义ExecutionContexts的核心支持Play集成到SDK提供的此对象中。特别是,在实例化AWS SDK提供的TransferManager时,您可以提供自定义ExecutorService作为可选参数。

Scala的ExecutionClass通过"与"绑定ExecutorService类。关键字在其类声明中,所以我想知道是否有一些机制从ExecutionContext获取ExecutorService对象,就像转换ExecutionContext =>的方法一样。 ExecutorService的。

如果没有,还有其他方法吗?目前,我只是在Play的标准方法之外的类中直接实例化自定义ExecutorService,如下所述:

https://www.playframework.com/documentation/2.3.x/ThreadPools

这让人感到麻烦,违反了框架提供的惯例。

感谢您的时间。

2 个答案:

答案 0 :(得分:5)

如果您创建这样的上下文(不要盲目地复制粘贴 - 它已配置为阻止操作):

val blockingContext: ExecutionContext = {
    val executor = new ThreadPoolExecutor(100, 100, 1, TimeUnit.MINUTES, new LinkedBlockingQueue(1000))
    executor.allowCoreThreadTimeOut(true)
    ExecutionContext.fromExecutorService(executor) // main part
}

然后您就可以从中获取ExecutorService个实例:

val executor: ExecutorService = blockingContext.prepare().asInstanceOf[ExecutorService]

答案 1 :(得分:0)

ExecutionContext的一些实现实现ExecutionContextExecutorService trait,它是ExecutionContext和ExecutorService的子接口。你可以检查一下你从Play / Akka获得的ExecutionContext是否是其中之一。