Der zweite Tag began mit einer sehr amüsanten Keynote von Adrian Colyer dem CIO von Interface21. In dieser führte er zuerst in die unterschiedlichen Arten der Programmiersprachen ein. Einmal waren dies die typisierten Sprachen à la Java, dann stellte er die dynamisch typisierten sprachen á la Groovy dar. Die beste darstellung war aber auf jeden Fall die Vorstellung von DuckTyping. Adrian stellte das ganze sehr plastisch dar, wie seine eavluierung ducktyping ist. Weitere mit Sicherheit nicht so amüsante über Ducktyping finden sich hier.
Adrian stellt weiterhin das komplette Portfolio des Spring Ökosystems dar. Die sind natürlich das Spring Framework, Spring Webflow für das erstellen von Dialogabläufen in form von deklarativen Prozessen. Weitere Produkte sind Spring Security (bis Release 2.0 Aceig genannt), Spring OSGI zur Integration von Spring in OSGI, sowie Spring Batch für das ausführen von Batches im Java Umfeld.
Bei der Vorstellung von der Spring-IDE von Eclipse erwähnte Adrian auch, das in Vancouver, US auch ein neues Entwiclungszentrum von Interface21 entstehen soll. In diesem sollen Interface21 Entwickler und die Entwickler des Eclipse Mylyn Projektes zusammenarbeiten. Man darf also gespannt sein welches netten Innovationen aus diesem Labor heraus enstehen.
Adrian zeigt auch Fotos vom zukünftigen Entwicklungslabor in Southhampton sowie Bilder vom Labor in Florida.
Eric Evans
Nach der sehr lustigen und interessanten Keynote von Adrian übernahm Eric Evans, auf welchen beitrag ich mich persönlich bereits im Vorfeld gefreut habe. Eric stellte die Bedeutung von Modellen innerhalb von Softwareprojekten dar. Dabei zeigte er das Modelle nicht unbedingt irgendwelche UML Diagramme sein müssen oder auch können. Modelle sind die Abstraktion einer Themas für den entsprechenden Kreis. Dazu zeigte er einmal eine Karte von China auf. Die Karte stellte ein Modell für China und die umliegenden Gebiete dar, eine weitere Karte die er aufzeigte diente zur Navigation der Seefahrer. Beide Karten waren zwar im Prinzip Karten, aber diese stellten komplett unterschiedliche Abstraktionen dar. Bei den Karten zeigte Eric auch auf das bestimmte Themengebiete evtl. gar nicht der Realiät entsprechen. So war in der letzteren Karte das Größenverhätlnis von Gröndland nicht richtig dargestellt, aber nur dadurch Konten die Navigationlinien korrekt im Modell abgebildet werden.
Anschließend stellte Eric die provokante These in den Raum das ein Softwareprojekt nicht komplett “sauber” designt werden kann, statt dessen sollte man sich dabei auf die Kerndömane des System fokussieren. Eine Kerndomain ist der einzige Busniess Treiber für die Software selbst damit diese erstellt werden soll, generische oder fremde Soubdomains (z.B. Rechnungserstellung bei einem Tracking System) sollte nur mit dem notwendigen Aufwand designt und gebaut werden. Evtl. sollten diese dazugekauft werden.
Ich denke das entspricht auch der Realität ausserhalb der Softwareentwicklung wieder, ein Unternehmen besteht im wesentlichen auf dem Markt in dem es in der Kerndömäne entsprechende Prozesse definiert und sich dadurch Wettberwerbvorteile sicher. Generische Subdomains oder fremde Subdomains werden dann von Unternehmen gekauft oder eben selbst nur in dem maß verfolgt wie das für die Ausführung der Kerndömäne notwendig ist.
Anschließend zeigte Eric aus dem Projektleben heraus eine Problemstellung in der zwei unterschiedliche Softwareprodukte miteinander kommunizieren müssen. Eric zeigt dabei untrschiedliche Alternativen von der Neutentwicklung bis zum Hacking auf. Dabei stellte er die Vor und Nachteile dar.
Bei einer kompletten Neuentwicklung sind die größten Nachteile das die Entwicklung erst z.B. 2 Jahre braucht um die Funktionalität der alten Lösung zu implementieren. Erst im dritten Jahr können anschließend die neuen Features implementiert werden. Hierbei stellte auch Eric die Probleme in den Vordergrund, während bei einer kompletten Neuimplementierung Anfangs eine große euphorie herrscht, sind die Projektbeteiligten in der Regel nach der Migration sehr gefrustet, da lediglich eine Code Portierung statt gefunden hat und eine neuen Features implementiert wurden.
Bei der Hacking Lösung besteht das Problen darin das die Features des neuen Systems nun überall verstreut ist, dies wäre zu einem die beiden bestehenden System zum anderen die “gehackten” Verbindungen. Die Lösung besteht indem man sich auf die Kerndomäne der neuen Features konzentriert und für die Kommunikation zu den beiden System einen “Anti-Corruption-Layer” einsetzt. So kann die Kerndomäne im neu zu erstellenden System sauber in einem isolierten Bereich implementiert werden.
Dabei ist es auch nicht unüblich das die Implementierung des Anti-Corruption-Layers aufwändiger als die Implementierung der Kerndomäne ist.
Bei der Implementierung eines Anti-corruption-Layers ist auch die Pflege einer Context-map notwendig, da ein Wort bei den (in diesem Beispiel 3) unterschiedlichen Modellen auch unterschiedliche Bedeutungen haben kann.
Also wäre Lösung der Problemstellung der weitere Betrieb der beiden Alt-Systeme, die neu zu erstellenden features werden in eine Kern-Domäne implementiert, diese wiederum kommunieren über einen Anti-Corruption-Layer mit den beiden Alt-Systemen. Mittels eines Kontextmap werden die drei unterschiedlichen Modelle konsistent gehalten.
Alles in allem war der Talk von Eric sehr interessant, ich denke vor allem wenn man sein Buch gelesen hat, sind die Talks eine nette Ergänzung dazu.
Spring Beyond the Obvious - using Spring in complex enterprise projects
Alef Anderesen und Joris Kuipers stellten in diesem Talk die unterschiedlichen Probleme bei einer Anwendung während dem Deployment dar. Dabei stellt Joris erstmal dar wie man einen Applicationcontext innerhalb einer EAR Datei für alle Module verwenden kann. So kann man zum Beispiel beim Einsatz von Hibernate, welches in zwei unterschiedlichen Projekten verwendet wird, die SessionFactory auf EAR Ebene im ApplicationContext konfigrurieren. So lassen sich Ressourcen und evtl. Konfigurationsduplikate vermeiden. Joris hat zu diesem Thema bereits einen Blog geschrieben welcher hier zu lesen ist. Anschließend widmete sich Joris dem Problem wie man eine Anwendung über mehrere Stages verteilen kann (Test/Integration/Produktion). Das Ziel dabei ist es Application Context Konfigurationen zu haben welche für alle Stages und weitere Konfigurationen zu haben welches nur für eine Stage gelten (Datasources, Transaktionsmanager).
Die Lösung besteht darin, indem man alle Stages spezifsichen Konfigurationen im classpath pflegt und die Logik für das laden der Konfigurationen implementiert. So kann man zum Beispiel im ClassPath folgende Struktur anlegen
/src/resources/test/applicationContext.xml
/src/resources/inte/applicationContext.xml
/src/resources/prod/applicationContext.xml
Nun überschreibt man beim ContextLoader die Methode createWebApplicationContext() in welcher die Konfigurationsdateien geladen werden. Dabei muss die Implementierung zum Beispiel durch ein System Paramter die Pfadnamen an die entsprechenden Stages anpassen. Anschließend muss man beim ContextLoaderListener die Methode createContextLoader überschreiben, damit der selbst implementierte ContextLoader anstelle des ContextLoaders verwendet wird.
An dieser Stelle merkt erkennt man die hohe Flexibiliät des Spring Framework. So kann man mit wenigen Zeilen Code seine komplexe Staging Strategie in das Framework einbinden. Das Spring sowas nicht out-of-the-box mitliefert ist dahingehend verständlich, weil jedes Projekt doch sehr spezifsiche Anforderungen an das Deployment einer Anwendung hat.
Insgesamt war das ganze eine sehr gelungene Session, in dieser Joris für sehr komplexe Problemstellungen elegante Lösungswege präsentiert hat.
Messaging and concurrency with Spring
Ich konnte diesen Talk leider nicht vollständig verfolgen, sondern bin erst gegen später dazu gestoßen. Jürgen Höller stellt in diesem Talk die unterschiedlichen Unterstützungen von JMS im Spring Framework vor. Dabei behandelte er zu einem das JMSTemplate welche für das versenden und synchronen Empfangen von Nachrichten verwendet wird, zum anderen die MessageListenerContainer welche für das asynchrone Empfangen von JMS Nachrichten verwendet werden. Dabei stellte er auch die Möglichkeit dar, wie man unterschiedliche Transaktionmanager verwenden kann (JTA, local JMS). Anschließend stellte Jürgen die neuen JMS Namespaces dar, welche in Spring 2.1 verfügbar sind. Mit den JMS Namespaces wird die Konfigurationen der MessageListenerContainer vereinfacht, dies macht sich vor allem beim Einsatz von mehreren Containern bemerkbar. Anschließend führte Jürgen durch die neue JCA Unterstützung für das Empfangen von JMS Nachrichten. Beim JCA Listener findet kein polling durch den Spring Container statt, vielmehr ist diese die Aufgabe des JCA Konnektor. So wird der Spring Container nur dann aktiv wenn wirklich eine Nachricht eintrifft.
Im Prinzip könnte man nun meinen das der Einsatz vom JCA Adapter immer besser ist. Ich denke das ist nicht immer der Fall, ein JCA MessageListener Container macht nur dann Sinn wenn ich auf einem J2EE Server deploye (der MessageListenerContainer wird dabei als RAR deployt), oder aber der JCA Connector wirklich für JCA optimiert ist, und nicht nur selbst ein pooling durchführt, wie es der derzeitige MessageListenerContainer auch macht. An dieser Stelle würde ich dann den MessageListenerContainer vorziehen, da dieser flexibel konfigurierbar ist.
IBM WebSphere & Spring - Together for some time now
Auf diese Session war ich besonders aufgrund meiner Vergangenheit mit Spring und Websphere sehr gespannt. Sara Mitchell wollte dabei in dieser Session die Zusammenarbeit von IBM und Interface21 erläutern. Das Ziel der Zusammenarbeit ist die Zertifzierung von Spring auf den Websphere Application Servern. Sara zeigte erstmal auf das in den vorherigen Websphere Application Server der Transaktionsmanager nicht veröffentllicht wurde, so konnte man mit Spring keine JTA Transaktionen pausieren und wieder fortsetzen. Mit dem neuen 6.0.x und 6.1.X Application Server soll sich dies ändern, Websphere liefert dazu einen WebsphereUoWTransactionManager mit, welcher mit Spring 2.1 eingesetzt wird. Dadurch unterstützt nun Spring 2.1 sämtliche Transaktionssemantiken (pausieren, fortetzen etc.).
Rod Johnson hat zu diesem Thema auch einen Blog geschrieben, welcher hier nachzulesen ist.
Anschließend hat Sara nochmals das Thema Spring MDP auf dem Websphere Applicaton Server besprochen. Spring MDPs werden nicht offiziel von IBM unterstützt, sie sagte aber selbst das einige Projekte bereits Spring MDP erfolgreich auf dem Websphere Application Server betreiben. Ich habe auch hierzu mal einen Blog geschrieben.
Ein weitere Punkt war JMX, zu diesem zeigte Sara ein Beispiel mit den entsprechenden Hinweisen wie diese zu verwenden sind. Weitere Informationen dazu befinden sich im (stark überarbeiteten) developerworks Artikel.
Den Rest der Session beschäftigte sich Sara mit EJB3 und Jax-WS, dabei bermerkte sie das IBM einen Feature Pack für Websphere 6.1 released hat, in welchem EJB3 unterstützt wird. Nach einer kurzen Vorstellung von Session/Stateless Beans sowie JPA unter Websphere war die Session Zeit auch schon vorbei. Mir persönlich hat der letzte weniger gefallen, da dies doch sehr stark am Thema vorbei gegangen ist.
Modeling without over-constraining
In dieser Session ging Eric Evans auf die Thematik der Implementierung von Regeln innerhalb eines DDD getriebenen Projektes ein. Dazu zeigte er ein simples Beispiel aus einem seiner (vielen) Projekte. Bei dem Beispiel ging es darum, das ein Kunde eine komplette Verschiffung einer Sendung plannen kann. Eine Verschiffung besteht dabei aus einer Reise, welche wiederrum aus mehreren Abschnitten besteht. Nun stellt sich hierbei die Frage wie die fachlichen Regeln implementiert werden. Eric plädierte in diesem Beispiel für den Einsatz eine Specification Objektes. Das Spezifikation Objekte überprüft die fachlichen Invarianten ob diese gültig sind. In dem oben genannten Beispiel muss zum Beispiel überprüft werden, ob die vorgeschlagene Reise im Zeitrahmen liegt, welchen der Kunde eingegeben hat.
Eric zeigte dann noch weitere Alternativen für das Implementieren von Regeln innerhalb eines DDD getriebenen Projektes auf. Zum Beispiel können oder auch sollen Regeln in Aggregate implementiert werden. Ein Aggregat hat unter anderem die Aufgabe, die Konsistenz von sich und allen Referenzierten Objekten sicherzustellen. Eine weitere Möglichkeit besteht darin die fachlichen Regeln evtl. im Repository zu implementieren.
Eric konnte auf diese Frage keine allgemein gültige Antwort geben, sondern viel mehr Beispiele nennen, wie er in konkreten Fällen die Regeln implementiert hat. Den Abschluss stellte eine interessante Fragenrunde dar. Dabei ging es Hauptsächlich um die Verwendung von UML für das Modellieren, und wie sich Aggregate damit abbilden lassen. Alles in allem war dies ein sehr interessanter Talk, welcher leider ein wenig zu kurz geraten ist.
Architecture with Spring
In dieser Session ging Eberhard Wolff auf Architekturen mit dem Spring Framework ein. Dabei stellte er von Anfang an die (meiner Meinung nach korrekte) These auf, das Architekturen sich nicht vollständig aus einem Blue Print ableiten lassen. Viel mehr muss ein Blue Print auf die eigene Umgebung gemappt werden, und vor allem man muss selbst darüber nachdenken :-).
Anschließend ging Eberhard auf die Implementierung des Persistence Layers ein. Der Persistence Layer sollte über DAOs (oder auch Repositories) implementiert werden, das schöne unter Verwendung von Spring ist die Transparenz des Persistence Layers. So kann eine Persistence Layer Implementierung bei de Verwendung des Spring Framework im Prinzip ausgetauscht werden, ohne das der Anwendungscode etwas davon mitkriegt. Dies funktioniert durch Dependency Injection, aber auch durch die entsprechen Exception Translation durch das Spring Framework. Mittels der Exception translation erhält man bei jeder DAO Implementierung die entsprechenden DataAccessException anstelle der Persistenzspezifsichen Exceptions.
Anschließend ging Eberhard auf die Implementierung der fachlichen Logik ein. Die fachliche Logik kann zu einem komplett im ServiceLayer implementiert werden, zum anderen aber auch in den Entitäten selbst. Der Nachteile bei der Implementierung innerhalb der ServiceLayer (entspricht dem Transaction Script Pattern) liegt in der häufigen Code Duplikation und den evtl. sehr groß werdenden Implementierungen. Ein Vorteil bei dieser Implementierung ist, das Domäne Objekte einfacher exportiert werden können.
Eberhard zeigte anschließend wie sich die fachlichkeit in den Entitäten selbst implementieren lässt, dabei ging er auf die Vor und Nachteile ein. Dabei stellte er auch die Frage in dem Raum, warum man überhaupt DAOs braucht, und nicht die Persistenz Artefakte in den Domänenobjekten selbst implementiert. Die Implementierung von Persistenz Artefakten in die Domänenpbjekte ist nachteilig, da die (austauschbaren) Persistenz Artefakte am besten in DAOs ausgelagert implementiert werden.
Ein weiteres Thema war das Remoting innerhalb der Architektur, hier ging es darum welche ansätze es durch das Spring Framework gibt. Eberhard stellte dabei auch die Vor- und Nachteile dar, falls man seine Domänen Objekte exportiert.
Den Abschluss der Session bildete die Definition von Schichten, dazu stellte Eberhard die Möglichkeit vor über ApsectJ Pointcuts auf verschiedene Layer in der Architektur zu refernezieren.