【发布时间】:2017-10-29 17:22:02
【问题描述】:
我在 Cassandra 表中分片了一个大型视频文件。我正在尝试通过使用Source 流将其流式传输回 API 客户端。
我的服务代码如下所示,
def getShards(id: String, shards: Int) = {
def getShardsInternal(shardNo: Int, shards: Future[Array[Byte]]): Future[Array[Byte]] = {
if (shardNo == 0) shards
else getShardsInternal(shardNo - 1, shards.flatMap(x => Database.ShardModel.find(id, shardNo)))
}
getShardsInternal(shards, Future.successful(Array()))
}
在我的 AKKA HTTP 路由中,我尝试从返回的未来构建一个Source,如下所示,
def getAsset = get {
pathPrefix("asset") {
parameters('id) { id =>
complete {
val f = mediaService.getMetadata(id).flatMap { x =>
mediaService.getShards(id, x.shards)
}
Source.fromFuture(f)
}
}
}
}
我不确定Source.fromFuture 是如何做出响应的。被传递的未来本质上是一系列平面映射的未来,预计将按顺序执行。但是,我不相信这会以分块字节流的形式返回给客户端。
对此的任何指示将不胜感激。
编辑 1 我一直在尝试通过以下方式进一步缩小范围,
get {
pathPrefix("asset") {
parameters('id) { id =>
complete {
Source.fromFuture {
Future.successful("Hello".getBytes()).flatMap(x => Future.successful("World".getBytes()))
}
}
}
}
}
我期待这会返回
[72,101,108,108,111,32,87,111,114,108,100]
但是,我只得到最后一个未来的结果,如下所示,
[[87,111,114,108,100]]
亲切的问候 梅拉杰
【问题讨论】:
标签: scala akka akka-stream akka-http