【问题标题】:Using twitter4j asynchronously from Scala从 Scala 异步使用 twitter4j
【发布时间】:2013-02-07 19:12:37
【问题描述】:

我想在我的 Scala 应用程序中使用 AsyncTwitter。有没有办法将它包装在期货中,让它看起来更像是惯用的 Scala?或者期货真的可以将同步的东西转换为异步的(即,对已经异步的函数没有用处)?

无论哪种方式,在 Scala 中进行异步 twitter 状态更新最惯用的方式是什么

  1. AsyncTwitter 代码包装在futures 中?
  2. 以后封装同步代码?
  3. 忘记期货,只需在 Scala 中重写以下代码。

并且(尤其是如果 #1 是答案)最终代码会是什么样子?

这是我想知道的代码:http://twitter4j.org/en/code-examples.html#asyncAPI

TwitterListener listener = new TwitterAdapter() {
    @Override public void updatedStatus(Status status) {
      System.out.println("Successfully updated the status to [" +
               status.getText() + "].");
    }

    @Override public void onException(TwitterException e, int method) {
      if (method == TwitterMethods.UPDATE_STATUS) {
        e.printStackTrace();
      } else {
        throw new AssertionError("Should not happen");
      }
    }
}
// The factory instance is re-useable and thread safe.
AsyncTwitterFactory factory = new AsyncTwitterFactory(listenrer);
AsyncTwitter asyncTwitter = factory.getInstance();
asyncTwitter.updateStatus(args[0]);

我猜 #2 不是答案,因为那样你仍然会被挂起的同步线程的开销所困扰,对吧?

【问题讨论】:

    标签: scala


    【解决方案1】:

    使用 Scala 的 Futures 的实现如下所示(示例是 getDirectMessages):

    class DirectMessageListener extends TwitterAdapter {
    
      val promise = Promise[Seq[DirectMessage]]()
    
    
      override def gotDirectMessages(messages: ResponseList[DirectMessage]) {
        promise.success(messages)
      }
    
      override def onException(te: TwitterException, method: TwitterMethod) {
        promise.failure(te)
      }
    }
    
    class TwitterClient(twitter: Twitter) {
    
      val factory = new AsyncTwitterFactory()
    
      def getDirectMessage(): Future[Seq[DirectMessage]] = {
        val listener = new DirectMessageListener
        val asyncTwitter = factory.getInstance(twitter)
        asyncTwitter.addListener(listener)
        asyncTwitter.getDirectMessages()
        listener.promise.future
      }
    
    }
    

    用法:

    val client = new TwitterClient(???)  
    client.getDirectMessage() onComplete (_.foreach(println))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多