簡體   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