使用 Akka-Http 读取请求正文并将每一行发送到 Actor 上的消息队列
Read request body with Akka-Http and send each line to the message queue on an Actor
我正在谷歌搜索适合我的用例的示例,但到目前为止我还没有找到。
我正在编写一个 Akka WebService,它应该处理一个潜在的巨大纯文本请求正文,将每一行发送到 Actor 的传入消息队列。
你们中的任何人都可以在这里写一些代码或者只是带我到一个示例页面吗?
我实际上不知道从哪里开始:对我来说最大的问题是处理一般的流(在我的例子中我想使用 Akka 流媒体库)
要获取请求正文,您可以使用 extractRequestEntity
指令来创建您的路由。一旦你有了实体流,你就可以简单地将每一行文本发送到 Actor
:
import akka.stream.scaladsl.Framing.delimiter
import akka.util.ByteString
import akka.actor.ActorRef
import akka.http.scaladsl.server.Directives.{extractRequestEntity, onComplete}
val maxLineLength = 256
val streamSplitter = delimiter(ByteString("\n"), maxLineLength)
val actorRef : ActorRef = ??? //not specified in question
val route : Route =
extractRequestEntity { entity =>
onComplete {
entity
.dataBytes
.via(streamSplitter)
.map(_.utf8String)
.runForeach(line => actorRef ! line)
} { _ =>
complete("all lines sent to actor")
}
}
问题没有指定响应是否依赖于 Actor 处理的结果,因此上面的示例只是将行发送给 Actor,然后用包含简单消息的响应完成请求。
route
现在可以 form the basis of a server。
我正在谷歌搜索适合我的用例的示例,但到目前为止我还没有找到。
我正在编写一个 Akka WebService,它应该处理一个潜在的巨大纯文本请求正文,将每一行发送到 Actor 的传入消息队列。
你们中的任何人都可以在这里写一些代码或者只是带我到一个示例页面吗?
我实际上不知道从哪里开始:对我来说最大的问题是处理一般的流(在我的例子中我想使用 Akka 流媒体库)
要获取请求正文,您可以使用 extractRequestEntity
指令来创建您的路由。一旦你有了实体流,你就可以简单地将每一行文本发送到 Actor
:
import akka.stream.scaladsl.Framing.delimiter
import akka.util.ByteString
import akka.actor.ActorRef
import akka.http.scaladsl.server.Directives.{extractRequestEntity, onComplete}
val maxLineLength = 256
val streamSplitter = delimiter(ByteString("\n"), maxLineLength)
val actorRef : ActorRef = ??? //not specified in question
val route : Route =
extractRequestEntity { entity =>
onComplete {
entity
.dataBytes
.via(streamSplitter)
.map(_.utf8String)
.runForeach(line => actorRef ! line)
} { _ =>
complete("all lines sent to actor")
}
}
问题没有指定响应是否依赖于 Actor 处理的结果,因此上面的示例只是将行发送给 Actor,然后用包含简单消息的响应完成请求。
route
现在可以 form the basis of a server。