Tag Archive: JBoss

Einfache und Schnelle Webservices mit Mule ESB und Apache CXF

Ich möchte Euch in diesem Beitrag zeigen, wie wir bei codecentric in unseren Projekten den Mule ESB und Apache CXF einsetzen. Ich möchte zeigen wie einfach das Erstellen von Webservices ist und was man tun kann um das doch recht langsame Standardverhalten zu verbessern.

Sollte man überhaupt einen Webservice einsetzen? Nun eine gute Frage, und wahrscheinlich sogar am relevantesten für die Performance. Webservices eignen sich hervorragend um Interfaces und Services nach außen anzubieten, oder wenn man intern auf Grund von Firewallbeschränkungen oder anderen Programmiersprachen andere Protokolle wie RMI nicht verwenden kann. Da Ihr euch mit Webservices herumschlagt, gehe ich einfach mal davon aus daß dieser Punkt nicht zur Debatte steht.
(weiterlesen …)

Fabian Lange

 

JavaOne 2009: RIA development with JavaFX

“Hallo” von der JavaOne 2009! Zusammen mit drei meiner Kollegen sowie Hunderten von Entwicklern, Architekten und den größten Java Unternehmen bin ich gerade auf der Nummer eins Java Konferenz im schönen San Francisco (ich habe hier zum ersten Mal James Gosling live beim T-Shirt schleudern gesehen – leider habe ich keins gefangen).

Eins der Themen welches mich am meisten interessiert ist der aktuelle Stand von JavaFX (gerade wurde die Version 1.2 freigegeben). Seit Jahren entwickle ich nur JSPs, und ich schaue mich schon seit längerem nach einer neuen, innovativen und schicken Art den View Layer darzustellen um, ohne auf die gewohnten Features von Java zu verzichten zu wollen. JavaFX gibt es nun set knapp 2 Jahren (zum ersten Mal angekündigt im Mai 2007, das 1.0 Release kam im Dezember 2008) und ist mittlerweile ein stabiles und in Produktion einsetzbares Framework.

Ich habe mir Sessions über die Integration von Spring und JBoss Seam mit JavaFX (@see Flamingo) angesehen, welche es ermöglicht echte Enterprise Applikationen zu entwickeln. Auch wurde gezeigt, wie Adobe Photoshop/Illustrator Dateien direkt in ein JavaFX Archiv (eine .jfz Datei) exportiert werden können. Ein Entwickler kann über Namenskonventionen (jfx:layerid) direkt auf die enthaltenden Layer zugreifen und diese manipulieren. Auf diese Art und Weise wird es möglich, einem Designteam eine Spec zu geben, um ein Artefakt entwickeln, welches dann einfach in die Applikation integriert werden kann.

Was mir besonders gut gefallen hat ist die Möglichkeit Anwendungen auf verschiedene Plattformen wie das Web, den Desktop oder auch mobile Endgeräte zu deployen. Es wird auch möglich sein seine Anwendungen direkt in den brandneuen Java Store (der Java Store wurde während der Konferenz als geschlossene Beta gestartet, eine offene Beta Phase soll später im Sommer folgen) zu deployen.

Auch hat sich die Unterstützung für JavaFX in der Entwicklungsumgebung eclipse
verbessert. Netbeans ist immer noch die bevorzugte IDE, aber ich arbeite täglich mit eclipse und es gibt ein offizielles Plugin auf javafx.com sowie Firmen, welches Tools wie exadel‘s JavaFX Studio entwickeln. Dank dieser Tools konnte ich in wenigen Minuten mein erstes JavaFX “Anwendung” (nur ein schöner Text auf einem 3D Kreis) entwickeln und starten.

Als nächstes möchte ich echte Anwendungen schreiben, nicht nur ein “Hey, ein animiertes Ding – hab ich mit JavaFX gemacht” Demo. Wer sich selber die Finger schmutzig machen will kann die excellenten Tutorials auf javafx.com ausprobieren.

So, ich muss los, ich bin schon spät dran, die nächste Session geht gleich los.

Nick Prosch

 

JAX 2009 – Der erste Tag

