2017-09-14 4 views
0

https 요청을 보내기 위해 scala를 사용하여 akka-http에서 cachedHostConnectionPool을 만드는 방법을 알 수 없습니다. queueRequest(HttpRequest(uri = "https://example.com")은 http에 대한 요청을 보냅니다. cachedHostConnectionPool[Promise[HttpResponse]]("https://example.com"):이 아닌 문자를 반환합니다.스카에서 https 요청을 위해 akka-http cachedHostConnectionPool을 만드는 방법은 무엇입니까?

http.cachedHostConnectionPool("akka.io", materializer()); 
http.cachedHostConnectionPool("https://akka.io", materializer()); 
http.cachedHostConnectionPool("https://akka.io:8080", materializer()); 

공지 된 해결 방법 : 자바 당신이 (자신의 시험에서) 너무 프로토콜을 제공하면서 스칼라 버전처럼 보인다

import scala.util.{ Failure, Success } 
import scala.concurrent.{ Future, Promise } 

import akka.actor.ActorSystem 
import akka.http.scaladsl.Http 
import akka.http.scaladsl.model._ 
import akka.stream.ActorMaterializer 
import akka.stream.scaladsl._ 

import akka.stream.{ OverflowStrategy, QueueOfferResult } 

implicit val system = ActorSystem() 
import system.dispatcher // to get an implicit ExecutionContext into scope 
implicit val materializer = ActorMaterializer() 

val QueueSize = 10 

// This idea came initially from this blog post: 
// http://kazuhiro.github.io/scala/akka/akka-http/akka-streams/2016/01/31/connection-pooling-with-akka-http-and-source-queue.html 
val poolClientFlow = Http().cachedHostConnectionPool[Promise[HttpResponse]]("example.com") 
val queue = 
    Source.queue[(HttpRequest, Promise[HttpResponse])](QueueSize, OverflowStrategy.dropNew) 
    .via(poolClientFlow) 
    .toMat(Sink.foreach({ 
     case ((Success(resp), p)) => p.success(resp) 
     case ((Failure(e), p)) => p.failure(e) 
    }))(Keep.left) 
    .run() 

def queueRequest(request: HttpRequest): Future[HttpResponse] = { 
    val responsePromise = Promise[HttpResponse]() 
    queue.offer(request -> responsePromise).flatMap { 
    case QueueOfferResult.Enqueued => responsePromise.future 
    case QueueOfferResult.Dropped  => Future.failed(new RuntimeException("Queue overflowed. Try again later.")) 
    case QueueOfferResult.Failure(ex) => Future.failed(ex) 
    case QueueOfferResult.QueueClosed => Future.failed(new RuntimeException("Queue was closed (pool shut down) while running the request. Try again later.")) 
    } 
} 

val responseFuture: Future[HttpResponse] = queueRequest(HttpRequest(uri = "/")) 

는 일반 호스트 이름을 지원?

답변