2013-05-02 32 views
7

文檔states噴霧能夠處理分塊響應,但我找不到任何示例。還有就是我幼稚的做法:使用噴霧實例分塊響應處理

object Main extends App { 

    implicit val system = ActorSystem() 
    import system.dispatcher 
    val log = Logging(system, getClass) 
    val ioBridge = IOExtension(system).ioBridge() 
    val httpClient = system.actorOf(Props(new HttpClient(ioBridge))) 

    val conduit = system.actorOf(
    props = Props(new HttpConduit(httpClient, "localhost", 3000)), 
    name = "http-conduit" 
) 

    val pipeline = HttpConduit.sendReceive(conduit) 
    val response = pipeline(
    HttpRequest(
     method = GET, 
     uri = "/output.cgi.xml" 
    ) 
) 

    response onComplete { 
    case Success(a) => 
     log.info("Success: " + a) 
     system.shutdown() 

    case Failure(error) => 
     log.error(error, "Failure") 
     system.shutdown() 
    } 

} 

我給自己定response-chunk-aggregation-limit = 0,仍然沒有任何反應。

你能否給我提供閱讀分塊響應的例子?

更新

我已經重寫我的代碼如下:

object Main extends App { 

    implicit val system = ActorSystem() 
    import system.dispatcher 
    val log = Logging(system, getClass) 
    val ioBridge = IOExtension(system).ioBridge() 
    val httpClient = system.actorOf(Props(new HttpClient(ioBridge))) 

    actor(new Act { 
    httpClient ! Connect(new InetSocketAddress("localhost", 3000)) 

    become { 
     case Connected(_) => 
     log.info("connected") 
     sender ! HttpRequest(GET, "/output.cgi.xml") 
     case Closed(handle, reason) => 
     log.info("closed: " + reason) 
     system.shutdown() 
     case ChunkedResponseStart(res) => 
     log.info("start: " + res) 
     case MessageChunk(body, ext) => 
     log.info("chunk: " + body) 
     case ChunkedMessageEnd(ext, trailer) => 
     log.info("end: " + ext) 
     case m => 
     log.info("received unknown message " + m) 
     system.shutdown() 
    } 
    }) 

} 

現在我收到closed: ProtocolError(Aggregated response entity greater than configured limit of 1048576 bytes)連接建立之後。

我application.conf

spray.can { 
    client { 
    response-chunk-aggregation-limit = 0 
    } 
} 
+0

WDYM與「沒有任何事情發生」?你是說你永遠不會得到結果的查詢? – jrudolph 2013-05-02 11:52:22

+0

你使用哪種版本的噴霧劑? – jrudolph 2013-05-02 11:53:35

+0

我正在使用1.1-M7。我的意思是我不知道如何以分塊方式處理響應。目前'onComplete'收到彙總迴應。 – lambdas 2013-05-02 12:03:30

回答

9

正如您已經注意到,HttpConduit僅適用於聚集響應。你不得不掉落到噴霧罐層處理單塊。

不幸的是,我們目前沒有示例顯示如何做到這一點。粗略地說,它的工作原理是這樣的(在M7):

  1. 套裝response-chunk-aggregation-limit = 0
  2. 發送Connect到HttpClient的演員和等待Connected
  3. 發送HttpRequestConnected消息
  4. 手柄分塊請求消息的發送者ChunkedResponseStart,MessageChunkChunkedResponseEnd

欲瞭解更多信息請參閱http://spray.io/documentation/spray-can/http-client/#chunked-responses

相較於使用HttpConduit,這意味着你必須自己管理您的連接(如果這就是爲什麼你正在使用HttpConduit)。在最近的夜晚,它變得更容易,因爲新的HttpClient會自動支持連接池等。如果您需要,您還可以在郵件列表中獲得更多信息。

+0

這是否意味着我的客戶端會收到足夠大的響應,或者需要某些特殊的服務器端支持? – lambdas 2013-05-03 05:54:55

+0

只有當服務器發送塊時,您纔會獲得塊。我添加了一張票來支持一個塊API,即使實際響應沒有通過網絡分塊:https://github.com/spray/spray/issues/281 – jrudolph 2013-05-03 12:41:33

+0

不錯,謝謝! – lambdas 2013-05-03 13:22:17