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 ではユーザーが一度に 1 つのストリームしか作成できないためです。つまり、最初のストリームがデータを受信するまで、2 番目のストリームを実行できないことを意味します。

残念ながら、まだ回避策はありませんが、2.4 タイム ライン頃に新しい下位レベルのストリーミング API を Play に導入することを検討しており、確実にこれが可能になります。

于 2014-03-13T21:25:34.040 に答える