Im Rahmen der Vorbereitungen für die jüngste Version 1.0.0 von jclouds habe ich die bestehende Tweetstore-Demoanwendung aufgeräumt und sie auf die Tomcat-basierte RUN@cloud-Plattform von CloudBees portiert.
Ein wichtiger Bestandteil des Test-Harness für die Originalversionen von Tweetstore, die auf der Google App Engine laufen, ist die hübsche Klasse
GoogleDevServe. Im Grunde handelt es sich dabei um einen cleveren Wrapper um die
Einfach schon einen Container spawnen?
Sowohl das maven-gae-plugin als auch das bees-maven-plugin ermöglichen es Ihnen natürlich, eine lokale GAE- oder RUN@cloud-Server-Simulation zu starten. Diese können leicht in Ihr Maven-Build integriert werden, zum Beispiel als Teil Ihrer
- Integrationstests neben Unit-Tests aus einer IDE heraus ausführen, ohne daran denken zu müssen, einen externen Prozess zu starten
- die auf dem Server laufende Anwendung bei Bedarf zu debuggen, ohne sich mit Remote-Debuggern herumschlagen zu müssen oder einen Weg zu finden, die Maven-Plugins manchmal in den Debug-Modus zu versetzen
- mit den Server-Argumenten ein wenig bedingte Magie anwenden
Wenn die Anforderungen Ihres Projekts ähnlich sind, könnte ein Inline-Server eine gute Option sein. Und zum Glück wurde der Code bereits geschrieben!
Herumlungern

Meuchelmörder und andere Ninja-Tricks
Der erste der beiden Threads ist ein Timer, den etwas namens WebAppEngine verwendet, um... nun, wer weiß? Auf jeden Fall können wir mit einer ordentlichen Portion Reflexion einen Verweis auf ihn erhalten und ihnJetzt sehen Sie es, jetzt nicht mehr?
Das verbleibende Problem besteht darin, den eingängig benannten KillerCallback in den idleTimer zu injizieren . Selbst bei Verwendung von Reflection ist dies ein elementarer Gleichzeitigkeitsfehler, denn ohne eine Synchronized-With-Beziehung5 zwischen der Injektion des neuen Handlers und dem Aufruf des Handlers durch idleTimer gibt es keine Garantie dafür, dass der neue Handler tatsächlich für den Thread sichtbar ist, den wir zu stoppen versuchen. Eine solche Beziehung könnte hergestellt werden, wenn der "Attentäter" injiziert würde , bevor der Thread, der idleTimer ausführt, startet. Wenn wir nicht die Bibliotheksklassen überschreiben wollen, würde das bedeuten, dass wir ihn nach der Erstellung, aber vor dem Start des StaxSdkAppServer6 setzen müssten... was leider auch nicht funktioniert, da die Instanzen, die idleTimer referenzieren, erst beim Start des Servers erstellt werden.Und?
Für den Moment ist das potenzielle Gleichzeitigkeitsproblem also dokumentiert und wir hoffen auf das Beste ;-) Bis jetzt wurden keine Probleme beobachtet...- Das maven-gae-plugin ist eine weitere gute Option, um die lokale GAE-Simulation des SDK zu starten. Der Vorteil von
GoogleDevServer ist, dass er sich auch sauberbeenden lässt, von Ihrer IDE aus ausgeführt werden kann und es Ihnen außerdem ermöglicht, der WAR vor dem Start zusätzliche Dateien hinzuzufügen. Tweetstore nutzt dies, um Anmeldedaten für verschiedene Cloud-Speicheranbieter hinzuzufügen - nicht gerade das, was Sie wahrscheinlich in Github speichern möchten ;-) - aber siehe hier
- CloudBees übernahm Stax im Dezember 2010
- Hier kommt die Möglichkeit, von einer IDE aus zu arbeiten, voll zum Tragen!
- wie sie z.B. von flüchtig
- Tatsächlich verwendet der Code einen fast exakten Klon namens StaxSdkAppServer2, der einfach die Erstellung der Serverinstanz vom Start trennt.
Verfasst von
Andrew Phillips
Contact



