2012-03-28 12 views
1

Ich habe eine Java GAE App, die das Memcache löschen sollte, wenn ich eine neue Version der App bereitstellen. Ich verwende statische Initialisierung, d. H. statische { MemcacheServiceFactory.getMemcacheService(). ClearAll(); }GAE Initialisierung empfohlen Praxis

Dies würde jedoch auch das Memcache löschen, wenn eine neue Instanz gestartet wird, was nicht das gewünschte Verhalten ist.

Was ist der richtige Weg, um Initialisierungscode auszuführen?

TIA

+2

Warum nicht einfach Ihre Memcache-Einträge versionieren und verwerfen, wenn die Version nicht übereinstimmt, anstatt zu versuchen, den gesamten Inhalt von memcache mit jeder Implementierung programmatisch zu löschen? Wenn Sie die Versionsnummer in den Memcache-Schlüssel aufnehmen, wird dies effektiv für Sie erledigt (denn wenn foo-1-blah im Cache ist und Sie versuchen, foo-2-blah anzufordern, wird das ein Fehler sein). – Amber

+0

Es gibt keine Möglichkeit, nur einmal bei jeder Bereitstellung etwas auszuführen, es sei denn, Sie führen es bei der Bereitstellung selbst aus. Ambers Vorschlag ist gut. –

Antwort

-4

Einmal Initialisierungen von Anwendungen in der init() -Methode des Servlets erfolgen. Hier ist ein Beispiel

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

In dem obigen Beispiel das ServletContext Attribut ist natürlich nur eine Variable, die zwischen Servlet-Anrufe (die normale Art und Weise Zustand zu halten) vorhanden ist. Dies setzt natürlich voraus, dass Sie diese Variable im ServletContext irgendwo anders gespeichert haben. Die andere Möglichkeit besteht darin, die Variable im Deployment-Deskriptor zu erstellen.

Zur Initialisierung Parameter innerhalb Ihres Deployment Descriptor (web.xml) gesetzt, hier ein Beispiel:

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

Wenn dies nicht funktioniert, beantworten, bitte klären „wenn eine neue Instanz gestartet wird“.

+0

Die init-Methode wird jedes Mal aufgerufen, wenn eine Instanz von App Engine gestartet wird, was aufgrund von Ladeanforderungen oder Inaktivität jederzeit passieren kann. Es ist also falsch anzunehmen, dass die init-Methode NUR nach der Bereitstellung aufgerufen wird, was das Poster angefordert hat. – Brummo

+0

Er fragt nicht, wie man Initialisierungsparameter erhält, er fragt, wie man Initialisierungscode nur einmal pro Deploy ausführt. Angesichts der Tatsache, dass GAE Instanzen aufspüren und rippen wird, mit potenziell hunderten von Instanzen gleichzeitig, ist es eine gute Frage. – Simon

3

Ich erstelle meine Memcache-Schlüssel mit einer Fabrik und sie werden immer mit der Versionsnummer meiner App angehängt. Wenn ich also eine neue Version hochlade, sind die Schlüssel neu. Ich vergesse die alten Cache-Werte, die auf ihrem verschwinden werden besitzen.

Ich habe auch ein Servlet in web.xml mit einer Sicherheitseinschränkung nur für Admin definiert, dann gehe ich nach einem Upgrade manuell zur URL (/ admin/example) - loggen Sie sich als admin ein. Das Servlet enthält meinen einmal ausgeführten Code, um alle Aufgaben zum Aktualisieren von Geschäftsdaten und zum Leeren des Caches auszulösen.

+0

Update: Google hat kürzlich eine Schaltfläche zur Admin-Konsole hinzugefügt, um Memcache in Ihrer App zu löschen. Also, wann immer ich upgrade, jetzt habe ich nur diesen Knopf gedrückt. – bsautner