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

3
我正在使用Play Framework(Scala版本)与Amazon AWS Java SDK将Amazon S3集成到应用程序中。
AWS SDK具有TransferManager类,提供了一个抽象来管理处理对S3的下载/上传的线程池。
我正在尝试确定是否可以将Play对自定义ExecutionContext的核心支持集成到SDK提供的此对象中。特别是,在实例化由AWS SDK提供的TransferManager时,您可以提供自定义ExecutorService作为可选参数。
Scala的ExecutionClass通过其类声明中的“with”关键字绑定ExecutorService类,因此我想知道是否有一些机制可以从ExecutionContext获取ExecutorService对象,例如将ExecutionContext => ExecutorService转换的方法。
如果没有,还有其他方法吗?目前,我只是在Play标准方法之外的类中直接实例化自定义ExecutorService,该方法在此处概述:

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

这感觉有些混乱,不符合框架提供的规范。
谢谢您的时间。

相关 https://twitter.com/SomSnytt/status/510841996294893568 - som-snytt
2个回答

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]

这正是我所需要的。我会查看文档了解 asInstanceOf 如何工作。 - user1591210
这只是 Scala 的语法,用于向下转换。 - Tvaroh
1
请注意,自Scala 2.12版本起prepare()方法已被弃用。 - Midiparse

0

一些 ExecutionContext 的实现继承了 ExecutionContextExecutorService 特质,该特质是 ExecutionContext 和 ExecutorService 的子接口。你可以检查从 Play/Akka 得到的 ExecutionContext 是否属于其中之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接