2016-12-22 1 views
1

akka-http에서 HttpEntity 본문 (Source)을 제외하고 akka-http에서 HttpRequestHttpResponse은 대부분 변경 불가능한 개체입니다.액자 간 Akka HttpEntity 보내기

다른 배우 (특히 원격 배우)에게 요청, 응답 또는 솔로 개체를 보내는 것이 안전합니까? 아니면 몇 가지 예방 조치가 필요합니까?

+0

: 같은

class UpperActor extends Actor { override def receive : Receive = { case b : ByteString => sender() ! b.toString.toUpperCase } } 

그런 다음 akka-HTTP는 볼 수 있었다. 원격 시스템으로 전달하면 실제로 작동 할 것이라고 상상할 수는 없습니다. – Falmarri

+0

'Source' (와'HttpEntity')도 사실 불변이므로, 로컬 액터로 전달하면 작동 할 수도 있습니다. 그러나 그들은 (@Falmarri의 코멘트에 따라) 직렬화 할 수 없기 때문에 리모팅은 작동하지 않을 것이다. –

+0

작동 방식이 있습니까? akka-http 구체적 또는 원격 소스 중 일반적으로? 원격 스트리밍 구조에서 akka 스트리밍을 사용하고 싱크대에 연결하는 방법을 상상해보십시오. – kag0

답변

0

설명에 명시된대로 : HttpEntity을 리모컨 Actor으로 보내는 것은 소켓 제한으로 인해 작동하지 않을 수 있습니다. 또한 증거 the documentation (강조 그들의)에서 찾을 수 있습니다

중요 : 메시지는 모든 종류의 객체 수 있지만 불변 할 수 있습니다. 스칼라는 불변성을 적용 할 수 없으므로 (아직) 규칙을 준수해야합니다. ByteString는 불변이기 때문에

그러나, Source에서 오는 ByteString 값은 소스 자체와 동일한 제한이 없습니다. 로컬 akka-http ActorSystem에서 소스를 빼고 ByteString 값을 원격 액터로 보낼 수 있습니다.

예를 들어 utf-8 기반 HttpEntity의 모든 문자를 대문자로 사용하려면 액터를 사용한다고 가정 해 보겠습니다. 당신은 설정하여 배우를 할 수 있습니다 소스는 데이터가오고있다 소켓의 라이프 사이클에 바인딩

val actorRef = ??? //setup the ref to remote UpperActor 

/**Query the Actor*/ 
val dispatchByteString : (ByteString) => Future[String] = 
    (byteString : ByteString) => (actorRef ? byteString).mapTo[String] 

val parallelism = 10 // should match your Actor's mailbox size 

/**Construct the Response Source.*/ 
val requestToSrc : (HttpRequest) => Source[ChunkStreamPart,_] = 
    (_ : HttpRequest).entity 
        .dataBytes 
        .mapAsync(parallelism)(dispatchByteString) 
        .map(ChunkStreamPart.apply) 

val contentType = ContentTypes.`text/plain(UTF-8)` 

val route = extractRequest { request => 
    complete(HttpResponse(entity = Chunked(contentType, requestToSrc(request)))) 
}