0

我在下面的代码示例中使用 Play 2.2 WS API 连接到 twitter 流 API。我一直在试图弄清楚如何在流建立后断开连接。有没有合适的方法来做到这一点而不是停止应用程序?任何帮助将不胜感激。

def watchTweets(keywords : String) = Action { implicit request =>
Logger.debug(s"watchTweets invoked with: $keywords")
val (tweetsOut, tweetChanel) = Concurrent.broadcast[JsValue]
WS.url(s"https://stream.twitter.com/1.1/statuses/filter.json?track=" + URLEncoder.encode(keywords, "UTF-8"))
  .sign(OAuthCalculator(Twitter.KEY, Twitter.sessionTokenPair.get))
  .postAndRetrieveStream("")(headers => Iteratee.foreach[Array[Byte]] { ba =>
  val msg = new String(ba, "UTF-8")
  Logger.debug(s"received message: $msg")
  val tweet = Json.parse(msg)
  tweetChanel.push(tweet)
}).flatMap(_.run)

Ok.chunked(tweetsOut &> Comet(callback = "parent.cometMessage")) }
4

1 回答 1

1

这是一个已知问题...答案是您关闭了连接,但问题是,枚举器在尝试向客户端提供推文之前不会注意到连接已关闭,而这不会发生直到它收到来自 Twitter 的另一条推文,这可能需要很长时间才能发生。

这在进行 Twitter 流式传输时当然是一个问题,因为 Twitter 只会让用户一次创建一个流,因此这实际上意味着您不能在第一个流接收到一些数据之前进行第二个流。

不幸的是,我们目前还没有解决办法,但我们正在考虑在 2.4 时间线周围将新的较低级别的流 API 引入 Play,这肯定会允许这样做。

于 2014-03-13T21:25:34.040 回答