Trotz der Krise konnte die JAX 2009 die Teilnehmeranzahl im Vergleich zu 2008 in etwa halten – das war eine wichtige Aussage bei der Begrüßung der Teilnehmer durch Sebastian Meyen. Aus meiner Sicht kann man das auch sehen – es sind wieder viele Firmen auf der begleitenden Messe vertreten und auch die Schlangen an den Catering Tischen sind nicht kürzer geworden.

codecentric ist dieses Jahr Silber Sponsor und wir konnten unseren Messestand, nicht ganz ohne Stolz, deutlich vergrößern.

Das codecentric Team der JAX.Insgesamt sind wir mit acht Leute auf der JAX – natürlich auch um die aktuellen Trends und Technologien aufzunehmen und selber Präsentationen zu halten. In diesem Jahr halten wir auch selber drei Vorträge. [1, 2, 3] zu unseren Kernthemen Agilität und Java Performance.

An unserem Stand kann man sich vor Allem zu unserem Meet the Experts informieren und an der Performance Studie 2009 teilnehmen – wie auch im letzten Jahr erfreut sich gerade die Studie großer Beliebtheit. Das Ergebnis der Performance Studie 2008 kann man sich bei uns am Stand in gedruckter Form kostenfrei abholen.

Gestern habe ich mir einige Sessions zum Thema “neue Sprachen” auf Basis der Java Plattform angehört – aus meiner Sicht einer der “Hypes” auf der JAX. Dazu habe ich aber schon gestern einen Beitrag für Jaxenter mit dem Titel “Turmbau zu Babel” geschrieben und möchte das hier nicht wiederholen.

Ein weiterer interessanter Vortrag zum Thema “Event Driven Architecture” von Clemens Utschig-Utschig hat mir sehr deutlich aufgezeigt, dass EDA in Zukunft eine entscheidende Rolle in Verbindung mit Serviceorientierten Architekturen spielen wird. Gerade bei Anwendungsfällen wo die Performance Anforderungen sehr hoch sind und Prozessvarianten nur schwer zu modellieren sind, haben EDAs einen entscheidenden Vorteil. Die Infrastruktur und Technologien für EDAs sind im Prinzip auch schon vorhanden und werden vor allem im Finanzbereich und auf Flughäfen bereits eingesetzt – meistens aber auf Basis eigener Implementierungen. Clemens  zog deshalb auch das Fazit, dass in Zukunft Best Practises und Standards für EDAs entwickelt werden müssen, um sie in bestehenden Anwendungen “salonfähig” zu machen.

Neben diesen Themen beherrschte natürlich die mögliche Übernahme Sun’s durch Oracle die Gespräche der Teilnehmer. Meine persönliche Meinung ist, dass es im Prinzip nur gut sein kann für Java. Sun war meiner Meinung nach immer ein Hardware Unternehmen, das mit Java nicht wirklich viel anfangen konnte -  Sun konnte beispielsweise auch keine namhafte kommerzielle Software in diesem Bereich etablieren und der Application Server Markt wird heute von IBM und Oracle aufgeteilt. (natürlich mit Open Source Alternativen wie JBoss, Tomcat oder Glassfish) Oracle wird sicherlich mehr aus der Java Plattform machen – die Integration von Firmen wie BEA und Tangasol in die Oracle Fusion Middleware zeigen dabei auch, dass eine Übernahme sehr positive Effekte auf die Produkte haben kann. Gerade der von mir sehr geschätzte Gründer von Tangasol, Cameron Purdy, äußert sich in seinem Blog immer sehr positiv über die Arbeit unter Oracle Fahne und gerade er ist sicherlich kein Weichspüler. Interessanter ist aus meiner Sicht eher die Frage was Oracle mit MySql machen wird – hier denke ich wird es negative Veränderungen geben.

Was mich persönlich “nervt” ist der Twitter Hype auf der JAX, der gerade von den Speakern als eine Art religiöse Form der Kommunikation geprisen wird. Stefan Roock twittert sogar live in seiner Session…ich glaube es dauert noch was, bis ich den Hype verstanden haben. :-)

Mirko Novakovic

 

Über ein Erlebnis der besonderen Art: JDK6, JDK5 und Spring 2.0.0

In einem unserer Projekte führen wir derzeit eine Migration von JDK5 Update 7 zu JDK6 Update 12 durch. In einer unserer Anwendungen verwenden wir JCaptcha zur Absicherung von Formularen. Den größtmöglichen Konfigurations-Komfort für das Captcha erreichen wir durch die Verwendung von Spring-Beans, die beim Initialisieren des Captcha-Servlets zur Anwendung kommen.

