使用带有严格Unmarshaller的akka​​-http客户端`entity.discardEntityBytes`

时间:2017-08-24 15:49:18

标签: scala akka akka-http

akka-http客户端documentation声明如下:

  

确保使用响应实体   dataBytes:Source [ByteString,Unit],例如将其连接到a   接收器(例如,如果你不在乎,则为response.discardEntityBytes()   关于响应实体),因为否则Akka HTTP(和   底层Streams基础设施)将了解实体的缺乏   消耗作为背压信号并停止读取   底层TCP连接!

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

使用discardEntityBytes时,

查看akka源代码,似乎在使用使用Unmarshaller.strict获得的marshallers后,我们应该调用Unmarshaller[HttpEntity, T],或者确保unmarshaller调用该方法,或者消耗字节。使用Unmarshaller.strict时,我们需要确保消耗这些字节。

这是正确的假设吗?

更新

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

的实施
Unmarshaller.apply

最后调用withMaterializer的{​​{1}}会调用Unmarshaller来创建匿名discardBytes。查看更多on github。否则在此实现中,unmarshaller会消耗或验证实体中字节的消耗,或者调用Exit Sub

1 个答案:

答案 0 :(得分:2)

带有或不带Unmarshall

strict读取响应实体,并为您提供将结果转换为您想要的任何案例类的选项。通过这样做,您不需要discardEntityBytes

Akka-Http就像任何其他基于Akka的项目一样,基于流。因此,它需要一个目的地来达到其结果,否则,它会理解缺少该目的地,因为您的客户没有收到所请求的信息,然后它将应用背压。来自文档:

  

因为否则Akka HTTP(和底层的Streams基础设施)   将理解缺乏实体消费作为背压   信号并停止从底层TCP连接读取!

每当您使用Unmarshall时,您正在阅读Source个字节,方法discardEntityBytes只不过是Sink dev/null而且您不会需要将它附加到你的电话上。除非你真的不关心返回的实体。