2016-08-17 3 views
1

私のコードはAkkaのドキュメントの例に基づいているため、チャームとして機能するはずですが、レスポンスのヘッダーとコンテンツの長さそれは私が手に身体を折ることになる:アクタにパイプ接続されているときにAkka httpリクエストが消費されない

[INFO] [2016年8月17日13:01:21.116] [デフォルト-akka.actor.default-ディスパッチャ-9] [アッカ://デフォルト/ユーザー/ a] Length:29407

[INFO] [08/17/2016 13:01:21.127] [default-akka.actor.default-dispatcher-9] [akka:// default/user/$ a ]返答、本文:リスト()

俳優コード:私はそれに応答を折るだけの文字列を送信するために事前開始()メソッドを変更した場合は

class AkkaHttp extends Actor with ActorLogging { 

    import akka.pattern.pipe 
    import context.dispatcher 

    final implicit val materializer: ActorMaterializer = ActorMaterializer(ActorMaterializerSettings(context.system)) 

    val http = Http(context.system) 

    override def preStart() = { 
    http.singleRequest(HttpRequest(uri = "http://akka.io/")) 
     .pipeTo(self) 
    } 

    def receive = { 
    case s: String => { 
     log.info(s) 
    } 
    case HttpResponse(StatusCodes.OK, headers, entity, _) => { 
     log.info("Length: " + entity.contentLengthOption.getOrElse("No content")) 
     log.info("Got response, body: " + entity.dataBytes.runFold(ByteString.empty) { 
     case (acc, b) => acC++ b }.map(s => s.utf8String)) 
    } 
    case HttpResponse(code, _, _, _) => 
     log.info("Request failed, response code: " + code) 
    } 

} 

、ページの本体が記録されます。

override def preStart() = { 
    val httpRequest: HttpRequest = HttpRequest(uri = "http://akka.io/") 
    val request = http.singleRequest(httpRequest) 
    request.flatMap { response => 
     response.entity.dataBytes.runFold(ByteString.empty) { 
      case (acc, b) => acC++ b }.map(f => f.utf8String) 
    } 
    .pipeTo(self) 
    } 

そのため何ができますか応答エンティティは最初のバージョンでは折り畳まれていませんか?

答えて

1

runFoldの結果は、別のFutureです。その場合は、Futureを印刷してみてください.Futureであり、必要な基礎となるStringではありません。 receiveのケースをこれに変更すると、動作が開始されます。

case HttpResponse(StatusCodes.OK, headers, entity, _) => 
    log.info("Length: " + entity.contentLengthOption.getOrElse("No content")) 

    val entityFut = 
    entity.dataBytes.runFold(ByteString.empty) { 
     case (acc, b) => acC++ b 
    }. 
    map(s => s.utf8String) 
    entityFut pipeTo self 
+0

ありがとうございます!しかし、 'HttpResponse(...)'の場合にはログを記録したいので、 'entityFut.onComplete(f => log.info(" onComplete: "+ f.getOrElse(" ") )) 'それは非ブロッキングですか? – Emilia

+0

それはあなたがそのコールバックで何をしているかによって異なります。あなただけのロギングしている場合は、それが動作することができます... – cmbaxter

関連する問題