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