如何处理来自Akka Stream 2中的WSClient的流数据

时间:2017-03-04 07:00:43

标签: scala playframework akka-stream

如何返回concurrent.Future在下面的代码中:

val nextMeetup = ws.url(url).stream()
        .flatMap( response => response.body
          .via(framing)
          .map(_.utf8String)
          .map(_ + "\n")
        )

类型不匹配错误:  发现:akka.stream.scaladsl.Source [String,_ $ 2]  必需:scala.concurrent.Future [?]

我的网址拆分了json数据流 - 它不是推特流

请解释一下解决这个问题。

1 个答案:

答案 0 :(得分:0)

您想从响应中得到什么并不是很清楚。 stream()会返回Future,因此如果您flatMap,则还需要从处理程序返回未来。你到底想要什么回来?例如,如果您希望获得整个响应的Future[String],则可以使用runReduce(_ + _)

val result: Future[String] = ws.url(url).stream()
    .flatMap(response => response.body
      .via(framing)
      .map(_.utf8String)
      .map(_ + "\n")
      .runReduce(_ + _)
    )

runReduce(f: (U, U) => U)会返回Future[U],也就是说,在您的情况下会是Future[String]。如果您想通过其他功能单独处理传入流的每个元素,可以使用runForeach

ws.url(url).stream()
    .flatMap( response => response.body
      .via(framing)
      .map(_.utf8String)
      .map(_ + "\n")
      .runForeach(s => handleString(s))
    )

如果没有更多关于你想做什么的细节,很难提供更具体的答案。

更新:如果您想限制来自外部服务器的邮件,可以使用内置的throttle组合器:

val result: Future[Source[String, _]] = ws.url(url)
  .stream()
  .map { response =>
    response.body
      .via(framing)
      .map(_.utf8String)
      .map(_ + "\n")
      .throttle(10, 1.second, 10, ThrottleMode.Shaping)
  }

此处,result未来将包含String s流,在实现时,每秒最多可产生10个元素,必要时可进行背压。您可以在我上面链接的文档中找到更多信息。