【问题标题】:Close twitter streaming connection in play framework在播放框架中关闭 Twitter 流连接
【发布时间】:2014-04-18 20:25:24
【问题描述】:

我在下面的代码示例中使用 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")) }

【问题讨论】:

    标签: scala twitter stream playframework-2.0 iterate


    【解决方案1】:

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

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

    很遗憾,我们目前还没有解决办法,但我们正在考虑在 2.4 时间线左右将新的较低级别的流式处理 API 引入 Play,这肯定会允许这样做。

    【讨论】:

    • 那么在 2.4 中是如何处理的呢?
    • 在 2.4 中未解决。但在 2.5(正在进行中)中,我们切换到 Akka 流,它提供了一种向上游异步发送取消的方法。
    • 我注意到这次 WC 类扩展了 Closeable 接口 :) ,所以确实应该很容易做到
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2016-07-10
    相关资源
    最近更新 更多