[英]Sending Akka HttpEntity between actors
在akka-http中, HttpRequest
和HttpResponse
大多是不可变的对象,除了它们的HttpEntity
主体(具有Source
)。
向其他参与者(尤其是远程参与者)发送请求,响应或单独实体是否安全?是否需要采取一些预防措施?
如评论中所述:由于套接字限制,向远程Actor
发送HttpEntity
不太可能。 可以在文档中找到更多证据(重点是它们):
重要信息 :消息可以是任何类型的对象,但必须是不可变的。 Scala尚不能强制执行不变性,因此必须按照惯例进行。
但是,由于ByteString是不可变的,因此来自Source
的ByteString
值没有与Source本身相同的限制。 您可以简单地在本地akka-http
ActorSystem上消耗Source并将ByteString
值分派到远程Actor。
例如,假设您要使用Actor将基于utf-8的HttpEntity中的所有字符大写。 您可以设置演员:
class UpperActor extends Actor {
override def receive : Receive = {
case b : ByteString => sender() ! b.toString.toUpperCase
}
}
然后您的akka-http可能看起来像:
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))))
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.