我现在正在使用 twitter4j 开发一个 Twitter 应用程序。基本上,我允许用户创建帐户、添加他们的个人关键字并开始他们自己的流。
我正在尝试尽可能地使用 Twitter API。避免速率限制,不要一遍又一遍地连接同一个帐户等。所以我想我需要做的是有一些对象包含所有 Activity 的 TwitterStream 对象的列表,但我不知道如何处理这个.这是启动流的 Controller 。
public static Result startStream(){
ObjectNode result = Json.newObject();
if (
//openStreams is a Map<Long,TwitterStream> in the TwitterListener class
TwitterListener.openStreams.containsKey(Long.parseLong(session().get("id")))
){
result.put("status", "running");
return ok(result);
}
Cache.set("twitterStream", TwitterListener.listener(
Person.find.byId(
Long.parseLong(session().get("id"))
)
)
);
result.put("status", "OK");
return ok(result);
}
如您所见,我现在将它们放入缓存中,但我希望让流长时间保持打开状态,因此缓存是不够的。
为此目的构建我的应用程序的最合适方法是什么?
我应该使用 Akka 吗?
我如何实现 Play 的全局对象来执行此操作?
最佳答案
一旦您开始考虑在您的应用程序中引入全局状态,您就必须问问自己,我是否有可能想要扩展到多个节点,或者为了冗余目的而拥有多个节点?如果答案是肯定的,那么你应该使用 Akka,因为 Akka 将允许你通过简单地引入一个一致的散列路由器来轻松地调整你的代码以在具有 Akka 集群的多节点环境中工作。如果您不使用 Akka,那么当需要多节点时,您实际上必须重新设计您的应用程序。
因此,我将假设您希望对您的应用程序进行 future 验证,并解释如何使用 Akka(即使您不需要多个节点,Akka 仍然是一种管理全局状态的好方法)。
因此,在 Akka 中,您想要的是一个作为流管理器的 actor,如果流 actor 本身不存在,它将负责创建流 actor。然后流参与者将负责处理流,将流发送给订阅者,并跟踪有多少连接订阅了它们,并在不再有任何订阅者时关闭。
关于java - Play Framework 中的全局变量/跟踪打开的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21805439/