我正在尝试在JAVA中的GAE上构建聊天应用程序。我需要保留所有在线用户及其网络(某种聊天室)的数量,并且这些信息需要不断更新。 我(错误地?)假设我可以使用Java的SerlvetContext和Set / Get Attribute方法来更新online \ offline用户并与所有servlet共享该信息。正如我所知道的(有可爱的错误),因为GAE是分布式\云服务,它没有有效地实现ServletContext.setAttribute - 意思是我的应用程序可能在多个JVM上运行,并且ServletContext上的信息仅被共享属于同一JVM的servlet之间。
当然,这对我来说是个大问题。 几个问题 - 1)ServletContext确实无法在GAE上正常工作吗? 2)GAE对于像我这样的初学者网络开发者来说是一个糟糕的选择吗?在我看来,我总是发现新的问题和与Servlet \ JSP规则不符的事情。由于初学者学习Servlet很难,也许GAE不是正确的选择? 3)如何在Servlet之间共享信息?
答案 0 :(得分:2)
如果您真的只是为了自己的目的而学习Java EE,我可能会因为您提到的原因而避免使用GAE。这是一项非常好的服务,但是,它有一套可能妨碍你学习的警告。你可能最好只为你的目的启动一个EC2实例。
那就是说 - 你是对的,AppEngine会上下调整实例以满足请求。如果你想要共享状态,你应该使用跨实例共享的memcache,但你必须管理对memcache对象的访问,以便多个用户同时写入它。
答案 1 :(得分:0)
在Google应用引擎中,应用程序状态通常在使用数据存储区的实例之间共享。由于您的要求更加实时,并且使用轮询可能表现不佳,您应该使用Channel API(可能除数据存储外):
https://developers.google.com/appengine/docs/java/channel/
从该页面引用:
Channel API在您的。之间创建持久连接 应用程序和Google服务器,允许您的应用程序发送 在不使用的情况下实时向JavaScript客户端发送消息 轮询。这对于旨在更新用户的应用程序非常有用 关于新信息。