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 播放选定的媒体项?