Generierung WebService-Client für mehrere WSDLs mit Maven

24. January 2009

Um die Java-Klassen für WebService-Clients zu generieren empfiehlt sich das JAX-WS-Plugin für Maven. Dieses klinkt sich bei Verwendung von “wsimport” in die Build-Phase “generate-sources” ein.

Für mich ist es sinnvoll, die WSDL-Dateien des anzusprechenden Services direkt in “src/wsdl” meines Projekts abzulegen statt diese über eine URL einzubinden. Dies hat den Vorteil, dass ich Änderungen an der Schnittstelle des Service in der Subversion-Historie nachvollziehen kann. Muss mein Projekt mehrere Service ansprechen, so lege ich die WSDL- plus die Schema-Datei (XSD) jedes Service im genannten Verzeichnis ab.
Den Rest des Artikels lesen »

Exploded EAR Deployment in Glassfish V2 mit Seam 2.1

15. November 2008

Zuletzt habe ich über das Beschleunigen von lokalen JEE-Deployments geschrieben. Für das Beschleunigen von JEE-Deployments ist meiner Einschätzung nach zwingend das exploded Deployment notwendig. Dabei wird ein EAR oder WAR nicht als Archiv-Datei sondern als entpackte Verzeichnisstruktur deployt. Leider ist das Deployment von exploded EARs und WARs noch nicht durch die JEE-Spezifikation abgedeckt. Daher hat jeder JEE Container dabei so seine Eigenheiten. Die folgenden Zeilen liefern ein paar wichtige Informationen zum lokalen Deployment von explodierten EARs unter Glassfish V2.
Den Rest des Artikels lesen »

Entwicklungsumgebung für JEE-Apps beschleunigen

21. October 2008

Schneller, höher, weiter! Das Entwickeln von JEE-Applikationen ist bestimmt durch Round-Trips aus Code-Änderung, Kompilierung, Re-Deployen und Testen. Da sich diese Round-Trips in kurzen Abständen (Minutenbereich) wiederholen, sollte das Kompilieren und Re-Deployen so wenig Zeit möglich in Anspruch nehmen. Zum einen lässt das schlicht mehr Zeit zum Programmieren und Testen. Zum anderen macht das Arbeiten den Programmierern so einfach mehr Spaß! (… und die Zufriedenheit des Programmierers ist direkt proportional zur Lebensdauer seiner Tastatur).

Den Rest des Artikels lesen »

AspectJ Zeitmaschine

3. October 2008

Durch zeitgesteuerte Aktionen kann ein Softwaresysteme bestimmte Anforderungen umsetzen. Zum Beispiel könnte eine Anforderung sein, dass eine Applikation jede Nacht bestimmte Datenbereinigungen durchführt. Bei OpenWishes prüfen wir beispielsweise periodisch, ob Geburtstagserinnerungen per E-Mail versendet werden müssen. Dies sind natürlich nur triviale Beispiele. Der Faktor Zeit kann nicht nur Aktionen auslösen, sondern auch das Verhalten von Geschäftslogik beeinflußen. Beispielsweise kann der Kunde im Support-Portal nach Ablauf der Garantiezeit eines gekauften Artikels keinen Reklamationsvorgang mehr einleiten.

Den Rest des Artikels lesen »

Atomare Domänentypen - Teil 1

18. July 2008

Domain Driven Design ist spätestens seit dem gleichnamigem Buch von Eric Evans in die Ruhmeshallen der Buzzwords eingegangen. DDD reiht sich ein neben Test Driven Development (TDD), Feature Driven Development und Model Driven Development (MDD). Bei so vielen Drivern frag ich mich, ob wir irgendwann einmal ans Ziel kommen. Spass beiseite - aus meiner Sicht sind das alles Paradigmen, die ihre Berechtigung haben und sogar kombiniert eingesetzt werden sollten.

Domain Driven Design zielt in großen Teilen auf Domänenmodelle ab. Aus meiner Erfahrung verwenden Domänenmodelle, die wirklich etwas auf sich halten, eigene atomare Domänentypen und pfeiffen auf die direkte Verwendung von String, Integer und Co. Dieser Schritt bringt viele Vorteile mit sich, muss jedoch am zusätzlichen Aufwand für die Erstellung der zuzsätzlichen Klassen gemessen werden. Natürlich muss die Notwendigkeit von atomaren Domänentypen aufgrund des Mehraufwands durchdacht und gut begründet sein. Bei der architekturellen Betreuung eines Systems bin ich den Weg der atomaren Domänentypen gegangen und möchte in den folgenden Zeilen ein wenig mit Weisheit prahlen sowie zur Diskussion anregen.

Den Rest des Artikels lesen »

Applet Cookie Nightmare

26. April 2008

Überaschenderweise finden Java Applets auch heute noch immer wieder ihre Nische in Systemlandschaften. Wenn es darum geht, aus einer Web-Anwendung heraus eine Schnittstelle zum lokalen System des Anwenders zu etablieren, sind Applets keine schlechte Wahl. Über die HTML-Seite in welche das Applet eingebunden ist, können Parameter an das Applet übergeben werden. Ebenso ist die bidirektionale Kommunikation zwischen Applet und Javascript möglich (siehe Netscape Live Connect). Ein signiertes Applet erlaubt es, lokale Dateien zu lesen und zu schreiben. Ebenso kann ein signiertes Applet mit entfernten Servern kommunizieren, obwohl es nicht von diesen geladen wurde.

