Wicket in der GAE – Mit Git Submodules, Wicket und Maven in die Cloud

Hallo zusammen,

ich habe mich heute mal ein wenig mit Wicket 6 im Zusammenhang mit der Google App Engine beschäftigt.

Über die Google App Engine lassen sich Applikationen in die Google Cloud deployen. Die Applikation um die es hier gehen soll ist hier erreichbar.

Es ist schon beinahe unfassbar, wie einfach es ist, eine Wicket Applikation in die Appengine zu deployen.

Folgendes ist zu tun:

Zunächst einfach eine einfache Maven-Archetype-Applikation erstellen:

[code]

mvn archetype:generate -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -DarchetypeVersion=6.0-SNAPSHOT -DgroupId=de.effective -DartifactId=effectivetrainings -DarchetypeRepository=https://repository.apache.org/content/repositories/snapshots/ -DinteractiveMode=false

[/code]

Es gibt ein schönes Projekt im Wicketstuff-Projekt, den wicketstuff-gae-initializer.

Problem, die releasten Maven-Artefakte sind noch nicht Wicket6-Ready. Hierfür nutzen wir einfach das Submodule Feature von GIT.

Zunächst initialisieren wir ein GIT-REPO im Verzeichnis des frisch erzeugten GAE-Projektes.

[code]

git init

[/code]

Anschließend clonen wir uns das Wicketstuff-Projekt als Submodule.

[code]

git submodule add git@github.com:wicketstuff/core.git wicketstuff

git submodule init

git submodule update

[/code]

Dadurch wird das komplette Wicketstuff-Repo in den Unterordner “wicketstuff” gecloned.

Anschließend erzeugen wir uns ein base-reactor pom:

[code language=”xml”]

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>de.effective</groupId>
<artifactId>effectivetrainings-base</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!– TODO project name  –>
<name>effective trainings base</name>
<description></description>
<modules>
<!–adding–>
<module>wicketstuff/jdk-1.6-parent/gae-initializer-parent/gae-initializer</module>
<module>ui</module>
</modules>

</project>

[/code]

Das erzeugte GAE-Projekt verschieben wir in das Unterverzeichnis /ui.

Was gewinnen wir dadurch?

Das GAE-Initializer-Projekt wird einfach mitgebaut und dadurch können wir eine einfache Maven-Abhängigkeit auf das Initializer-Projekt in der Version 6.0-SNAPSHOT deklarieren, die noch nicht in einem öffentlichen Maven-Repo verfügbar ist.

Wie genau funktioniert der Initializer?

Zunächst nutzt er das Initializer-Konzept von Wicket.

Ein Initializer implementiert das Interface IInitializer. Hierdurch kann eine Applikation nach dem Starten initialisiert werden. Das Interface IInitializer sieht so aus:

[code language=”java”]

public interface IInitializer
{
/**
* @param application
*            The application loading the component
*/
void init(Application application);

/**
* @param application
*            The application loading the component
*/
void destroy(Application application);

}

[/code]

Es werden alle Initializer durchlaufen, die in einer Datei wicket.properties im Classpath deklariert sind. Im GAE-Initializer Projekt befindet sich eine Datei wicket.properties mit folgendem Inhalt, einfach den vollqualifizierten Klassennamen aller Initializerklassen.

[code]

initializer=org.wicketstuff.gae.GaeInitializer

[/code]

Was macht jetzt der GAEInitializer?

[code language=”java”]

// disable ModificationWatcher
application.getResourceSettings().setResourcePollFrequency(null);

// use plain JDK Object(Input|Output)Stream
ISerializer serializer = new GaeObjectSerializer(application.getApplicationKey());
application.getFrameworkSettings().setSerializer(serializer);

// save older version of pages in the HttpSession
final IDataStoreEvictionStrategy evictionStrategy = new PageNumberEvictionStrategy(10);
application.setPageManagerProvider(new GaePageManagerProvider(application, evictionStrategy));

// disable file cleaning because it starts a new thread
application.getResourceSettings().setFileCleaner(null);

[/code]

Durch diese Implementierung stellt der Initializer sicher, dass Wicket in der Google-App-Engine keine temporären Dateien für die Diskpage-Stores erzeugt (in der GAE nicht erlaubt), sondern Pages in der HttpSession speichert.

Die GAE erlaubt eine maximale Sessiongröße von 1MB pro Usersession. Wir müssen also zusätzlich sicherstellen, dass unsere Sessions nicht zu groß werden. Auch dies erledigt der Initializer durch

[code language=”java”]

final IDataStoreEvictionStrategy evictionStrategy = new PageNumberEvictionStrategy(10);
application.setPageManagerProvider(new GaePageManagerProvider(application, evictionStrategy));

[/code]

Durch die PageNumberEvictionStrategy werden maximal 10 Seiten in der Session gehalten, alle anderen werden gelöscht.

Das ist aber alles intern, was muss man jetzt machen, um die Applikation in der GAE laufen zu lassen?

NICHTS!! es reicht eine Dependency auf den GAE-Initializer, der Rest passiert erstmal automatisch.

Um die Datei in der GAE-Deployen zu können benötigen wir noch die Datei appengine-web.xml unter WEB-INF/.

[code]
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>[Applikationsname der GAE-Applikation]</application>
<version>1</version>
</appengine-web-app>
[/code]

Mit meinem Google-Account hab ich automatisch Zugriff auf die Google-App-Engine.

Bevor wir deployen können müssen wir noch eine Applikation konfigurieren:

Die meisten IDEs erlauben ein einfaches Deployment in die GAE. Ich versuche das Ganze mit IntelliJ.

Hierzu wird einfach für das ui-maven-modul ein GAE-Facet konfiguriert (F4 für Module Settings und dann unter Facets)


Das Schöne ist, sobald das Facet konfiguriert ist bietet IntelliJ die Möglichkeit, Applikationen direkt in die GAE zu deployen.
(Eclipse bietet dasselbe mit dem GAE Plugin).

Die Applikation ist auf github gehostet inkl. aller Git-Submodules, kann also einfach ausgecheckt und gebaut werden. Gehostet hier.

[code]
<pre>git remote add origin git@github.com:dilgerma/effectivetrainings.git</pre>
[/code]

Viel Spaß mit Wicket in der Cloud!

Effective Trainings & Consulting - Martin Dilger



Hat Ihnen dieser Blog-Eintrag gefallen? Ich stelle in diesem Blog Informationen über Tools, Frameworks und Werkzeuge zur Verfügung, die mich produktiver machen. Vielleicht kann ich auch Ihnen helfen, produktiver zu werden.


Ich unterstütze Sie als freier Mitarbeiter bei der Entwicklung von Software-Projekten, Agiler Arbeit sowie Schulungen / Fortbildungen.


Jeden Tag ein bisschen produktiver - ab heute