Apr 262008
 

Ü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.

Continue reading »

Mar 032008
 

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…

Continue reading »

Oct 092007
 

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.

Continue reading »

Oct 032007
 

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.

Continue reading »

Sep 252007
 

Regulär geht man davon aus, dass die servergespeicherten Daten einer User Session immer nur von einem Thread zur selben Zeit gelesen bzw. geschrieben werden. Es ist zu aufwendig, jede Stelle im Code welche mit der User Session arbeitet vor Race Conditions durch Mutext-Objekte / Monitore zu schützen. Daher muss dafür gesorgt werden, dann ein Request aus einer User Session immer nacheinander aber nicht parallel verarbeitet werden. Im Folgenden wird ein Code-Beispiel für J2EE Web Applikationen gegeben.

Continue reading »

Sep 242007
 
OpenWishes Logo

Endlich ist es soweit. Der Web-Dienst OpenWishes.de, welcher dabei hilft den Geschenkestress zu überstehen und keine Geburtstage mehr zu vergessen, ist online und damit in der Public Alpha. Diese Plattform entstand in den letzten Monaten in Zusammenarbeit mit Markus Kühle und Markus Junginger. Ich nutze dieses Ereignis um einen Überblick auf die verwendeten Technologien zu geben.

Die Infrastrukturkomponenten des Systems sind Apache Tomcat 6, Apache und MySQL. Es wurde bewusst auf EJB oder Spring verzichtet, jedoch ist die Persistenzschicht mittels JPA / Hibernate umgesetzt. Die Web Tier ist mittels Java Server Faces 1.2 und Facelets realisiert, wobei die JSF-Komponentenbibliothek RichFaces 3.1 und DWR für die Ajax-Funktionalität eingesetzt wird. Für verschiedene Querschnittsbelange wie Exception-Handling, Transaktionshandling, Logging und Ermitteln von Statistikdaten kommt AspectJ zum Einsatz. Asynchrone und zeitgesteuerte Jobs werden mittels Quartz verwaltet. Eine interne Management-Schnittstelle setzt auf JMX / MX4J auf. Das Versenden von Mails wird über Apache Commons Mail realisiert.

Die Plattform selbst ist in Java implementiert, wobei voll auf die Syntax von Java 5 (Generics & Co) gesetzt wird. Durch die Verwendung von AspectJ und Java5 enstand unserer Meinung nach ein sehr erweiterungsfähiges und gut wartbares System da sich der Code auf das Wesentliche beschränkt. Wir hatten und haben das Gefühl, dass wir sehr produktiv bei der Entwicklung und Erweiterung des Systems arbeiten können.

Es gibt noch eine Menge zu tun – neue Features befinden sich in Entwicklung und warten auf das nächste Release. An dieser Stelle die Bitte um Feedback und die Aufforderung OpenWishes.de zu nutzen. Ich werde auf jeden Fall ab heute keine Geburtstage mehr vergessen!

Sep 232007
 

Eine Java Serverapplikation muss oft in verschiedene Umgebungen (auch als Raum bezeichnet) installiert werden. Oft gibt es eine Testumgebeung, eine für die Integration und Fachtests, eine Schulungsumgebung und letztendlich eine Produktivumgebung. Für jede Umgebung müssen oft die Konfigurationsdateien und auch Deployment-Deskriptoren angepasst werden.

Gerade die Deployment-Deskriptoren wie “web.xml” (im WAR), “application.xml” (im EAR) unterscheiden sich marginal. Wäre es da nicht toll nur eine Deskriptor-Datei im Versionskontrollsystem zu halten und nur die marginale Änderungen mittels XSLT vorzunehmen. Natürlich wäre es das! ;-)

Continue reading »

Sep 182007
 

Eclipse LogoMit Eclipse 3.3 gibt es endlich die Möglichkeit beim Speichern einer Java-Datei automatisch Code Bereinigungen und Formatierung durchzuführen. Die Einstellung hierfür kann im Eclipse-Projekt definiert werden und nicht ausschließlich Workspace-weit. Das ist ein Vorteil, denn dann können diese Einstellungen ins Versionskontrollsystem aufgenommen und somit implizit im gesamten Entwicklungsteam verfügbar gemacht werden. Auf diese Weise garantiert man eine einheitliche Formatierung im Projekt.

Continue reading »