Diese Möglichkeiten sind der Grund für den Einsatz von Applets in meinem aktuellen Projekt in München. Bei einem großen deutschen Automobilhersteller sind Applets ein (sehr kleiner) Teil derSystemlandschaft zum Produktdatenmanagement. Das nur am Rande.

Unter dem Strich erlauben wir dem Anwender mittels eines Applets Dateien zu und vom Server zu laden. Es handelt sich dabei um Office-Dokumente, Messergebnisdaten und CAD-Dateien. Die Dateien können also recht groß - gar bis über einem Gigabyte groß - sein.

Speicherproblem beim Versenden großer Datenmengen über HTTP

Die Übertragung der Dateien zum Server ist unter Verwendung der JDK-Klasse HttpURLConnection realisiert. Bei sehr großen Dateien wurde auffällig, dass die JVM sehr viel Speicher allokiert und irgendwann mit einen OutOfMemoryError die Ausführung des Applets das zeitliche segnet. Die Ursache war schnell gefunden: Die HttpURLConnection puffert sämtliche in einem HTTP-Post-Request zu übermittelnden Daten um die Anzahl der zu sendenden Bytes zu ermitteln. Diese Angabe muss die Implementierung von HttpURLConnection im Request-Header-Feld “content-length” übermitteln. Der Header muss vor den Nutzdaten beim HTTP-POST-Request gesendet werden. Die zu sendende Datei wird zwar mittels InputStream gelesen und direkt in den OutputStream von HttpURLConnection geschrieben, aber HttpURLConnection puffert die gesamte Datei im Hauptspeicher bevor auch nur ein Byte an den Ziel-HTTP-Server gesendet wird. Dies führt natürlich unweigerlich zu Problemen. Leider bietet die API von HttpURLConnection keine Möglichkeit die Content-Length zu setzen, so dass die zu versendenden Daten nicht gepuffert werden.

Den Rest des Artikels lesen »

Maven in Eclipse verwenden

3. March 2008

Die Features von Maven2 sind sehr überzeugend:

  • Convention over Configuration
  • Management der Abhängigkeiten zu Bibliotheken (inklusive transitiver Abhängigkeiten)
  • Integration von Unit-Tests in Build
  • usw.

Eclipse als IDE ist natürlich auch sehr überzeugend. Für mich heisst das konkret: Maven nur in Verbindung mit Eclipse. Toolintegration ist für mich sehr wichtig, um maximale Produktivität zu erzielen. Ein Handwerker wird schließlich auch nicht Schrauben mit der Hand festziehen…

Den Rest des Artikels lesen »

Automatisierte Tests für Web-Applikationen - Teil 1 - JSFUnit

10. February 2008

Die vor kurzem vorgestellte Bibliothek JBoss JSFUnit soll es ermöglichen, serverseitig Unit-Tests gegen die mit Java Server Faces betriebene Web-Oberfläche auszuführen. Im Folgenden schildere ich meine Erfahrungen bei der Integration von JSFUnit in die
OpenWishes Web-Applikation.

Den Rest des Artikels lesen »

Lazy Loading Listen bei JSF Pagination

9. October 2007

Einige JSF (Java Server Faces) Komponenten-Frameworks unterstützen Pagination in Tabellen. Dadurch kann der Anwender in den durch die Tabelle dargestellten Datensätzen blättern. Auch das viel geschätzte Richfaces bietet Pagination und unterstützt dabei die Aktualisierung der Tabellenseite über Ajax.

Wird eine Tabelle mit Pagination verwendet, damit der Anwender durch einen hinreichend großen Datenbestand blättern kann, so ist es nachteilig den gesamten Datenbestand aus der Datenbank in den Hauptspeicher zu laden. Da noch nicht bekannt ist, welche Seiten der Tabelle vom Anwender tatsächlich angefordert werden, macht es Sinn nur die Daten für die aktuell angezeigte Tabellenseite zu laden. Die Daten für andere Seiten werden erst geladen, wenn der Anwender die entsprechende Tabellenseite zur Anzeige bringt. Einmal geladene Daten einer Tabellenseite sollten im Speicher gehalten werden, sofern ein bestimmtes Maximum nicht überschritten wird.

Realisiert werden diese Anforderungen mittels Lazy-Loading List. Die Layzy-Loading Liste unterstützt das java.util.List Interface. Erst wenn mittels “List.get(index)” ein Element der Liste gelesen wird, erfolgt das Laden einer Teilmenge von Einträgen in die Liste. Als Basis verwende ich Apache Common Collections für die Realisierung der Lazy-List.

Den Rest des Artikels lesen »

JEE WebApp Initialisierung - InitServlet vs. ServletContextListener

3. October 2007

Nahezu jede JEE Web-Applikation muss beim Start diverse Initialisierungen ausführen. Denkbar ist das Registrieren von MBeans in einem JMX-Server, das Starten einer Job-Scheduling-Engine oder auch anderes. Dabei fällt immer mal wieder der Begriff “InitServlet” - also ein Servlet, welches keine HTTP-Requests entgegen nimmt sondern nur der Initialisierung einer JEE WebApp dient.

Den Rest des Artikels lesen »