Bei der Umstellung auf Java 6 (Update 12) kam es auf einer lokalen Entwicklungsmaschine plötzlich zu einer IllegalArgumentException bei der Initialisierung des Captcha-Servlets. JBoss lokal weiterhin mit Java 5 laufen zu lassen behob zwar das Problem, war jedoch nicht zielführend, da die Zielsysteme schrittweise alle auf Java 6 umgestellt werden sollen.

Anbei ein Auszug aus dem Stacktrace der Exception:

java.lang.IllegalArgumentException: Color parameter outside of expected range: Red Green Blue
	at java.awt.Color.testColorValueRange(Color.java:298)
	at java.awt.Color.(Color.java:382)
	at java.awt.Color.(Color.java:357)
	at java.awt.Color.(Color.java:448)

Eine genauere Untersuchung des Phänomens im Debugger ergab letztlich folgendes Bild:

Es wurde also offensichtlich der Color-Konstruktor verwendet, der 3 float-Parameter akzeptiert. Ein Auszug aus der Spring-Bean-Konfiguration:

<bean id="captchaBackgroundColor" class="java.awt.Color">
	<constructor-arg index="0"><value>255</value></constructor-arg>
	<constructor-arg index="1"><value>255</value></constructor-arg>
	<constructor-arg index="2"><value>255</value></constructor-arg>
</bean>

Der float-Konstruktor enthält als erstes die Zeile:

this( (int) (r*255+0.5), (int) (g*255+0.5), (int) (b*255+0.5));

Damit wird der Konstruktor für 3 int-Parameter aufgerufen und bekommt dreimal 65025 als Argument übergeben. Das Resultat: die oben beschriebene IllegalArgumentException.

Die exakte Ursache für das Problem liegt in einer Kombination aus mehreren Umständen. Weniger technisch interessierte Leser können die folgende Aufzählung guten Gewissens überspringen:

  • Es wird Spring 2.0.0 verwendet. Der zu verwendende Konstruktor wird mittels ConstructorResolver.autowireConstructor(…) ermittelt. In Zeile 100, in ebendieser Methode, wird per Reflection ein Array der potenziellen Konstruktoren aufgebaut. Anschließend wird dieses Array sortiert. Das darunter wirkende Arrays.sort(…) liefert mit JDK6 auf Windows-Systemen ein anderes Ergebnis als mit JDK5.
  • In dem sortierten Array steht also der Konstruktor Color(float, float, float) weiter vorn als der Konstruktor Color(int, int, int). Mit JDK5 steht der int-Konstruktor weiter vorn.
  • Es folgt eine Schleife, die aus dem sortierten Konstruktor-Array den Konstruktor auswählt, der zur Instanzierung des gewünschten Objekts verwendet werden soll. Diese Schleife ermittelt anhand der Anzahl Argumente (trivial) und einer sogenannten TypeDifferenceWeight (etwas komplizierter) den zu verwendenden Konstruktor.
  • TypeDifferenceWeight bedeutet, dass eine Differenz in der Klassenhierarchie zwischen Typen und Argumenten errechnet wird. Wir wollen int-Argumente verwenden, um unser Color-Objekt zu instanzieren. Die Methode zur Berechnung der TypeDifferenceWeight geht für jeden Parameter-Typ die Klassenhierarchie des dazugehörigen Arguments so lange nach oben, bis keine höhere Superklasse auffindbar ist. Solange die gefundene Superklasse ein Typ ist, dem das dazugehörige Argument zugewiesen werden kann, wird der TypeDifferenceWeight-Wert erhöht und die Suche fortgesetzt. (AutowireUtils.getTypeDifferenceWeight(…))
  • Dies bedeutet logischerweise, dass die TDW von float und int 0 ist, da beide primitive Datentypen sind.
  • Ist die ermittelte TDW kleiner als die bisher kleinste gefundene TDW, wird der Konstruktor aus dem aktuellen Schleifendurchlauf als zu verwendender Konstruktor gesetzt.
  • Da im Array der float-Konstruktor mit JDK6 weiter vorn steht, und da bei den nachfolgenden Konstruktoren die kleinste gefundene TDW nicht mehr kleiner werden kann (0 kann nicht kleiner als 0 sein), wird im Endeffekt der float-Konstruktor verwendet.
  • Der float-Konstruktor übergibt die Argumente multipliziert mit 255 und um 0,5 erhöht als int-Werte an den int-Konstruktor.
  • Der int-Konstruktor wird also als Color(65025, 65025, 65025) aufgerufen. Folge: die IllegalArgumentException, weil RGB-Werte nur zwischen 0 und 255 liegen können.

