Montag, 3. August 2009

Grails App Engine auf Eclipse starten

Die Vorbereitungen sind abgeschlossen:
Auf der Grails Plugin Seite ist beschrieben, wie man seine erste App Engine Applikation erstellt.

Dabei ergaben sich bei mir folgende Fehler:

  1. Beim deployen der Applikation mit grails app-engine deploy hatte ich manchmal Probleme bei der Nutzername/Passwort Eingabe, ausserdem ists eh nicht schön jedes Mal die Daten wieder und wieder einzugeben.
  2. Bei Versuch die App-Engine aus Eclipse heraus zu starten (debug oder run Configuration) erscheint die Fehlermeldung 'grails run-app' is not supported with AppEngine.
  3. Einmal die App Engine gestartet, lässt sich die AppEngine nichtmehr stoppen, ausser gewaltsam über den Taskmanager
Ersteres Problem lässt sich dadurch lösen, dass in der Config.groovy die entsprechenden Daten eingetragen werden. Über die keys google.appengine.email und google.appengine.password können die Werte festgesetzt werden.

Um das zweite Problem gleich mit zu lösen hab ich diese Datei in mein Projektordner mit dem eigentlichen Projekt in das Verzeichnis projektname\scripts kopiert und in RunApp.groovy umbenannt. Jetzt fragt Eclipse immer welche RunApp beim Starten der Applikation verwendet werden soll und man kann die aus dem Projektverzeichnis wählen, hinter der sich eigentlich die AppEngine.groovy verbirgt.

Zum Dritten hab ich noch nichts sinnvolles gefunden... auch beim Starten und vor allem Stoppen aus Eclipse raus bleibt noch ein Java-Prozess über, den man abschießen muss. Auch scheint das Debuggen der Applikation mit Eclipse nicht möglich. Dazu soll wohl NetBeans in der Version 6.7 besser sein Link

Objekte in der Google Database suchen

Mit der Google App Engine erhält man Zugang zu der skalierbaren Infrastruktur von Google.
Um diese Skalierbarkeit effektiv auszunutzen, gibt es von Jason Cooper eine Reihe von Artikel über dieses Thema mit dem Titel: "Effectively scaling your App Engine-based apps"
Die orginal Artikel sind unter: Scaling zu finden.

Hier eine Zusammenfassung der Artikel mit einigen Erläuterungen dazu.

Direct lookups vs. Querys

Zusammenfassung:
Direct lookups statt Querys benutzen sofern möglich!

pm.getObjectById(Klasse.class,
key) statt
Query q = pm.newQuery(Klasse.class);
q.setFilter("key == mykey")
q.declareParameters("
com.google.appengine.api.datastore.Key key")
q.execute(mykey);

Der Googe App Engine Datastore ist für Lesezugriffe optimiert. Auf der System Status Seite von Google (unter Datastore) lässt sich nachschaun, dass
Querys im Vergleich direct lookups (get) zu eine deutlich höhere (~4x) Latenz haben.
Für die Umsetzung in Java bedeutet dies, dass die getObjectById Methode des PersistenceManager ausgerufen wird, statt newQuery. Dies geht natürlich nur, wenn auch die ID des Objects bekannt ist.

Fortsetzung folgt...



Google App Engine

Da ich mich seit kurzem mit der Google App Engine beschäftige, habe ich beschlossen einen Blog aufzumachen, in dem ich über meine Erfahrungen damit berichte.

Ich werd über Konfigurationsprobleme, Programmiertipps und sonstwas berichten, nicht zuletzt um selbst eine Art FAQ zu bekommen, in dem ich nochmal nachschlagen kann.

Da ich mit Grails vertraut bin, wird mein ersten Projekt auch mit Gails 1.1.1 umgesetzt, wofür es auch schon ein entsprechendes Plugin gibt. App-Engine Plugin

Als Entwicklungsumgebung kommt Eclipse 3.5 zum Einsatz