gpt4 book ai didi

playframework - 使用分块传输编码从 Scala Play 服务器流式传输案例类对象

转载 作者:行者123 更新时间:2023-12-04 08:31:54 27 4
gpt4 key购买 nike

所以,我使用 Play 框架 2.7 来设置流媒体服务器。我想要做的是流式传输大约 500 个大小相似的自定义案例类对象。
这是生成流的 Controller 的一部分 -

def generate: Action[AnyContent] = Action {
val products = (1 to 500).map(Product(_, "some random string")).toList
Ok.chunked[Product](Source(products))
}
哪里 Product是我正在使用的自定义案例类。隐含 writable将此对象反序列化为 json。
这是处理此流的 Controller 的一部分 -
def process(): Action[AnyContent] = Action.async {
val request = ws.url(STREAMING_URL).withRequestTimeout(Duration.Inf).withMethod("GET")
request.stream().flatMap {
_.bodyAsSource
.map(_.utf8String)
.map { x => println(x); x }
.fold(0) { (acc, _) => acc + 1 }
.runWith(Sink.last)
.andThen {
case Success(v) => println(s"Total count - $v")
case Failure(_) => println("Error encountered")
}
}.map(_ => Ok)
}
我期望的是,我的案例类的每个对象都作为单个块传输并以同样的方式接收,以便它们可以单独序列化并由接收器使用。这意味着,使用上面的代码,我的期望是我应该正好收到 500 个块,但是这个值总是比这更多。
我能看到的是,这 500 个对象中恰好有一个对象是分开传输的,并以 2 个块而不是 1 个块传输。
这是一个正常的物体,在接收方看到的——
{
"id" : 494,
"name" : "some random string"
}
这是一个被一分为二的物体——
{
"id" : 463,
"name" : "some random strin
g"
}
因此,这无法序列化回我的 Product 的实例中。案例类。
但是,如果我对发送方 Controller 中的源进行某种限制,我会按预期接收块。
例如,这在我每秒仅传输 5 个元素的情况下完全正常-
def generate: Action[AnyContent] = Action {
val products = (1 to 500).map(Product(_, "some random string")).toList
Ok.chunked[Product](Source(products).throttle(5, 1.second))
}
谁能帮助我理解为什么会发生这种情况?

最佳答案

如所述 here有一个 JsonFraming将有效的 JSON 对象与传入的 ByteString 分开溪流。
在您的情况下,您可以尝试这种方式

  _.bodyAsSource.via(JsonFraming.objectScanner(Int.MaxValue)).map(_.utf8String)

关于playframework - 使用分块传输编码从 Scala Play 服务器流式传输案例类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64977090/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com