Zurück zum greifbaren Phänomen: auf dem Testserver, der bereits auf Java 6 umgestellt ist, läuft das Captcha nach wie vor fehlerfrei. Offensichtlich ist also das Problem darin begründet, dass die Konstruktoren von einer JVM auf einem Linux-System anders sortiert werden als auf einem Windows-System. Zusätzlich sollte der Type Weight Difference Mechanismus in Spring hoffentlich in neueren Versionen intelligenter sein, falls Autowire noch darauf basiert.

Abhilfe schafft eine explizite Typangabe in der Bean-Konfiguration:

<bean id="captchaBackgroundColor" class="java.awt.Color">
	<constructor-arg index="0" type="int"><value>255</value></constructor-arg>
	<constructor-arg index="1" type="int"><value>255</value></constructor-arg>
	<constructor-arg index="2" type="int"><value>255</value></constructor-arg>
</bean>

Damit ist sichergestellt, dass der gewünschte Konstruktor, nämlich java.awt.Color#Color(int r, int g, int b), verwendet wird.

Meine weitestmöglich in die Tiefe gehende Sourcecode-Analyse von Spring 2.0.0 und JDK6 Update 12 ergab keine exakte Erkenntnis, warum Arrays.sort(…) mit dem vom Spring Framework übergebenen Comparator auf Windows-Systemen ein anderes Ergebnis als auf Linux-Systemen liefert. Wer dazu etwas sagen kann, ist herzlich eingeladen dies zu tun.

Fazit: der Teufel steckt im Detail. Auch eine vermeintlich “kleine” Änderung wie ein Update der Java-Version kann dazu führen, dass schwer zu findende Fehler entstehen. Intensives und präzises Testen ist bei einer solchen Änderung unerlässlich!

Vielen lieben Dank an Mike Wiesner, Senior Consultant bei SpringSource, der mir bei einer Frage zu Spring 2.0.0 “in Echtzeit” weitergeholfen hat!

Robert Spielmann

 

Aktuelle Meldung: das codecentric Team gewinnt das JBoss Kickerturnier auf der Devoxx

Sechs glückliche Mitarbeiter der codecentric GmbH besuchen zur Zeit die Devoxx (ehemals JavaPolis) in Antwerpen, Belgien. Bei Vorträgen wie Spring 3 (RESTful Spring MVC, Expression language), Java7 (dynamische Sprachen, concurrency/parallelism, mehr neue I/O Methoden (NIO), kleinere Sprachänderungen (wie der multiple-catch Block)), Modularisierung (OSGi, Project Jigsaw (wahrscheinlich Bestandteil von Java7), Spring Source dm Server) ist sicher, dass für jeden etwas dabei ist und viel Wissen transferiert wird.

Das Highlight des ersten Konferenztages war jedoch der Sieg des codecentric Teams beim JBoss Kicker Tunier. Als Gewinn gab es T-Shirts und ein Foto mit den JBoss Mitarbeiterinnen. Die Gesichter sagen alles:

Nick Prosch

 

codecentric @ W-Jax 2008, Tag 2, 05.11.2008

Heute ist der zweite Konferenztag auf der W-Jax 2008, der führenden Konferenz für umfassendes Know-how im Java-Umfeld. Die Konferenz, die sich an Softwareentwickler, Projektleiter und Architekten richtet, beschäftigt sich mit den wichtigsten Aspekten erfolgreicher Enterprise-Projekte.

Unsere Berater und Entwickler nutzen diese Veranstaltung, um sich auf den neuesten Stand zu aktuellen Technologie-Trends, Strategien und den Einsatz der jeweiligen Technologien zu bringen.

Hier eine Auswahl der Speaker Slots und Sessions des zweiten Konferenztages

Portal 2.0: Bringing Social, Web 2.0 and SOA together for the Enterprise (Brian Chan)

