2012-03-28 55 views
1

我有一个Java GAE应用程序,应该在我部署应用程序的新版本时清除memcache。我正在使用静态初始化程序,即 static {MemcacheServiceFactory.getMemcacheService()。clearAll(); }GAE初始化建议练习

但是,无论何时启动新实例,这都会清除memcache,这不是期望的行为。

什么是执行初始化代码的正确方法?

TIA

+2

为什么不只是版本化您的memcache条目,并在版本不匹配的情况下放弃它们,而不是试图以编程方式在每次部署时清除整个memcache内容?如果你在memcache键中包含了版本号,它会为你有效地处理这个问题(因为如果foo-1-blah在高速缓存中并且你试图请求foo-2-blah,那将是一个未命中)。 – Amber 2012-03-28 21:38:36

+0

除非您在部署时自行运行,否则无法在每次部署时仅运行一次。琥珀的建议是一个很好的建议。 – 2012-03-29 09:12:18

回答

-4

一次的应用的初始化可以在Servlet的init()方法来进行。下面是一个例子

public class CatalogServlet extends HttpServlet { 
    private BookDB bookDB; 
    public void init() throws ServletException { 
     bookDB = (BookDB)getServletContext(). 
     getAttribute("bookDB"); 
} 

在上面的例子中,ServletContext属性是,当然,只是小服务程序调用(以正常的方式保持状态)之间存在的变量。这当然,假设你在其他地方将这个变量存储在ServletContext中。另一种方法是在部署描述符中创建变量。

要部署描述符(web.xml)中设置初始化参数,这里有一个例子:

<servlet 
    <servlet-name... 
    <servlet-class ... 
    <init-param> 
     <param-name>param1</param-name> 
     <param-value>value1</param-value> 
    </init-param> 
</servlet> 

如果这不回答这个问题,请澄清“每当一个新的实例启动”。

+0

每次实例由App Engine启动时,都会调用init方法,由于请求加载或不活动,该方法可能随时发生。所以假设init方法在部署之后才被调用是不正确的,这是海报请求的。 – Brummo 2012-03-29 05:14:28

+0

他并没有要求如何获取初始化参数,而是询问您如何在每次部署时只运行一次初始化代码。鉴于GAE将会起飞并且无情地摧毁实例,可能会有数百个实例同时运行,这是一个很好的问题。 – Simon 2012-03-29 17:50:40

3

我使用工厂创建我的memcache密钥,并且他们总是附加我的应用程序的版本号,所以当我上传新版本时,密钥是新的,我忘记了旧的缓存值,它们将消失拥有。

我也有一个servlet在web.xml中定义,只有admin的安全约束,然后在升级后手动浏览到它的URL(/ admin/example) - 以admin身份登录。这个servlet让我运行一次代码来启动任何升级存储数据和清除缓存的任务。

<security-constraint> 
    <web-resource-collection> 
     <url-pattern>/admin/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>admin</role-name> 
    </auth-constraint> 
</security-constraint> 
+0

更新:Google最近向管理控制台添加了一个按钮,用于清除应用上的memcache。所以每当我升级,现在我只是打那个按钮。 – bsautner 2012-04-20 12:10:48