Scala 关闭play框架中的twitter流媒体连接

Scala 关闭play框架中的twitter流媒体连接,scala,twitter,stream,playframework-2.0,iterate,Scala,Twitter,Stream,Playframework 2.0,Iterate,我在下面的代码示例中使用Play2.2WS-API连接到twitter流媒体API。我被困在试图找出如何断开从流一旦建立。除了停止应用程序之外,还有什么合适的方法可以做到这一点吗?任何帮助都将不胜感激。 这是一个已知的问题。。。答案是您关闭了连接,但问题是,枚举器在尝试向客户端提供tweet之前不会注意到连接已关闭,而在它从Twitter接收到另一条tweet之前不会注意到连接已关闭,这可能需要很长时间 这当然是Twitter流媒体时的一个问题,因为Twitter一次只允许用户创建一个流,因此

我在下面的代码示例中使用Play2.2WS-API连接到twitter流媒体API。我被困在试图找出如何断开从流一旦建立。除了停止应用程序之外,还有什么合适的方法可以做到这一点吗?任何帮助都将不胜感激。


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

这当然是Twitter流媒体时的一个问题,因为Twitter一次只允许用户创建一个流,因此这实际上意味着在第一个流接收到一些数据之前,您无法创建第二个流


不幸的是,我们目前还没有解决方案,但我们正在考虑在2.4时间线上引入一个新的较低级别的流式API,这肯定会允许这一点。

那么在2.4中如何处理它呢?在2.4中没有解决。但是在2.5(正在进行中)中,我们已经切换到Akka streams,它提供了一种异步向上游发送取消的方法。我注意到,这次WC类扩展了Closeable接口:),因此应该很容易实现这一点
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")) }