Die Keynote von Brian Chan über Liferay bot bis auf einige Websites von Kunden, welche Liferay nutzen, wenig Neues im Vergleich zu seiner Präsentation auf der JAX 2008 in Wiesbaden, welche damals wesentlich “codelastiger” war. Es wurden die typischen Infrastrukturen in einer Firma, mit ihren individuelle Vorteilen aufgezeigt, wie z.B. Blogs oder Wiki um später im Vortrag dann in Liferay gebündelt zu werden.

Brian Chan ist ein sympathischer, lockerer Kerl mit einer Passion für soziale Netzwerke und leitet die Architekturabteilung bei Liferay.

Die Keynote ließ wenige Fragen offen, da Liferay in jedem Fall ein sehenswertes Produkt ist und in der Keynote viel vom System anhand von Beispielen präsentiert wurde.

Insgesamt eine gute Keynote, aber mit wenigen neuen Informationen.

Fazit: Liferay ist einen Blick wert!

Marc van den Boogard, IT Consultant @ codecentric

Batch-Verarbeitung mit Spring Batch (Agim Emruli)

Batch-Verarbeitung ist kein besonders populäres Thema (O-Ton, Agim Emruli von SpringSource). Dabei ist die Verarbeitung von sequentiellen, nicht interaktiven Aufgaben in sehr vielen Anwendungen von Bedeutung.

Typische Aufgaben eines Batches sind Konvertierung von Massendaten, sowie Validierung, Extrahierung, Aktualisierung und Export.

Anforderungen an solche Systeme:

  • Hoher Durchsatz
  • (Kontrollierter) Restart
  • Sequentielle Abarbeitung
  • partielle, parallele Verarbeitung

Spring Batch bietet hierfür ein sehr leichgewichtiges Framework, welches diesen Anforderungen gerecht wird.

Prinzipiell geschieht eine Batch-Verarbeitung wie folgt. In einem Batch-Job werden ein oder mehrere Batch-Steps durchgeführt, die immer wieder die gleichen Aufgaben bearbeiten:

  1. Mit einem ItemReader wird ein Datensatz ausgelesen.
  2. Mit einem ItemWriter wird dieser Datensatz verarbeitet und wieder persistiert

Ein solcher Batch-Job kann nun über verschiedene Wege gestartet werden. Kommandozeile, Quartz und JMX sind hier nur kleine Beispiele.

Fazit: Spring-Batch ist ein gutes Framework, welches eine sequentielle, oft durchgeführte Verarbeitung leicht implementierbar macht. Und: Es ist das einzige OpenSource Framework für diese Art von Aufgaben.

Thomas Bosch, IT Consultant @ codecentric

Geschäftsprozesse und Regeln mit jBPM & Drools – ein unschlagbares Team (Bernd Rücker)

Von JBoss gibt es zwei Bibliotheken, die BPM (Business Process Management) und BRM (Business Rules Management) anbieten – jBPM und Drools.

Über JBoss jBPM lässt sich mit Hilfe eines gerichten Graphen ein Prozess deklarieren. Dieser Prozess wird über BPM Knoten für Knoten durchlaufen. So lässt sich auf sehr ausführliche Weise ein Workflow für seine Geschäftslogik definieren.

JBoss Drools ist eine Regelmaschine, die es ermöglicht, ebenfalls deklarativ Regel für die Geschäftslogik zu erstellen. Zu einem definierten Zeitpunkt wird auf einen Arbeitsspeicher, der zuvor mit Daten befüllt wurde, eine Menge von Regeln angewandt, die dann zu einem Ergebnis führen welches ausgewertet werden kann.

Mit Hilfe von Drools lassen sich Regeln sehr einfach darstellen, so dass auch Fachbereiche die Logik einer solchen definierten Regel nachvollziehen können. Über spezielle Tools lassen sich sogar Excel-Dateien in Drools importieren.

Ein großer Vorteil solcher Regelmaschinen ist, dass sie vom restlichen Code der Geschäftslogik entkoppelt sind und sich sogar zur Laufzeit anpassen bzw. austauschen lassen.

Fazit: Drools bietet eine sehr gute Lösung Geschäftregeln einfach abzubilden. Die große Stärke der Kombination mit jBPM sehe ich jedoch nicht.

Thomas Bosch, IT Consultant @ codecentric

Tim van Baars