2014-07-17 6 views
1

저는 REST 웹 서비스를 호출하는 데 사용되는 스프레이 클라이언트가 있습니다. 현재 (new GeoSprayWebClient 사용)이 클라이언트의 인스턴스를 만들고 (아래 코드 참조) 내 액터 내에서 REST 요청을 재사용하고 있습니다. 그러나 서비스의 단일 인스턴스는 모든로드를 처리 할 수 ​​없습니다. 따라서 REST 서비스의 복제본을 소개하고자합니다.ActorSystem 내에서 스프레이 클라이언트를 사용하여 라우팅 구현

저는 스프레이를 처음 접하면서도 여전히 기초를 배우려고합니다. 내 질문은

입니다. 1) 스프레이가 내부적으로 Akka 배우를 사용한다는 것을 알고 있습니다. 이 특별한 경우에 클라이언트 인스턴스에 대해 ActorRef을 얻을 수 있으므로 여러 클라이언트 ActorRef를 생성하고 Akka 라우터를 생성하는 데 사용할 수 있습니다. 2) 스프레이 클라이언트 API는 유스 케이스를 지원할 수있는 모든 종류의 라우팅 기능을 제공합니까?

import akka.actor.ActorSystem 
import spray.client.pipelining._ 
import spray.http._ 
import scala.concurrent.Future 


trait GeoWebClient { 
    def get(url: String, params: Map[String, String]): Future[String] 
} 

class GeoSprayWebClient(implicit system: ActorSystem) extends GeoWebClient { 

    import system.dispatcher 

    // create a function from HttpRequest to a Future of HttpResponse 
    val pipeline: HttpRequest => Future[HttpResponse] = sendReceive 

    // create a function to send a GET request and receive a string response 
    def get(path: String, params: Map[String, String]): Future[String] = { 
    val uri = Uri(path) withQuery params 
    val request = Get(uri) 
    val futureResponse = pipeline(request) 
    futureResponse.map(_.entity.asString) 
    } 
} 
+2

여기에 설명 된대로 내가 분무 할 수있는 클라이언트 API를 사용하십시오 : http://spray.io/documentation/1.2.1/spray-can/http-client/host-level/#starting-an -httphostconnector 당신은 ActorRef를 얻고 그것을 Akka 라우터 뒤에 넣을 여러 호스트 커넥터 (일반적으로 다른 호스트에 배포 할 호스트)를 만들 수 있습니다. – jrudolph

+0

@jrudolph - 답변 대신 댓글을 달 수 있다면 답변으로 받아 들일 것입니다. 이 링크를 사용하여 문제를 해결할 수있었습니다. 나는 또한 해결책을 게시 할 것이다. –

답변

0

this을 바탕으로 나는 ActorRef

def createHttpRESTClient(host: String, port: Int): ActorRef = { 

     // execution context for future transformations below 
     import system.dispatcher 
     implicit val timeout: Timeout = 10 seconds 

     val ref: Future[ActorRef] = for { 
     Http.HostConnectorInfo(hostConnector: ActorRef, _) <- IO(Http) ? Http.HostConnectorSetup(host, port) 
     } 
     yield { 
     hostConnector 
     } 
     //FIXME - TODO fix this it's really bad. However, We are going to create this only once when we create the actor, so I guess it's okay for now. 
     Await.result(ref, 10 seconds) 
    } 

을 얻을 수있었습니다 내가 요청을 전송하고 ActorRef를 사용하여 서비스의 응답을 받고 있어요 방법입니다.

def sendReq(text: String): Future[String] = { 
    import spray.http._ 
    val params = Map(("key" -> text)) 
    val uri = Uri("/myservice") withQuery params 
    val request = Get(uri) 
    //send GET request using the "ask" pattern; the timeout 
    //TODO - not sure if we can use tell instead of ask here ? 
    val response: Future[HttpResponse] = restSvrActorRef.ask(request).mapTo[HttpResponse] 
    log.debug(s"done with sending a request to the REST service") 
    response.map(_.entity.asString) 
    } 
0
  1. 은 당신의 작업을 할 GeoSprayWebClient를 호출 WebClientActor를 구현합니다.

  2. 분무 처리기로서 라우터 생성 :

브로 핸들러 = context.actorOf ( 소품 [WebClientActor] .withRouter (RoundRobinRouter (5)), 이름 = "handlerRouter")

이 방법으로 핸들러

-

  1. 전송 요청 메시지는, 우리는 요청을 할 수있는 5 클라이언트 인스턴스가 있습니다.

    나는 스프레이를 처음 접했고, 그것이 목적을위한 것인지 아닌지 확실하지 않습니다. 귀하의 정보를 위해서입니다.

    건배 ~!