【问题标题】:twitter4s: how to return future from Action.async in play frameworktwitter4s:如何在播放框架中从 Action.async 返回未来
【发布时间】:2020-02-15 06:50:29
【问题描述】:

我正在使用twitter4splay-framework-2.4.3

我正在获取发送给参与者的推文以对其执行一些处理,并且参与者需要将响应发送回控制器动作 这是我的代码

def totalTweetCount = Action.async {
    log.debug("in the action tofaltweets")
            def getTweet: PartialFunction[StreamingMessage, Unit] = {
      case tweet: Tweet =>
        future = ask(myActor, TotalNumberOfTweets(tweet)).mapTo[Int]  
    }
    val streaming: Future[TwitterStream] = streamingClient.sampleStatuses(stall_warnings = true)(getTweet)
}


class MyActor extends Actor {
//sends back the response to the calling code
}

现在问题是下面的行连续运行(它的推特流)并连续调用 getTweet 方法并将推文对象发送给演员

val streaming: Future[TwitterStream] = streamingClient.sampleStatuses(stall_warnings = true)(getTweet)

我想获取参与者响应并将其显示在我的操作的 Ok 块中 当我做这样的事情时,我得到了NullPointerException

def totalTweetCount = Action.async {
    log.debug("in the action tofaltweets")



      def getTweet: PartialFunction[StreamingMessage, Unit] = {
          case tweet: Tweet =>
            var future: Future[Int] = null
            future = ask(myActor, TotalNumberOfTweets(tweet)).mapTo[Int]

        }
        val streaming: Future[TwitterStream] = streamingClient.sampleStatuses(stall_warnings = true)(getTweet)
    future.map {
              result =>
                Ok("Total number of tweets" + result)
            }
      }

如果我这样做 def totalTweetCount = Action.async { log.debug("in the action tofaltweets")

def getTweet: PartialFunction[StreamingMessage, Unit] = {
  case tweet: Tweet =>
    var future: Future[Int] = null
    future = ask(actorManager, TotalNumberOfTweets(tweet)).mapTo[Int]
    future.map {
      result =>
        Ok("Total number of tweets" + result)
    }
}
val streaming: Future[TwitterStream] = streamingClient.sampleStatuses(stall_warnings = true)(getTweet)

} 它也错了 那么正确的方法应该是什么

【问题讨论】:

    标签: scala playframework twitter4j playframework-2.4 twitter4s


    【解决方案1】:

    我不确定你想在这里做什么,但它就是这样:

    在所有解决方案中,您都在控制器内部调用 streamingClient.sampleStatuses 方法,这没有多大意义,因为这是一种流式方法。阅读 twitter4s 文档,似乎他们有一种异步获取推文的方法。

    现在,如果您要做的是接收推文,将它们存储起来,然后它们以单独的方法获取总金额,您应该:

    在您的 main 方法中调用 streamingClient.sampleStatuses 并将传入的推文发送给您的演员

    streamingClient.sampleStatuses(stall_warnings = true) {
      case t: Tweet => tweetsActor ! t    
    }
    

    这会将所有推文数据发送到您的演员类。假设您的演员的实现将类似于

    class Tweets extends Actor {
      var tweets = ListBuffer[Tweet]()
    
      def receive = {
        case t: Tweet => tweets += t
        case TotalTweetCount = sender() ! tweets.length
      }
    }
    

    您的控制器方法将如下所示:

    import akka.pattern.ask_
    
    def totalTweetCount = Action.async {
      (tweetActor ? TotalTweetCount).mapTo[Int]
    }
    

    这应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      相关资源
      最近更新 更多