私のコードは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)
}
そのため何ができますか応答エンティティは最初のバージョンでは折り畳まれていませんか?
ありがとうございます!しかし、 'HttpResponse(...)'の場合にはログを記録したいので、 'entityFut.onComplete(f => log.info(" onComplete: "+ f.getOrElse(" ") )) 'それは非ブロッキングですか? – Emilia
それはあなたがそのコールバックで何をしているかによって異なります。あなただけのロギングしている場合は、それが動作することができます... – cmbaxter