3

我正在尝试在 JAVA 中在 GAE 上构建一个聊天应用程序。我需要统计所有在线用户及其网络(某种聊天室),并且这些信息需要不断更新。我(错误地?)假设我可以只使用 Java 的 SerlvetContext 和 Set/Get Attribute 方法来更新在线\离线用户并与所有 servlet 共享该信息。据我所知(有可爱的错误),由于 GAE 是分布式\云服务,它不能有效地实现 ServletContext.setAttribute - 这意味着我的应用程序可能运行在多个 JVM 上,并且 ServletContext 上的信息仅共享在属于同一个 JVM 的 servlet 之间。

当然,这对我来说是个大问题。几个问题 - 1) ServletContext 确实不能在 GAE 上正常工作吗?2)对于像我这样的初学者网络开发者来说,GAE 是一个糟糕的选择吗?在我看来,我总是发现新的问题和不符合 Servlet\JSP 规则的东西。既然初学者学习 Servlets 已经够难了,也许 GAE 不是正确的选择?3)那么我怎样才能在 Servlet 之间共享信息?

4

2 回答 2

2

如果您真的只是出于自己的目的而尝试学习 Java EE,那么出于您提到的原因,我可能会避免使用 GAE。这是一项非常好的服务,但是是的,它有自己的一套警告,可能会妨碍您的学习。您最好只为您的目的启动一个 EC2 实例。

也就是说 - 你是对的,AppEngine 将启动和关闭实例来服务请求。如果您想要共享状态,您应该使用跨实例共享的 memcache,但您必须管理对 memcache 对象的访问,以防止多个用户同时写入它。

于 2012-04-18T15:18:34.267 回答
0

在谷歌应用引擎中,应用程序状态通常在使用数据存储的实例之间共享。由于您的要求更实时,并且使用轮询可能表现不佳,您应该使用 Channel API(可能除了数据存储之外):

https://developers.google.com/appengine/docs/java/channel/

从该页面引用:

Channel API 在您的应用程序和 Google 服务器之间创建持久连接,允许您的应用程序在不使用轮询的情况下实时向 JavaScript 客户端发送消息。这对于旨在立即向用户更新新信息的应用程序很有用。

于 2013-09-27T06:45:16.063 回答