使用Akka-Http读取请求体并将每一行发送到Actor上的消息队列

时间:2017-07-16 14:42:16

标签: akka-stream akka-http

我正在谷歌搜索一个适合我的用例的例子,但到目前为止我还没有找到。

我正在编写一个Akka WebService,它应该处理一个可能很大的纯文本请求体,将每一行发送到Actor的传入消息队列。

你们中间有人可以在这里写一些代码,或者只是把我带到一个示例页面吗?

我实际上不知道从哪里开始:对我来说最大的问题是处理流一般(在我的情况下我想使用Akka流媒体库)

1 个答案:

答案 0 :(得分:2)

要获取请求正文,您可以使用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