我正在使用 Play 2.1.2,我遇到了一些麻烦,Enumerator
我正在寻找如何调试它的想法。
我正在尝试通过我的服务器流式传输一些 S3 数据。我可以InputStream
从 Amazon SDK 中为我的 S3 文件 ( getObject(bucket, key).getObjectContent()
) 获取一个。然后我把它InputStream
变成一个Enumerator[Array[Byte]]
using Enumerator.fromStream
。
所有这些类型的检查和在我的本地开发机器上都可以完美运行。当我制定我Result
的游戏时,我只是返回Ok.stream(enum)
。
当我将它部署到生产服务器时,问题就来了。我第一次请求文件时,它工作得很好,我得到了整个文件。但是随后的时间它经常会通过(每次不同的数量)然后“卡住”。我包装Enumerator
如下,以便能够记录枚举是否完成:
val wrapped = enum.onDoneEnumerating { println("Contents fully enumerated"); }
Ok.stream(wrapped);
正如预期的那样,在我的开发机器上(以及第一次在生产机器上),我收到消息“内容完全枚举”。但在那之后,生产机器将开始下载文件,但并没有完成(在 HTTP 意义上和Enumerator
意义上)。
我不确定如何调试它。显然,fromStream
有一些魔法,我不知道如何弄清楚块之间发生了什么。我认为这可能是线程池问题,所以我将整个响应包装在一个future { blocking { ... } }
块中,但它似乎没有任何区别。
我试图避免从 S3 创建本地临时文件然后从中构建我的麻烦Enumerator
。使用fromStream
来创建Enumerator
似乎是一种优雅的方式......如果它有效的话。
建议?