繁体   English   中英

在严格的Unmarshaller中使用akka-http客户端`entity.discardEntityBytes`

[英]Using akka-http client `entity.discardEntityBytes` with strict Unmarshaller

akka-http客户端文档指出以下内容:

确保通过使用响应实体dataBytes:Source [ByteString,Unit]来消耗它,例如,将其连接到接收器(如果您不关心响应实体,则可以使用response.discardEntityBytes()),因为否则Akka HTTP(以及基础Streams基础结构)将了解缺乏实体消耗作为背压信号,并停止从基础TCP连接中读取数据!

当使用singleHttpRequest获取Future[HttpResponse] ,有时我会使用使用Unmarshaller.strict创建的unmarshaller。

使用Unmarhsaller[HttpEntity, T]

看akka源代码,似乎在使用通过Unmarshaller.strict获得的编组器之后,我们应该调用discardEntityBytes ,或者确保解组器调用该方法,或者使用字节。 当使用Unmarshaller[HttpEntity, T] ,我们需要确保消耗了这些字节。

这是正确的假设吗?

更新:

这是Unmarshaller.strict的实现:

def strict[A, B](f: A ⇒ B): Unmarshaller[A, B] = Unmarshaller(_ => a ⇒ FastFuture.successful(f(a)))

它将调用Unmarshaller.apply ,最后将调用withMaterializer ,后者将创建一个匿名Unmarshaller 在github上查看更多。 在此实现中,解组器不会消耗或验证实体中字节的消耗,也不会调用discardBytes

有或没有strict Unmarshall读取响应实体,并提供将结果转换为所需的任何case类的选项。 这样,您无需discardEntityBytes

与其他基于Akka的项目一样,Akka-Http也是基于流的。 因此,它将需要一个目标位置来获得结果,否则,它将了解缺少该目标位置的原因,因为您的客户尚未收到所请求的信息,然后它将施加反压力。 从文档:

因为否则Akka HTTP(和底层Streams基础结构)将把缺乏实体消耗理解为背压信号,并停止从底层TCP连接中读取数据!

每当使用Unmarshall时,您都在读取Source字节,而discardEntityBytes方法只不过是像dev/null这样的Sink而已,您不需要将其附加到调用中。 除非您实际上并不关心返回的实体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM