[英]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.