【发布时间】:2017-04-14 06:27:47
【问题描述】:
我需要从 Play Framework 应用程序访问和写入 DynamoDB。 已经有几个关于这个话题的问题(here、here 和 here;但他们都至少 3 岁)。
问题的答案通常是使用包装器 (AWScala by seratch) 或专用于 Play 的库:
不过,包装器只是在底层调用 SDK 的同步版本。如果可能的话,我希望能够在新版本发布后立即更新 AWS 开发工具包,而不是依赖于首先更新使用的 Scala/Play 库。所以对我来说最好的选择是aws-scala-sdk wrapper generator by awslabs。例如,异步包装器使用 Future<PutItemResult> putItemAsync(PutItemRequest putItemRequest, AsyncHandler<PutItemRequest,PutItemResult> asyncHandler) 方法,它仍然返回 Java Future,但也可以使用 AsyncHandler 的回调来驱动 Scala Future 的响应:
val promise = scala.concurrent.Promise[PutItemResult]
dynamoDBAsync(request, new com.amazonaws.handlers.AsyncHandler[PutItemRequest, PutItemResult]() {
override def onSuccess(request: PutItemRequest, result: PutItemResult) = promise.success(Ok)
override def onError(exception: Exception) = promise.failure(exception)
})
promise.future
这样的代码由 aws-scala-sdk 生成器生成。这种方法与 Play 和默认的 ExecutionContext 一起使用是否安全,还是仍然会遇到阻塞线程的问题,例如调用 Java 的 Future.get()?
【问题讨论】:
标签: playframework playframework-2.0 amazon-dynamodb