gpt4 book ai didi

java - 在 actor 之间发送 Akka HttpEntity

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:07 24 4
gpt4 key购买 nike

在akka-http中,HttpRequestHttpResponse大多是不可变的对象,除了它们的HttpEntity主体(它有一个Source)。

向另一个参与者(尤其是远程参与者)发送请求、响应或单独实体是否安全,或者是否需要采取一些预防措施?

最佳答案

正如评论中所述:由于套接字限制,将 HttpEntity 发送到远程 Actor 不太可能起作用。进一步的证据可以在 the documentation 中找到。 (强调他们的):

IMPORTANT: Messages can be any kind of object but have to be immutable. Scala can’t enforce immutability (yet) so this has to be by convention.

但是,来自 SourceByteString 值与 Source 本身没有相同的限制,因为 ByteString 是不可变的。您可以简单地耗尽本地 akka-http ActorSystem 上的 Source 并将 ByteString 值分派(dispatch)给您的远程 Actor。

举个例子,假设您想使用 Actor 将基于 utf-8 的 HttpEntity 中的所有字符大写。您可以设置您的 Actor:

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))))
}

关于java - 在 actor 之间发送 Akka HttpEntity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41275139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com