twitter4s:如何在播放框架中从 Action.async 返回未来

Posted

技术标签:

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

我正在使用twitter4s 和play-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)

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

【问题讨论】:

【参考方案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]

这应该可以解决问题。

【讨论】:

以上是关于twitter4s:如何在播放框架中从 Action.async 返回未来的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 中从 url 播放动画 GIF 图像?

如何在 iOS 中从 UITableView 播放选定的媒体项?

如何在 android 中从远程 url 播放实时视频流?

如何在 android 中从 react 本机应用程序播放 mov 视频?

如何在 C# 中从内存流中播放 MP3?

android - 如何在我的音乐播放器中从文件管理器播放 mp3 文件?