Nr. 03 | Herbst 2012 | www. ijug.eu

aktuell JavaDas Magazin der Java-Community

Java in Höchstform aktuell Java EE 6: GlassFish, JBoss und Geronimo, Seite 11

Java Android: Wissenschaftliche Applikationen der nächsten Generation entwickeln, Seite 38

ISSN 2191-6977 Jnect: Bewegungen in Java erkennen, Seite 59 Benelux: EUR 5,80 CH: 9,80 CHF 9,80 CH: EUR A: 5,60

EUR 4,90 D:

iii iii iiiiii iJUG

4 191978 304903 03 Verbund

iii iii iiiiii www.ijug.eu

Java ist in Höchstform! Die Artikel in dieser Ausgabe spiegeln zahlreiche Segmente der umfangreichen Java-Landschaft wider. Der Reigen beginnt mit einem Vergleich der drei bekanntesten Applikationsserver GlassFish, JBoss und Geronimo. Über den Tellerrand hinaus blicken wir beim WebLogic Server im Zusammenspiel mit Oracle Real Application Clusters. Das Eclipse Modeling Framework hingegen hilft dem Entwickler beim Modellie- ren. VisualVM wiederum bietet ein reiches Toolset für die Performance-Analyse von Java-Anwendungen. Sehr interessant für Java-Entwickler ist auch Apache Camel, ein mächtiges Open-Source-Integrations- Framework. Nicht zu vergessen das Thema „Android“, mit dem sich gleich zwei Artikel beschäftigen. Jonas Feldt und Johannes M. Dieterich von der Georg-August-Universität Göttingen demonstrieren die Entwick- lung einer modernen App, während Andreas Flügge die Reihe mit den Android-Grundlagen abschließt. Auch das Testen kommt in dieser Ausgabe nicht zu kurz: Oliver Böhm fasst zehn Jahre Pattern-Testing zu- sammen. findet diesmal in einem Artikel über die Plattform „Spring Cloud“ statt. Der Win- Wolfgang Taschner dows Azure Service Bus hingegen zeigt, dass auch Microsoft etwas für Java-Entwickler zu bieten hat, und Chefredakteur Java aktuell mit dem Jnect-Framework lassen sich Bewegungen und Sprache erkennen und weiterverarbeiten. Das Interview auf Seite 9 stellt die Java-Vision des Software-Riesen SAP vor. Mit Oracle, IBM und Red Hat haben sich damit in den letzten Ausgaben große Keyplayer unter den Java-Aktivisten bei uns geäußert. In einem weiteren Interview kommt unser iJUG-Mitglied, die Swiss Oracle User Group (SOUG), zu Wort. Neu ab dieser Ausgabe ist auch ein Redaktionsbeirat, der die Redaktion dabei unterstützt, die Qualität der Artikel zu sichern, neue Autoren zu gewinnen und interessante Themen zu finden. Herzlich willkom- men Ronny Kröhne, Daniel van Ross und Dr. Jens Trapp. Ein Porträt der drei finden Sie auf Seite 42. Bleibt nur noch, Sie auf drei Veranstaltungen hinzuweisen, die demnächst stattfinden: das Java Forum Stuttgart, die Source Talk Tage in Göttingen und die DOAG 2012 Development in Bonn.

Ihr

WDC_Anz_210x148_iJug.qxd:Layout 1 16.04.2012 11:32 Uhr Seite 1

en ow ds ng -H präsentieren: en su ow Tr Lö Kn

Web Developer 17.-18. September 2012 WDC Conference 2012 Sofitel Hamburg Alter Wall

Für Java aktuell-Leser CSS3 G HTML5 G JavaScript G Web-Architekturen G Agiles Projektmanagement G nur € * Frameworks und Tools G Responsive Webdesign G Betrieb von großen Webprojekten 649,– s tatt € 799,–* Advisory Board: Ihr An meldecode: W DC12ijug

* alle Preise zzgl. MwSt.

Max Bold, Pierre Joye, Nils Langner, Marcus Ross, Markus Stäuble, Chefredakteur, Software Engineer Qualitätsmanager, IT-/BI-Berater, Chefredakteur, web-developer und OSS & PHP Gruner + Jahr Zahlenhelfer mobile-developer Specialist Consulting Medienpartner: www.web-developer-conference.de WDConference Inhalt

3 Editorial 24 Plug-ins für die VisualVM 50 Cloud Foundry: die Spring Cloud Wolfgang Taschner entwickeln: die MemoryPoolView Eperon Julien Kirk Pepperdine 4 Java Forum Stuttgart 53 Source Talk Tage 2012 29 Apache Camel Security – Payload Security 5 Das Java-Tagebuch 54 Windows Azure Service Bus: Dominik Schadow Andreas Badelt Kommunikationsdienst auch für Java Holger Sirtl 36 Projektmanagement-Zertifizierung 9 „Die Java-Community Level D nach GPM – ist riesig …“ 59 Jnect: Kinect goes Java ein Erfahrungsbericht Interview mit Harald Müller, SAP Jonas Helming und Maximilian Kögel Gunther Petzsch

10 Java 7 – Mehr als eine Insel 62 Unbekannte Kostbarkeiten des SDK 38 Android in Lehre und Forschung: Buchrezension von Jürgen Thierack Heute: Double Brace Initialization Entwicklung wissenschaftlicher und Instance Initializer Applikationen der nächsten Bernd Müller 11 Java-EE-Dreikampf: Generation GlassFish, JBoss und Geronimo Jonas Feldt, Johannes M. Dieterich Frank Pientka, MATERNA GmbH 64 Android: von Maps und Libraries Andreas Flügge 43 10 Years PatternTesting – 14 WebLogic Server im Zusammenspiel ein Rückblick mit Oracle Real Application Cluster Oliver Böhm 65 Unsere Inserenten Michael Bräuer und Sylvie Lübeck 48 „Von den Erfahrungen der anderen 66 Impressum 20 Das Eclipse Modeling Framework: zu profitieren, ist essentiell …“ EMFStore, ein Modell-Repository Interview mit Tony Fräfel, Präsident Jonas Helming und Maximilian Kögel der Swiss Oracle User Group (SOUG)

Java Forum Stuttgart

Die Java User Group Stuttgart e.V. veranstaltet am 5. Juli 2012 im Kultur- & Kongresszentrum Liederhalle (KKL) in Stuttgart wieder das Java Forum Stuttgart. Wie im Vorjahr werden rund 1.200 Teilnehmer erwartet. Geplant sind 42 Vorträge in sechs parallelen Tracks. Zudem werden bis zu 35 Aussteller vor Ort sein, darunter auch der Interessenverbund der Java User Groups e.V. (iJUG). An der Community-Wand stehen sowohl offene White-Boards als auch BoF-Boards (Bird-of-a-Feather). Abends gibt es die Gelegen- heit, sich bei verschiedenen BoF-Sessions mit Gleichgesinnten zu treffen, um über ein bestimmtes Thema zu diskutieren und sich auszutauschen. Darüber hinaus wird es wieder eine Jobbörse/Karriereecke für die Besucher geben.

Workshop „Java für Entscheider“ Die eintägige Überblicksveranstaltung am Vortag (4. Juli 2012) zeigt Begrifflichkeiten und wichtige Technologien aus der seit Jah- ren in der Industrie etablierten Plattform Java. Ausgehend von strategischen Gesichtspunkten wie Bedeutung und Verbreitung reicht der Blick über das Client-seitige Java (Java SE) und die wesentlichen Entwicklungswerkzeuge bis zum Server-seitigen Java (Java EE). Dort stehen dann die Bedeutung von Java als Integrationsplattform und die verschiedenen Technologien im Mittel- punkt. Weiterhin wird noch der Einsatz von Java in den immer wichtiger werdenden mobilen Lösungen (Android, iOS) gestreift. Abschließend kommen noch das Ausrollen von Java-Lösungen und das sehr interessante Eclipse als Rich-Client zur Sprache, um dann den Bogen von der Software-Entwicklung hin zum Betrieb zu schlagen.

Experten-Forum Stuttgart Am 6. Juli 2012 findet wieder im Anschluss an das Java Forum Stuttgart ein Experten-Forum Stuttgart statt. Auf dem Programm stehen zwölf halbtägige Workshops in sechs parallelen Tracks. Die Workshops in kleinen Gruppen mit maximal 25 Teilnehmern ermöglichen einen intensiven Austausch zwischen Trainer und Zuhörern. Anmeldung und weitere Informationen zum Java Forum Stuttgart unter www.java-forum-stuttgart.de

4 |

iii iii iiiiii www.ijug.eu

Das Java-Tagebuch

Andreas Badelt, Leiter der DOAG-SIG Java

Das Java-Tagebuch wurde in Ausgabe 2/2010 gestartet, um einen Überblick über die wichtigsten Geschehnisse rund um Java zu geben – in komprimierter Form und chronologisch geordnet. Der vorliegende Teil widmet sich den Ereignissen im ersten Quartal 2012.

erheblichen Verdrängungsprozess. Das innerhalb von zwölf Monaten) auch direkt 13. Januar 2012 soll möglichst fair und wohl in mehreren aus dem EC ausgeschlossen werden. Zu- Phasen geschehen, sodass die Mitglieder, mindest haben sie sich schon mal für ein Java.net: JUG-Seiten werden aktualisiert deren Wahlperiode in diesem Jahr abläuft, Ausscheiden „beworben“ – im Herbst geht Michael Hüttermann, Organisator der JUG nicht benachteiligt werden. Trotzdem es ja erstmals darum, die ECs zu verklei- Cologne, hat eine Reihe von „open issues“ dürfte eine erhebliche Unruhe auftreten. nern. https://blogs.oracle.com/jcp/entry/ auf den JUG-Seiten von java.net behoben Mit der neu gewonnenen Transparenz im jcp_ec_updates (http://www.java.net/node/882694). Seit JPC lässt sich für „einfache“ Mitglieder des den durch Oracle initiierten Infrastruktur- JCP aber wohl besser entscheiden, wem Änderungen gab und gibt es eine ganze sie ihre Stimme geben sollen. Das Verhält- 30. Januar 2012 Reihe von fehlerhaften Links etc. Alle be- nis von ratifizierten (Vorschlagsrecht aus- kannten Probleme wurden in einer Liste schließlich bei Oracle) zu offen gewählten Ein Lebenszeichen vom JSR-308 zusammengefasst, und inzwischen ist ein Sitzen soll im Übrigen bei zwei zu eins blei- Nach mehreren Jahren ist der JSR-308 großer Teil durch JUG-Aktive abgearbei- ben: https://blogs.oracle.com/jcp/entry/ (Annotations on Java Types) erneut zum tet. Eine gute Gelegenheit, mal (wieder) another_jcp_next_jsr_submitted „Early Draft Review“ vorgelegt worden. einen Blick auf die Seiten zu werfen und Das erste Mal war dies bereits 2007 der Tipps sowie Präsentationen von JUGs Java User Group Leaders live vom Meeting der Fall, die Review-Phase wurde jedoch nie auf der ganzen Welt anzuschauen oder International Oracle Users Group Community abgeschlossen. Hinter den Kulissen wur- gleich bei der Aktualisierung mit anzupa- Das Interview mit den JUG-Leadern aus de anscheinend trotzdem weitergear- cken: http://java.net/projects/jugs/pages/ fünf Kontinenten auf https://blogs.oracle. beitet. Nachdem die geplante Aufnahme Home#Open_issues com/javaspotlight/entry/java_spotlight_ ins OpenJDK 7 nicht stattfand, soll es mit episode_66_java dem OpenJDK 8 auf jeden Fall klappen. Die „Type Annotations“ ergänzen sich je- 25. Januar 2012 denfalls gut mit anderen neuen Sprach- 26. Januar 2012 Features wie „Lambda Expressions“ und Die Überarbeitung des JCP wird fortgesetzt nach so vielen Jahren sollte die Technolo- Die Überarbeitung des Java Community JCP.next in Aktion: gie doch ausgereift sein …: http://types. Process (JCP) geht in die zweite Runde. AT&T, Samsung und SK Telecom verlieren ihre cs.washington.edu/jsr308 Nach JSR-348 mit dem Fokus auf Trans- Stimmrechte im Executive Committee parenz und Beteiligung wurde heute der Im JSR-348 wurde definiert, dass Mitglie- JSR-355 eingereicht, mit dem Ziel der der eines Executive Committees (EC) ihre 2. Februar 2012 Zusammenlegung der beiden Executive Stimmrechte verlieren, wenn sie an zwei Committees (ME und SE/EE). Auch dieser oder mehreren aufeinanderfolgenden EJB 3.2 geht auch ins erste Review JSR soll innerhalb von sechs Monaten ab- Treffen des EC nicht teilnehmen. Das hatte Ebenfalls in die Early-Draft-Review-Phase geschlossen sein, sodass die Änderungen sich scheinbar noch nicht überall herum- – allerdings zum ersten Mal – geht der bereits bei den Wahlen im Herbst 2012 in gesprochen: Genau zwei Treffen nach In- JSR-345 (EJB 3.2). Da dieses Release einer Kraft treten können. Es könnte allerdings krafttreten der neuen Regeln hat es schon der Hauptbausteine für Java EE 7 sein soll, sein, dass die nötigen Anpassungen zeit- drei Mitglieder erwischt. Um ihre Stimm- ist die Cloud-Unterstützung als wichtiges lich gestreckt wirksam werden. Durch die rechte wiederzuerlangen, müssen sie wie- Thema genannt worden. Daneben soll die vermutliche Halbierung der Sitze (zumin- der an zwei aufeinanderfolgenden Treffen Herauslösung einzelner Services erwogen dest annähernd – Oracle und IBM sitzen teilnehmen. Andererseits könnten sie bei werden, um diese auch anderen Java-EE- in beiden ECs und würden auch nur einen weiterem Nichterscheinen (fünf Mal hin- Technologien zugänglich zu machen, so- Sitz behalten) kommt es natürlich zu einem tereinander oder zwei Drittel aller Treffen wie die bessere Integration mit anderen

Java aktuell 3-2012 | 5 Java-Tagebuch

JSRs (CDI, Bean Validation etc.) und die der Wahlperiode von drei auf zwei Jahre zent) werden ebenfalls noch namentlich Erweiterung der Anwendung von Annota- nachgedacht. Ebenso wird diskutiert, die gelistet. Insgesamt gibt es eine deutliche tions. In den Draft-Dokumenten ist bislang Wahlperiode flexibel zwischen ein bis drei Dominanz der Eclipse(-basierten) IDEs: aber noch nicht allzu viel davon zu se- Jahren zu halten, in Abhängigkeit von der http://sdtimes.com/link/36362 hen: http://java.net/projects/ejb-spec und Anzahl der Stimmen; das hieße, ein neu http://jcp.org/en/jsr/detail?id=345 gewähltes EC-Mitglied, dem viel Skepsis in Form eines schlechten Wahlergebnisses 20. Februar 2012 entgegen schlug, müsste sich umso eher 6. Februar 2012 wieder einer Wahl stellen. Der dritte und JSRs zu „Money and Currency“ und „Executive nach aktueller Planung letzte JSR in dieser Committee Merge“ dürfen starten, „Constraint java.net-Umfrage: Beruflicher Optimismus Reihe soll alle komplexen und kontroversen Programming API” ist final unter Java/JVM-Entwicklern Änderungen angehen. Neben weiteren Mo- Die JSRs 354 (Money and Currency API) und Eine gerade beendete Umfrage auf java. difikationen am JCP-Prozess soll dann auch 355 (JCP Executive Committee Merge) sind net zur Entwicklung von Stellenangeboten das „Java Specification Agreement“ (JSPA) jeweils ohne Gegenstimmen von den Exe- im Jahr 2012 hat einen deutlichen Opti- überarbeitet werden, das alle JCP-Mitglie- cutive Committees des JSP angenommen mismus unter den Teilnehmern gezeigt: der mit Oracle schließen müssen und das in worden. Die Expert Groups dürfen nun 19 Prozent waren der Meinung, dass die der Vergangenheit öfter zu hitzigen Diskus- die Arbeit aufnehmen. Ebenso einstimmig Zahl der Angebote schnell steigen wird, sionen geführt hat – beispielsweise bei der angenommen ist – nach gut zweieinhalb 25 Prozent glauben an einen moderaten Frage, ob Apache für ein „Test Compatibility Jahren Arbeit – der finale Entwurf des Anstieg und 23 Prozent an ein stabiles An- Kit“ für Harmony zahlen muss: „Constraint Programming API“ (Referenz- gebot. Nur 9 Prozent rechnen mit einem • https://blogs.oracle.com/javaspotlight/ Implementierung durch Open Rules). Die schrumpfenden Markt, der Rest entfiel auf entry/java_spotlight_episode_68_pa- „Final Specification“ dürfte damit in Kürze „I don‘t know“ beziehungsweise „Other“. trick erscheinen. Man kann natürlich darüber streiten, ob • http://jcp.org/aboutJava/communitypro- eine Umfrage, in der eine Skala mit zwei cess/ec-public/materials/2012-03-06/JCP. positiven, einer neutralen und nur einer next.3-March-2012.html 23. Februar 2012 negativen Antwort benutzt wird, eventuell ein bisschen suggestiv ist. Auch lässt die iJUG: Markus Eisele neues Mitglied Tatsache, dass immerhin 7 Prozent bezie- 15. Februar 2012 in der Expert Group für Java EE 7 hungsweise 25 Teilnehmer mit „Other“ ge- Ursprünglich motiviert durch die „adopt a stimmt haben, Fragen bezüglich der Qua- Umfrage: Welche EE-Version und JSR“-Initiative, der sich auch der iJUG ver- lifikation einiger Teilnehmer offen. Aber welche IDEs werden genutzt? schrieben hat, ist Markus Eisele von der man kann trotzdem festhalten, dass Java/ In einer Kolumne der „Software Develop- DOAG gleich Mitglied in der Expert Group JVM-Entwickler scheinbar optimistisch ment Times“ werden Ergebnisse einer „Java für Java EE 7 geworden. Gratulation! Wir ins Jahr 2012 gehen: http://blogs.java. & SOA Study“ des Magazins veröffentlicht. hoffen natürlich auf spannende Einblicke net/blog/editor/archive/2012/02/06/poll- 18 Prozent der Entwickler dürfen demnach in die Arbeit der Expert Group und einen result-most-javajvm-developers-expect- weiterhin „J2EE“ sagen, ohne korrigiert zu noch besseren Draht für den iJUG ins Zent- profitable-2012-others-agree werden. So hieß die Enterprise Edition bis rum des Java-Ökosystems: http://java.net/ einschließlich Version 1.4. Große Projekte projects/javaee-spec/lists/jsr342-experts/ bewegen sich nun einmal langsam vor- archive/2012-02/message/54 8. Februar 2012 wärts, da spielt es mitunter auch keine Rol- le, ob eine Java-Version noch unterstützt Java-Spotlight-Interview mit Patrick Curran wird – auch wenn der Betrieb sicher ner- 2. März 2012 Patrick Curran, der Mann hinter dem Java vös wird. Aber immerhin 45 Prozent setzen Community Process, hat in einem aktuel- Java EE 5 ein, 54 Prozent sogar Java EE 6. Java-Tutorials stehen jetzt auch len Java-Spotlight-Podcast einen Einblick Interessant ist auch die Verteilung bei den als eBooks zur Verfügung in die aktuellen Pläne zum Umbau des IDEs: Eclipse liegt mit 65 Prozent deutlich Eine hervorragende Idee, insbesondere JCP gegeben. Einige Details zum neuen vorn, gefolgt von den Oracle-Produkten für Entwickler, die viel unterwegs sind: Die JSR-355 wurden ja bereits im Januar ge- NetBeans mit immerhin 26 Prozent und Tutorials für Java SE 7 stehen jetzt auch nannt. Die anvisierte Größe des gemein- JDeveloper mit 17 Prozent. Dahinter lie- als eBooks zur Verfügung (im epub- und samen Executive Committees liegt aber gen IBMs auf Eclipse basierende IDEs Web- mobi-Format). Sie können genau wie die offensichtlich bei 25, sodass nach dem Sphere Studio Application Developer (13 HTML-Versionen vom Oracle Technolo- Streichen des zweiten Sitzes für IBM und Prozent) sowie der Nachfolger Rational gy Network heruntergeladen werden. Oracle nur noch Reduzierung um fünf Sit- Application Developer (12 Prozent). Apple Hoffentlich wird diese Idee bald auch auf ze nötig ist. Um dies etwas verträglicher XCode (11 Prozent), JetBrains IntelliJ (10 andere Dokumente und Spezifikationen zu gestalten, wird über eine Verkürzung Prozent) und Genuitec MyEclipse (9 Pro- ausgeweitet: http://www.oracle.com/tech-

6 |

iii iii iiiiii www.ijug.eu

network/java/javase/downloads/java-se- net/projects/jugs/downloads/directory/ derem: Es sei generell noch zu früh für eine 7-tutorial-2012-02-28-1536013.html Adopt%20a%20JSR Standardisierung in diesem Bereich; der Umfang des JSR sei zu groß und man solle sich lieber erst mal auf Teilaspekte konzen- 5. März 2012 8. März 2012 trieren, bei denen eine Standardisierung bereits sinnvoll ist; der JSR müsse von bei- „End of Life“ für Java SE 6, JavaFX 1.2, WebSocket-JSR angenommen – unter Vorbehalt! den Executive Committees, also auch dem and JavaFX 1.3 Der JSR 356 (Java API for WebSocket) ist für Java ME, koordiniert beziehungsweise Oracle hat das Ende des kostenlosen Sup- vom Executive Committee für SE/EE ange- erst nach dem Merge der beide ECs gestar- ports für Java SE 6 angekündigt. Mit be- nommen worden, die Expert Group darf tet werden. Markus Eisele argumentiert in troffen sind auch die JavaFX-Versionen also starten. Allerdings gab es im Vorfeld seinem Blog heftig gegen diese Entschei- 1.2 und 1.3 und somit das in der Version heftige Diskussionen darüber, dass die dung und führt ins Feld, dass Standardi- 2.0 durch ein reines Java-API abgelöste Lizenzen für das Test Compatibility Kit sierung Innovation verstärken kann und JavaFX-Script. Letzteres hatte zwar im Pro- (TCK) Gebühren in Höhe von 35.000 Dollar der JCP kein reines Abnickgremium für jekt „Visage“ von Stephen Chin ein neues jährlich vorsehen – wenn auch nur für die Quasi-Standards sein soll: http://blog.ei- Zuhause gefunden, das Projekt weist aber kommerzielle Nutzung. Die Befürchtung sele.net/2012/03/why-i-think-ec-is-wrong- keine größeren sichtbaren Aktivitäten ist, dass dies insbesondere Open-Source- about-jsr-357.html. Das scheint sich nicht mehr auf. Damit dürfte dann auch JavaFX- Implementierungen benachteiligt, da mit den Meinungen vieler anderer JCP- Script bald ein Fall fürs Museum sein. Der diese nicht unbedingt unter die „not-for- Aktiver wie Ed Burns (Specification Lead Zeitpunkt folgt dem normalen Release- profit“-Klausel fallen. In den Kommentaren für JSF) zu decken, die sagen: „Innovation Plan und war sogar noch einmal von Juli zur Abstimmung ist aber zu lesen, dass is done elsewhere“. Wir dürfen gespannt auf November 2011 verschoben worden. der Specification Lead (Danny Coward sein, ob sich hier eine breite Grundsatz- Trotzdem sind nicht alle Entwickler und IT- für Oracle) Kompromiss-Bereitschaft si- Diskussion entwickelt: http://jcp.org/en/ Verantwortlichen glücklich darüber, da der gnalisiert hat, und außer Google haben jsr/results?id=5317 Java SE 7 auch nach bald einem Jahr noch daher alle anderen Mitglieder für den JSR nicht so verbreitet genutzt wird. Für große gestimmt oder sich zumindest enthalten; Projekt Ceylon: Zweiter Meilenstein freigegeben Projekte ist auch ein Zeitfenster von etwas viele jedoch unter dem Vorbehalt, dass sie Der zweite Meilenstein für Ceylon ist frei- mehr als einem Jahr nicht üppig bemes- einer Finalisierung des JSR nur zustimmen gegeben worden. Schwerpunkt war die In- sen. Daher hat der iJUG in seinem Newslet- werden, wenn dieser strittige Punkt gelöst teroperabilität mit Java. Fast alle Sprachele- ter eine Umfrage zu diesem Thema gestar- ist. Bislang gibt es noch keine Unterstützer mente von Java sind jetzt im Umfang von tet: https://blogs.oracle.com/java/entry/ im Rahmen der „Adopt a JSR“-Initiative. Ceylon enthalten und darüber hinaus eini- eoling_java_se_6_javafx Freiwillige vor …: http://java.net/projects/ ges, das Java nicht „kennt“ (etwa Methoden jugs/pages/AdoptAJSR höherer Ordnung oder statisch typisierte NULL-Werte). Das Thema „File-I/O“ wurde 7. März 2012 offensichtlich auf den dritten Meilenstein 12. März 2012 verschoben. Insgesamt sollen es fünf sein Adopt a JSR: Neue Präsentation bis zum Release 1.0: http://www.ceylon- Auf java.net ist neuer Content zur „Adopt Java EE 6 Galleria lang.org/blog/2012/03/20/ceylon-m2- a JSR“-Initiative zu finden. Wie bereits in Markus Eisele berichtet in seinem Blog von minitel/?utm_source=download&utm_ der letzten Ausgabe berichtet: Die Initia- einem sehr interessanten Projekt: die Java medium=web&utm_content=blog&utm_ tive hat zum Ziel, den Java Community EE 6 Galleria von Vineet Reynolds. Ziel ist es, campaign=1_0_M2release Process und seine Specification Requests, ein umfassendes und praxistaugliches Bei- also die Entwicklung der neuen Stan- spiel für den Einsatz von Java EE 6 mit JSF dards, enger mit der Community zu ver- 2.0 und JPA 2.0 zu geben – inklusive Unit- 27. März 2012 zahnen. Sie wurde von der London Java und Integration-Tests (mit JUnit 4 und Ar- Community ins Leben gerufen und rich- quillian). Ein Blick lohnt sich: https://bitbu- Rave wird Apache Top-Level-Projekt tet sich auch an JUGs und ihre Mitglieder. cket.org/VineetReynolds/java-ee-6-galleria À propos „Social Media“: Apache Rave ist Dazu gibt es ein Wiki, in dem inzwischen aus dem Inkubator entlassen und jetzt ein recht detailliert steht, wie Interessenten Top-Level-Projekt der Software Founda- sich bei „Adopt a JSR“ einbringen können 20. März 2012 tion. Rave ist in eigenen Worten eine und welche JUGs sich bereits wo engagie- „Open Source Mashup Platform“, die das ren: http://java.net/projects/jugs/pages/ „Social Media API“ abgelehnt Erstellen von und Integrieren mit „Social AdoptAJSR. Neu dazugekommen ist jetzt Der JSR 357 (Social Media API) ist vom Network“-Technologien erleichtern soll. eine PowerPoint-Präsentation, die sich Executive Committee für SE/EE abgelehnt Vielleicht wächst hier ja etwas heran, das besser nutzen lässt, um bei JUG-Treffen worden. Die Gründe, die von den EC-Mit- einem neuen Anlauf für ein standardisier- die Initiative vorzustellen: http://java. gliedern genannt werden, sind unter an- tes „Social Media API“ nützt: https://blogs.

Java aktuell 3-2012 | 7 Java-Tagebuch

apache.org/foundation/entry/the_apa- vor einigen Tagen ein „Early Draft Review“ Auch Twitter verliert Stimmrechte im EC che_software_foundation_announces24 veröffentlicht. JCP-Lead Patrick Curran er- Nach AT&T, SK Telecom und Samsung hat klärt Details in seinem Blog: Bei den EC- es jetzt auch Twitter erwischt. Der Execu- Wahlen im Oktober 2012 werden neue tive-Committee-Neuling verliert wegen 2. April 2012 Mitglieder nur für ein Jahr gewählt. Un- mehrfacher Nichtteilnahme an Treffen des mittelbar danach werden die beiden ECs EC vorübergehend die Stimmrechte: https: JavaFX „Community Rock Stars“ wechseln zu Oracle zusammengelegt, sodass nach Wegfall //blogs.oracle.com/jcp/entry/transparen- Jim Weaver und Stephen Chin, zwei promi- des jeweils zweiten doppelten Sitzes von cy_call_for_spec_leads nente Namen im Java- FX-Umfeld, wech- Oracle und IBM zunächst ein Executive seln zu Oracle. Nur Amerikaner können Committee mit 30 Mitgliedern entsteht. Test-Plattform Arquillian: es so schön ausdrücken: „We‘re proud to Bei den Wahlen im Oktober 2013 werden Erstes stabiles Release herausgegeben! have both Jim Weaver and Stephen Chin drei ratifizierte und zwei frei wählbare Die von JBoss initiierte Test-Plattform joining Oracle‘s Java Evangelist Team.“ Der Sitze gestrichen, sodass das EC nur noch Arquillian hat das erste stabile Release Konzern demonstriert damit einmal mehr, 25 Mitglieder hat (16 ratifizierte Sitze, (1.0.0.Final) erreicht. Arquillian hat zum Ziel, dass es ihm wirklich ernst ist mit Java FX: 8 frei wählbare, plus Oracle). Bei diesen funktionale und Integrations-Tests deutlich https://blogs.oracle.com/java/entry/two_ Wahlen werden alle Sitze neu besetzt zu vereinfachen. Tests sollen im Container javafx_community_rock_stars (der permanente Sitz von Oracle ist hier ablaufen (nicht in einem speziellen „Em- sicher ausgenommen). Anschließend soll bedded Container“, sondern wie beispiels- dann jedes Jahr die Hälfte der Sitze neu weise schon bei Cactus in einem „richtigen“ 3. April 2012 vergeben werden: https://blogs.oracle. Container). Die Steuerungsaufgaben soll com/pcurran/entry/merging_the_execu- das Framework übernehmen, dazu gibt es Trojaner gefährden insbesondere tive_committees Adapter für die verschiedensten Container, Mac-OS-X-Systeme die allerdings, natürlich abgesehen von Innerhalb der letzten Wochen hat der Hei- JBoss AS 7, noch nicht final sind. Da es aber se News-Ticker mehrere Meldungen zu 10. April 2012 ein Open-Source-Projekt ist, können von einem Trojaner namens „Flashback“ und allen Interessierten Korrekturen vorgenom- anderer, ähnlich gearteter Schad-Software Tiobe-Index: C ist zurück an der Spitze men oder neue Adapter für den Container gebracht, die bekannte Lücken in der JVM Eine gute Nachricht für alle, die sich seit der Wahl hinzugefügt werden. Mit Arquilli- ausnutzt. Die Software bricht dadurch aus Jahrzehnten mit der Programmierspra- an wird nicht das Rad neu erfunden, son- der Sandbox aus, um anschließend weite- che C beschäftigen: Sie sind wieder ganz dern es benutzt bestehende Frameworks re Programmteile nachzuladen und zum oben auf der Hype-Welle: Laut Tiobe-Index wie JUnit, TestNG, Selenium und WebDriver Beispiel Passwort-Eingaben auszuspähen im April hat C (17,6 Prozent) erstmals seit oder integriert sich in diese: http://arquil- und zu übertragen. Oracle hat die ersten zwei Jahren wieder Java (17 Prozent) an lian.org/blog/2012/04/10/arquillian-first- dieser Lücken bereits im Februar für Java der Spitze abgelöst. Die beiden Sprachen stable-release für die Windows-Version gepatcht. Mac- liefern sich seit 2009 ein Kopf-an-Kopf- User müssen allerdings seit November auf Rennen in diesem Index, nachdem über ein Update von Apple warten, sodass sich mehrere Jahre der Anteil von Java deutlich 11. April 2012 die Schädlinge hier besonders ungehin- zurückgegangen war. Deutlich dahinter dert verbreiten können. Daher wird Apple- liegen C++, Objective-C und C#, keine die- JCP: Spec Leads verzweifelt gesucht Nutzern geraten, Java zu deaktivieren, bis ser Sprachen kommt über neun Prozent. Der JCP sucht nach neuen Specification ein Patch verfügbar ist. Auch Mozilla hat Wie aber schon in der letzten Ausgabe Leads für eine Reihe inaktiver JSRs, zum reagiert – die Firefox-Browser blockieren berichtet, muss man das Zahlenwerk des Beispiel die JSRs 241 (Groovy) und 304 veraltete Java-Plug-ins, um das Risiko zu Tiobe-Index nicht unbedingt zur Grund- (Mobile Telephony API). Die Bewerbungs- minimieren: http://www.heise.de/mac- lage seines Handelns machen. Letztlich frist lief allerdings schon am 23. April 2012 and-i/meldung/Flashback-Trojaner-nutzt- wird hier nur die Treffermenge zu Suchbe- aus: https://blogs.oracle.com/jcp/entry/ ungepatchte-Java-Luecke-aus-1499277. griffen im Internet ausgewertet. Kein Java- new_jsr_stage_inactive_jsrs html https://addons.mozilla.org/en-US/ Entwickler sollte also das Handtuch werfen firefox/blocked/p80 und im Buchversand seiner Wahl nach Ker- Andreas Badelt ist Technology nighan und Ritchie suchen – es sei denn, Architect bei Infosys Limited. er oder sie will es zur Abwechslung mal mit Daneben ist er seit 2001 ehren- 5. April 2012 Linux-Kernel-Entwicklung versuchen. Ach amtlich als Leiter der SIG Java ja: Scala ist diesmal doch unter den Top 50, der DOAG Deutsche ORACLE- JCP: Weitere Details zum aber weiterhin nur mit gut 0,2 Prozent An- Anwendergruppe e.V. aktiv. Executive-Committee-Merge teil: http://www.heise.de/open/meldung/ Der JSR 355 (Zusammenlegung der Exe- TIOBE-Sprachindex-C-loest-Java-an-Spit- cutive Committees für SE/EE und ME) hat ze-ab-1517708.html

8 |

iii iii iiiiii www.ijug.eu

„Die Java-Community ist riesig …“

Für Java aktuell ist Chefredakteur Wolfgang Taschner im Gespräch mit Harald Müller, Chief Product Owner für die Java Platform bei SAP.

Welchen Stellenwert hat Java bei SAP? Wie beurteilen Sie die Lage im Enterprise- Was erwarten Sie von Oracle in Bezug auf Aus Sicht von SAP ist Java eine sehr wich- Java-Markt? Java? tige Technologie, die eine zentrale Stelle Die Java-Community ist riesig und Java als Wir erwarten und wünschen uns, dass in unserem Technologie-Stack einnimmt. Technologie im Enterprise-Markt sehr stark Oracle die Offenheit von Java weiter be- Große Teile des SAP-Technologie-Portfolios verbreitet. Auch wenn immer wieder neue wahrt und fördert und damit ermöglicht, – insbesondere große Teile der SAP-Net- Sprachen und Technologien auftauchen dass Java eine attraktive Technologie so- Weaver-Plattform – basieren auf Java. Auch und sich verbreiten, wird Java als Basis- wohl für die lebhafte und große Java-Com- als Entwicklungssprache für Anwendungen Technologie auf lange Zeit nicht aus dem munity als auch für Unternehmen bleibt. werden wir weiterhin ABAP und Java, je- Markt wegzudenken sein. Wir erwarten weils entsprechend ihren spezifischen Stär- also, dass der Enterprise-Java-Markt weiter Welche Chancen sehen Sie für Android in den ken, verwenden und unterstützen. wachsen wird – insbesondere in der Cloud kommenden Jahren? sehen wir hier noch viel Potenzial. Android ist neben iOS und Windows Mo- Welche Ziele hat SAP mit Java? bile eine der wichtigsten Plattformen, auf Wie gesagt, bei SAP setzen wir jede Tech- die wir in unserer Strategie für mobile An- nologie entsprechend ihren Stärken ein. wendungen setzen. Im Fall von Java sind dies zum Beispiel Leichtgewichtigkeit, Performance und vor Was erwartet SAP in Zukunft von OpenJDK? allem die weite Verbreitung von Java und Innovation in Java passiert im OpenJDK- damit verbunden das globale Vorhanden- Umfeld. Deshalb fiel im letzten Jahr bei SAP sein von Java-Know-how. Lassen Sie mich die Entscheidung, sich aktiv am OpenJDK- das am Beispiel von NetWeaver Neo, SAPs Projekt zu beteiligen, um so Einfluss auf neuer Cloud-Plattform für Java-basierte die Entwicklung der Java-Technologie zu Anwendungen, illustrieren. Die Gründe gewinnen. SAP selbst implementiert seit ei- für Java liegen hier auf der Hand. Das Java- nigen Jahren bereits eine eigene Java Virtu- Modulsystem OSGi mit Eclipse Equinox al Machine, die sogenannte „SAP JVM“, auf als Referenz-Implementierung ermöglicht Basis einer kommerziell lizenzierten Version Leichtgewichtigkeit, Modularität und Per- von OpenJDK. Das heißt SAP, unsere Partner formance – Grundvoraussetzungen für und unsere Kunden profitieren direkt von eine dynamische und skalierbare Cloud- Harald Müller, Chief Product Owner für die Innovationen aus dem OpenJDK-Umfeld. Umgebung. Das auf offenen Standards Java Platform bei SAP Darüber hinaus bietet OpenJDK eine Platt- basierende, breite Spektrum von Open- form, um Kooperationen und Zusammen- Source-Java-Implementierungen für prak- arbeit zwischen Firmen und Entwicklern im tisch alle benötigten Technologie-Bereiche Wie ist das Verhältnis zwischen SAP und Java-Umfeld zu ermöglichen. Aktive Unter- macht es möglich, die Entwicklung auf das Oracle im Java-Bereich? stützer des OpenJDK-Projekts sind unter an- Wesentliche zu konzentrieren, statt das SAP und Oracle sind in Bezug auf Java derem IBM, Apple und Red Hat. Ein Beispiel Rad immer wieder neu erfinden zu müs- Geschäfts- und Entwicklungspartner und ist die erst kürzlich veröffentlichte Ankündi- sen. Die große Verbreitung von Java und haben in dieser Hinsicht und in der Com- gung der Zusammenarbeit zwischen SAP standardbasierten APIs, frei zugängliche munity ein stabiles und gutes Verhältnis. und IBM. Wir werden mit IBM an einer Por- Informationen und das weit verbreitete Das manifestiert sich unter anderem in der tierung von OpenJDK auf AIX und „Linux on Java-Know-how machen es Partnern und gemeinsamen Arbeit innerhalb von Open- PowerPC“ arbeiten. Kunden leicht, auf einer Plattform wie Neo JDK. Aber auch in anderen Bereichen wie eigene Anwendungen zu entwickeln. Das im Eclipse-Java-Projekt Gemini arbeiten Wie interpretieren Sie die Entscheidung von große Interesse für NetWeaver Neo be- Software-Ingenieure von SAP und Oracle Oracle, OpenJDK als Referenz-Implementie- stärkt uns in dieser Einschätzung. im Java-Umfeld zusammen. rung für Java festzulegen?

Java aktuell 3-2012 | 9 Buchbesprechung

Die Entscheidung ist aus SAP-Sicht posi- lung von Java eingebunden. Wir denken, Neue Technologie-Trends generieren neue tiv zu bewerten. Bisher wurde die Oracle/ dass dadurch eine Stärkung des Java- Anforderungen. Wir wünschen uns, dass Sun-Hotspot-JVM als Referenz-Implemen- Ökosystems erreicht wird und die Java- die Java-Plattform auch zukünftig Lösun- tierung der Java-Plattform herangezogen. Plattform weiter an Bedeutung gewinnen gen für diese Herausforderungen liefert. Diese JVM war nicht im Quelltext verfüg- wird. Insbesondere hoffen wir, dass durch Man erkennt den Einfluss der Cloud be- bar, sodass gerade die Fehleranalyse er- das Zusammenwirken der Community reits an den Plänen für Java SE 8 bezüglich heblich erschwert wurde. Darüber hinaus und großer Firmen wie SAP, IBM, Oracle, Modularität und Multi-Tenancy. Wir glau- wird die Erstellung einer Java-kompatiblen Red Hat und Apple auch in Zukunft eine ben, dass eine lebendige Community, in JVM deutlich vereinfacht. breite Technologie-Abdeckung durch der Individuen ebenso vertreten sind wie Java gewährleistet ist. Technologie-Unternehmen, die beste Vor- Was erwarten Sie von der Java-Community? aussetzung ist, damit Java auch weiter eine Durch das OpenJDK wird die Java-Com- In welche Richtung sollte Java sich entwi- attraktive Plattform für Technologie- und munity vermehrt in die Weiterentwick- ckeln? Anwendungs-Entwicklung bleibt.

Java 7 – Mehr als eine Insel

Gelesen von Jürgen Thierack

Beim Begriff „Java-Bibel“ denkt man in ers- nalität kodiert. Das Buch beginnt mit den ter Linie an Christian Ullenbooms „Java ist Neuerungen von Java 7. Über das gesamte auch eine Insel“ aus dem Galileo-Verlag Buch hinweg werden vom Autor Themen Titel: Java 7 – (ISBN 978-3-8362-1802-3), das zur Java- auch jenseits der Java-Bibliotheken abge- Mehr als eine Insel Version 7 nun schon in der 10. Auflage vor- handelt, etwa im Kapitel 8 die Dateifor- Autor: Christian Ullenboom liegt. Zu diesen 1.308 Seiten gesellen sich mate. Man kann sagen, dass der Autor das Verlag: Galileo Computing seit diesem Jahr weitere 1.433 Seiten in Umfeld, in der die Java-Bibliotheken zum Umfang: 1433 Seiten dem Fortsetzungsband „Java 7 – Mehr als Einsatz kommen, stets sehr ausführlich Preis: 49,90 € eine Insel“. Wer die Metapher mit der Bibel erläutert. So wird in Kapitel 7, das „XML“ ISBN: 978-3-8362-1507-7 fortspinnen möchte, kann vom Alten und zum Thema hat, erst erklärt, was Auszeich- Neuen Testament sprechen. nungssprachen sind, bevor die Java-Un- eBook (downloadbar) im Preis enthalten Schon der erste Band hat eine enorme terstützung zu XML an die Reihe kommt. Stofffülle, zu der der Autor in seinem Vor- Fazit: Man bekommt für knapp 50 Euro wort selber sagt: „Der Detailgrad der Insel viel Buch. Für den Leserkreis gilt das Glei- wird von keinem anderen (dem Autor be- che wie für den ersten Band: ab fortge- Jürgen Thierack kannten) deutsch- oder englischsprachigen schrittenem Anfänger aufwärts für jeden [email protected] Grundlagenbuch erreicht.“ Da stellt sich die Java-Entwickler geeignet. Beide „Bibeln“ Frage, wozu ein weiterer Band dienen soll. sind auch als „Galileo Open Book“ im In- Die Antwort lautet: Es werden die Biblio- ternet einsehbar und können als HTML- theken der Java Standard Edition 7 durch- Dokumente komplett heruntergeladen gesprochen und da ist eben viel Funktio- werden.

10 |

iii iii An dieser Stelle erhalteniiiiii Sie in jeder Ausgabewww.ijug.eu einUPDATE Update über das Geschehen in der Java-Community

Java-EE-Dreikampf: GlassFish, JBoss und Geronimo

Frank Pientka, MATERNA GmbH

Ende letzten Jahres wurden einige Applikationsserver für Java EE 6 zertifiziert. Den neuen Flaggschiffen steht ihre Bewährungsprobe jedoch noch bevor. Ein guter Zeitpunkt, sich GlassFish, JBoss und Geronimo näher anzuschauen.

Für Java EE 6 gilt der Satz: „Was lange währt, zielle Variante mit Support an. Die Hoff- Gerade mit den weiteren JBoss-Pro- wird endlich gut.“ Die lange Wartezeit zwi- nung, dass in GlassFish neben Java auch dukten wie Hibernate, SEAM, RichFaces, schen Veröffentlichung der Spezifikation andere Java-Skriptsprachen ausgeführt Jgroups, Infinispan, DROOLS, jBPM, Hor- und der Referenzimplementierung vor werden, hat sich nicht erfüllt und wurde in netQ oder GateIn integriert sich der JBoss- mehr als zwei Jahren haben die meisten den aktuellen Versionen nicht mehr unter- Applikationsserver gut, wenn man die Ver- Applikationsserver-Anbieter genutzt, um stützt. sionsabhängigkeiten beachtet. Hier bietet ihre Produkte auf die Anforderungen der Für die kommende Java-EE-7-Version JBoss mit seiner Mutter Red Hat einen bun- Zukunft auszurichten und dazu komplett existiert bereits eine erste Implementie- ten Strauß von Produkten an. umzubauen. rung mit GlassFish 4.0. Doch bevor Java Die Administrierbarkeit und Überwa- Dieser Wechsel stellt nicht nur für die EE 7 erscheint, wird es noch eine Version chung von großen JBoss-Installationen ist Hersteller, sondern auch für die Nutzer ei- 3.2 geben. GlassFish 3.1 wird sicher für die mit RHQ möglich. Die Entwicklung wird nige Herausforderungen bereit. Doch der nächsten Jahre die am meisten eingesetz- sowohl durch Werkzeuge wie die Eclipse- Umstieg auf Java EE 6 lohnt sich. Alle drei te GlassFish-Version bleiben, da im Bun- JBoss-Tools oder Test-Frameworks als auch hier vorgestellten Applikationsserver ver- dle mit NetBeans oder dem Java EE 6 SDK durch JSFUnit oder Arquillian gut unter- wenden intern OSGi; damit wird nicht nur regelmäßige Aktualisierungen geliefert stützt. der Server schlanker, sondern es lassen sich werden. Ebenso gibt es Erweiterungen wie Die am meisten eingesetzte Version ist auch flexiblere Anwendungen entwickeln. das Oracle Enterprise Pack für Eclipse, Inte- 5.1. Ein Versionswechsel auf 7.1 ist nicht Ein weiterer gemeinsamer Punkt ist, dass grationen in die Fusion-Produktreihe oder ohne Probleme. Gerade da die EJB-Ab- die Administrierbarkeit und die Integration Migrationsassistenten für WebLogic. Gera- wärtskompatibilität recht spät eingebaut in bestehende System- und Entwicklungs- de die Open-Source-Variante ist bei vielen wurde, ist hier mit Überraschungen zu Umgebungen verbessert wurden. Gerade Oracle-Kunden beliebt. rechnen. Eine Einschränkung der Open- Betriebsthemen wie Überwachung, Ska- Source-Varianten von JBoss bleibt, da die lierbarkeit und Automatisierbarkeit spie- JBoss: der Platzhirsch Entwicklung nicht wirklich öffentlich pas- len hier eine große Rolle. JBoss ist der älteste Open-Source-Applika- siert und Anwender keine Fehlerkorrektu- tionsserver. Dadurch ist er am Markt weit ren für alte Produkte erhalten. GlassFish: verbreitet. Technologisch ist er in den letz- Etwas kurios mutet die große Lizenz- die Referenz-Implementierung ten Jahren etwas ins Hintertreffen geraten. sammlung mit 22 Lizenzen von GPL bis Bei GlassFish handelt es sich um die Java- Das hat sich mit der Zwischenversion 6 und MIT an. Trotzdem zählt Red Hat zu den EE-Referenz-Implementierung. Es ist kein mit der gerade frisch zertifizierten Version großen Open-Source-Namen, die sich im Wunder, dass er immer die aktuellsten 7.1 geändert. Neben einer modernisier- Java-Community-Prozess an der Weiter- Standards unterstützt. Die Zukunft von ten Administrationsoberfläche wurde vor entwicklung von Java EE beteiligen. Feh- GlassFish war nach der Übernahme von allem unter der Haube mit OSGi einiges lerkorrekturen werden immer nur über die Sun durch Oracle etwas ungewiss. Doch geändert. Neben Felix, Tomcat und Aries aktuellste Community-Version angeboten spätestens nach der Vorstellung von Glass- werden hier einige Apache-Komponenten oder der Kunde muss auf die erst später er- Fish 3.1.1 im Februar 2011 legte sich die verwendet. Dadurch, dass man die CDI-Re- scheinende stabile, aber kostenpflichtige Aufregung, da dieser endlich die lang er- ferenz-Implementierung Weld an Apache Enterprise-Version wechseln. Wer jedoch sehnte Cluster-Fähigkeit enthält. Genau übertrug und das eigene Web-Service- mit dieser Unsicherheit leben kann, für ein Jahr später erschien die aktualisierte Framework zugunsten von Apache CXF den ist JBoss immer noch ein gutes Rund- und fehlerbereinigte Version GlassFish aufgab, scheint es bei JBoss ein Umdenken um-Angebot. Wobei hier der Schritt auf die 3.1.2. Neben der Open-Source-Variante hinsichtlich der Zusammenarbeit mit Apa- nächste Applikationsserver-Version, durch bietet Oracle eine gleichnamige kommer- che zu geben. die Architektur und Versionsaktualisierung

Java aktuell 3-2012 | 11 Applikationsserver

der verwendeten Komponenten, nicht immerhin als zweiter Open-Source-Server werden, dass die Entwicklung und die Un- ohne Stolperfallen ist. Spätestens mit der nach GlassFish geschafft, jede JEE-Zertifi- terstützung der Community in den letzten für Mitte des Jahres geplanten Enterprise- zierung zu erfüllen. Die am meisten ein- Jahren etwas nachgelassen hat. Trotzdem Applikationsserver-Version 6, die wieder- gesetzte Version ist 2.1.8, wobei bei dieser bleibt Geronimo, gerade als Integrations- um auf der Community-Version 7.1 beruht, Version seit der Vorstellung Anfang 2008 plattform für die vielen Apache-Java-EE- sollten die meisten aktuellen Probleme immer wieder Fehlerkorrekturen erschie- Projekte, wichtig. beseitigt sein. nen sind. Geronimo bietet gerade für Eclipse und Für Geronimo besteht fünf Jahre offi- Maven eine gute Integration an. Es gibt Geronimo: der Nachzügler zieller Support und weitere drei Support- viele Möglichkeiten, das Deployment zu Apache Geronimo ist vor allem als freie Jahre sind bei IBM buchbar. Damit bietet automatisieren oder den Server über eine Herausforderung zu JBoss angetreten. Geronimo – typisch Apache – von allen komfortable Oberfläche zu konfigurieren Deswegen setzen viele Entwickler be- drei Produkten die längsten Support-Zeit- oder zu überwachen. währte andere Open-Source-Komponen- räume bei regelmäßigen Weiterentwick- Wer sich zutraut, selbst Hand anzulegen ten ein. So hat es Geronimo seit der Ver- lungen, was eine gute Planungssicherheit und sich trotz unvollständiger Dokumen- sion 1.0 und der Zertifizierung für J2EE 1.4 ergibt. Jedoch darf nicht verschwiegen tation auf Open Source einzulassen, erhält

GlassFish JBoss Geronimo

Lizenz CDDL1.1, GPL 2 LGPL 2.1 ASF

Beurteilung + sehr gute Dokumentation, + gute Dokumentation + stabiles, schlankes und gut viele Beispiele + verbesserte Administrierbarkeit anpassbares Produkt mit + Cluster Support + gute Integration in JBoss, ausgereiften Best-of-Breed- + Migrations-, Upgrade- Red-Hat-Produkte Komponenten Unterstützung + gute Cloud-Integration + gute IDE-, BUILD-Integration + gute IDE-, BUILD-Integration + gute Testbarkeit Arquillian + Langzeitsupport + gute Administrier-, + gute IDE-, BUILD-Integration + gute Mitwirkungsmöglichkeit, Automatisierbarkeit (GUI, CLI) - Webcontainer: Tomcat jedoch kleine Community + Supportmöglichkeit - seltenere und unregelmäßige + regelmäßige Releases auch ältere + aktuelle Referenzimplementierung Releases nur für aktuellste Version + hybride Version für OSGi, Jetty/ + regelmäßige Releases auch ältere - große Community, jedoch mit Tomcat, CXF, Axis2 mit klarer Roadmap wenig Mitwirkungsmöglichkeiten - wenig Dokumentation, Beispiele + mittlere Produktgröße 83 MB bei der Produktweiterentwicklung + kleinstes Produkt mit 74-91MB - relative neue Architektur + sehr freie ASF-Lizenz - eingeschränkte Abwärts- kompatibilität - Langzeitsupport nur für kommerzielle Variante - größtes Produkt 103 MB

Plattformen LINUX, Windows, SOLARIS, AIX LINUX und Windows LINUX, Windows, SOLARIS, AIX

Webcontainer Grizzly Tomcat Jetty, Tomcat

OSGi Felix Felix, Karaf Equinox, Felix, Karaf, Aries

myFaces, JSF Mojarra Mojarra, Richfaces, SEAM OpenWebBeans

CDI Weld Weld OpenWebBeans

JAX-WS, Metro, Jersey CXF, RESTEasy CXF, Axis2, WINK JAX-RS

JPA EclipseLink, Hibernate Validator Hibernate, Hibernate Validator OpenJPA, BVal

Tabelle 1: Übersicht und Bewertung

12 |

iii iii iii iii iiiiii www.ijug.eu

mit Geronimo einen verlässlichen und in- Die Installation erfolgt bei JBoss und zu mehr Modularität. Dadurch, dass der novativen Begleiter. Etwas Konkurrenz im Geronimo durch das Installationsformat Java-Markt gesättigt ist, wird es hier wenig eigenen Haus hat Geronimo durch den zip/tar einfach durch Auspacken. Dannach Bewegung geben. Für viele Projekte steht ebenfalls zertifizierten Tom-EE-Server und muss nur noch ein aktuelles JDK und die der Schritt in die Java-EE-6-Zukunft noch den demnächst geplanten Karaf-EE-Server „JAVE_HOME“-Variable gesetzt sein. Bei bevor. bekommen. Für die hybride Entwicklung GlassFish oder bei der auf Geronimo ba- Ungeachtet vieler Unterschiede bei von OSGi und Java-EE-Anwendungen sierenden WebSphere Community Edition Lizenz, Support, Architektur und den ver- scheint Geronimo eine gute Wahl zu sein, geht es etwas komfortabler. Es gibt einen wendeten Komponenten, haben die hier da die Beispiele von Karaf und Aries vom grafischen Wizard für die unterstützten vorgestellten Produkte durch den Java- gleichen Hersteller ohne zusätzliche An- Plattformen, der einem hilft, die Java-Um- EE-Standard viele Gemeinsamkeiten. Kurz passungen in Geronimo lauffähig sind. gebungsvariablen zu setzen und die ers- zusammengefasst kann man sagen, dass Durch die stagnierenden Committer-Zah- ten Einstellungen vorzunehmen. GlassFish sich etabliert hat und für die len und den Ausstieg von Apache aus dem Nach dem Start des Servers muss man Java-EE-Funktionen am weitesten ausge- Java-Community-Prozess sind die Apache- nur noch die entsprechende Admin- reift ist. JBoss und Geronimo bieten erst Projekte zwar nicht gefährdet, doch die Konsole mit dem in der Dokumentation seit Kurzem eine volle Java-EE-6-Unter- Weiterentwicklung etwas gebremst. Umso beschriebenen Admin-Anmeldung im stützung, sodass hier noch einige Fehler erfreulicher ist, dass große Unterstützer Browser aufrufen. Für die initiale Verwen- schlummern, die im Laufe dieses Jahres des JCP wie IBM und JBoss sich immer dung ist erst mal nichts umzukonfigurie- behoben sein werden. Als Open-Source- mehr bei Apache-Projekten engagieren ren. Viele, aber nicht alle Konfigurations- Applikationsserver bieten alle drei Kandi- und so die Open-Source-Fahne weiter we- möglichkeiten sind über diese Oberfläche daten interessante und innovative Alter- hen lassen. möglich. nativen zu kommerziellen Anbietern oder Der erste Kontakt mit den neuen Java- reinen Webservern an, die einen Wechsel Zusammenfassung EE-Servern klappt für Neueinsteiger pro- attraktiv machen. Erste Ansätze, wie der Die Unterschiede zwischen den Produkten blemlos, wer jedoch tiefer einsteigen Weg der Applikationsserver in die Cloud werden immer geringer. Trotzdem kann möchte, ist auf eine gute Dokumentation aussehen könnte, sind zwar sichtbar, doch die folgende Übersicht bei der ersten Ori- und Erfahrung angewiesen. Gerade was noch nicht, wer hier das Rennen machen entierung helfen (siehe Abbildung 1 und die Bereiche „Hochskalierbarkeit“ oder „Mi- könnte. Tabelle 1). Interessant ist der Vergleich der gration“ betrifft, muss sich beim Umstieg Entwicklung der Codegröße der jeweili- etwas einarbeiten. Links gen Produkte. Hier zeigt sich die Tendenz, • http://www.ohloh.net/p/compare?proj dass die Produkte, ähnlich wie der Java- Fazit ect_0=GlassFish&project_1=Apache+G Standard, immer größer werden. Durch die Durch die Übernahme von Sun durch eronimo&project_2=JBoss+Applicatio neue Modularität sind die neuen Applika- Oracle hat Java wieder eine Zukunft. Der n+Server tionsserver immer anpassbarer geworden, aktuelle und der kommende Java-EE-Stan- • http://geronimo.apache.org was sich nicht zuletzt auf das schnelle dard haben zu einer Renaissance der Ap- • http://www.jboss.org/jbossas Startverhalten und den geringen Ressour- plikationsserver geführt. Trotzdem weisen • http://glassfish.java.net/ cen-Verbrauch auswirkt. die Applikationsserver mit OSGi den Weg

Frank Pientka [email protected]

Frank Pientka ist Senior Software Architect bei der MATERNA GmbH in Dortmund. Er ist zertifizierter SCJP und Gründungsmit- glied des iSAQB. Als Autor eines Buches zu Apache Geronimo be- schäftigt er sich intensiv mit dem Einsatz von Java-Open-Source- Abbildung 1: Vergleich der Codegrößen (Ohloh.net) Software, insbesondere mit Applikationsservern.

Java aktuell 3-2012 | 13 WebLogic Server

WebLogic Server im Zusammenspiel mit Oracle Real Application Cluster

Michael Bräuer und Sylvie Lübeck, ORACLE Deutschland B.V. & Co. KG

„Active GridLink for Real Application Cluster (RAC)“ ist eine Funktionalität des Oracle WebLogic Servers, die erstmalig mit dem WebLogic Server 11g (10.3.4) ausgeliefert wurde.

Die damalige Restriktion, „Active Grid- werden drei Schichten unterschieden (sie- relationalen Datenbank verbinden, um Da- Link for RAC“ nur in Verbindung mit he Abbildung 1): ten abzufragen oder zu manipulieren. Oracle-Exalogic-Systemen nutzen zu Eine solche Architektur hat gegenüber Um einen ständigen Wiederaufbau von dürfen, wurde inzwischen aufgehoben, herkömmlichen Client-Server-Systemen Verbindungen mit der Datenbank zu ver- sodass die Funktionalität nun auch auf (etwa klassischen Zwei-Schichten-Daten- hindern, bieten fast alle Java-EE-Server die herkömmlichen – auch Nicht-Exalogic- bank-basierten Anwendungen) verschie- Möglichkeit, Verbindungen in einem Pool Umgebungen – eingesetzt werden kann. denste Vorteile. So kann man bei Bedarf in vorzuhalten und bei Bedarf wiederzuver- Dadurch wird diese wertvolle Funktion jeder Schicht skalieren, sowohl horizontal wenden. So muss nicht für jede Anfrage für eine Vielzahl von Kunden interessant, durch Bereitstellung neuer Hardware als eine neue Verbindung auf- und wieder die bereits Anwendungen auf Basis von auch vertikal durch optimale Nutzung der abgebaut werden. Eine Datasource abstra- Oracle RAC und Oracle WebLogic Server auf einem physikalischen Rechner vorhan- hiert die Definition und Verwendung sol- betreiben. Der Artikel zeigt die Versionen denen Ressourcen. Durch Redundanzen cher Verbindungen für den Anwendungs- des Oracle WebLogic Servers 11g (10.3.6) auf jeder Ebene kann die gewünschte entwickler und den Administrator. beziehungsweise 12c (12.1.1). Ziel ist es, Fehlertoleranz erreicht werden. Sowohl Java-EE-Server unterscheiden sich je- die Möglichkeiten des „Active GridLink for Skalierbarkeit als auch Fehlertoleranz doch in der Art und Weise der Funktiona- RAC“ vorzustellen und mit den weiterhin werden durch Oracle WebLogic Server auf lität, welche die Datasources liefern. Eine verfügbaren „Multi Datasource“-Lösun- Middleware-Ebene und durch RAC auf Da- typische Fragestellung ist, ob eine Data- gen zu vergleichen. tenbank-Ebene ermöglicht. source und deren Connection Pool die Ver- RAC ist eine Option der Oracle-Daten- fügbarkeit von Ressourcen der zugrunde Mehrschichtige Architektur bank. Die grundlegende Idee besteht da- liegenden Datenbank mitbekommen, sei Mit der Verbreitung von Kommunika- rin, mehrere Instanzen gleichzeitig für eine es bei geplanten als auch bei ungeplanten tionsstandards (zum Beispiel Http für die physikalische Datenbank zu nutzen. Auf Ausfällen, und wie auf solche Veränderun- Kommunikation im World Wide Web) fin- diese Instanzen kann die Last durch die gen reagiert wird. Speziell beim Einsatz den seit den neunziger Jahren des letzten Definition von Server Pools und Services von RAC ergeben sich vielfältige Fragen: Jahrhunderts mehrschichtige Systeme verteilt werden [1]. auch im betrieblichen Anwendungsum- • Wie schnell bekommt eine Anwendung feld stetige Verwendung. Innerhalb sol- WebLogic Server im Zusammenspiel mit RAC mit, dass zusätzliche RAC-Knoten zur cher Systeme wird Programmlogik auf ver- Java-EE-Anwendungen, die in der Mittel- Verfügung stehen, wenn diese gestar- schiedenen Schichten verteilt. Klassisch schicht laufen, müssen sich oft mit einer tet werden?

Abbildung 1: Mehrschichtige Anwendungen

14 |

iii iii iii iii iiiiii www.ijug.eu

Abbildung 2: Runtime Connection Loadbalancing

• Werden die Verbindungen des Pools auf Datenbankseite übermitteln Status- die auf laufende RAC-Instanz verweisen, bei Veränderungen innerhalb des RAC- Events – sogenannte „Fast Application No- benutzt werden. Die Anwendung bleibt Clusters automatisch angepasst, erfolgt tification (FAN)“-Events – an ONS-Clients, weiterhin verfügbar. Nicht abgeschlosse- also ein automatisches Rebalancieren beispielsweise beim Hochfahren einer ne SQL-Transaktionen der gekappten Ver- von Verbindungen beim Hinzunehmen RAC-Instanz. Diese Information, die Ver- bindungen müssen durch die ohnehin zu oder Verlassen eines Knotens des RAC- änderungen des aktuellen Zustands des implementierende Fehlerbehandlung sei- Clusters zur Laufzeit? RAC-Systems widerspiegelt, ist die Basis tens der Anwendung abgefangen werden. • Wie kann die Datasource mit neuen für die Funktionen „Fast Connection Fail- Ist zu einem späteren Zeitpunkt die Features von RAC umgehen, beispiels- over“ und „Runtime Connection Load Ba- RAC-Instanz wieder verfügbar, wird dies weise mit der Vereinfachung der Kon- lancing“, die nachfolgend erläutert werden. automatisch erkannt und der Pool wieder figuration durch Single-Client-Acces- aktiviert. Auch neue Instanzen, die etwa Name-Adressen (SCAN-Adressen)? Fast Connection Failover aus Gründen der Skalierbarkeit hinzukom- • Inwiefern werden Datenbank-Operatio- Fast Connection Failover (FCF) ist eine auf men, werden automatisch eingebunden. nen, die an verteilten Transaktionen par- oben beschriebenen FAN-Events basie- So ist eine optimale Ressourcen-Ausnut- tizipieren, auf dem gleichen RAC-Knoten rende Funktionalität des Oracle Universal zung des Gesamtsystems sichergestellt. ausgeführt (Transaktions-Affinität)? Connection Pools (UCP), die genutzt wird, Ein Administrator muss dabei nicht aktiv in • Können Datenbank-Operationen, die um Fehlertoleranz für JDBC-Verbindungen den Prozess eingreifen. ein Benutzer innerhalb einer Http-Ses- zu unterstützen. Aus diesem Grunde ist die sion durchführt, optimalerweise auf Verwendung des Oracle-Thin-JDBC-Trei- Skalierbarkeit durch Runtime demselben RAC-Knoten ausgeführt bers eine Voraussetzung für die Verwen- Connection Loadbalancing werden (Session-Affinität)? dung von „Active GridLink for RAC“. Zur Erreichung der bestmöglichen Perfor- Für die Verfügbarkeit einer Anwendung mance und Skalierbarkeit ist die optimale Oracle WebLogic Server kann für die Zu- bedeutet dies, dass bei Ausfall einer RAC- Verteilung der Anfragen an die verfügba- sammenarbeit mit Oracle RAC in zwei ver- Instanz nach Eingang eines entsprechen- ren RAC-Instanzen zur Laufzeit erforder- schiedenen Varianten konfiguriert werden. den FAN-Events der Connection Pool, der lich. Dies wird durch das Zusammenspiel Die erste Variante besteht in der Konfigu- auf diese RAC-Instanz verweist, gesperrt von Active-GridLink-Datasources und de- ration von Multi-Datasources, die zweite wird und Verbindungen anderer Pools, ren „Runtime Connection Load Balancing in der Definition von GridLink-Datasources (Active GridLink for RAC).

Active GridLink for RAC „Active GridLink for RAC“ stellt ein Allein- stellungsmerkmal des Oracle WebLogic Servers dar, um den Anforderungen an Skalierbarkeit, Lastverteilung und Fehlerto- leranz im Zusammenspiel von Mittelschicht und Datenbankschicht gerecht zu werden. Basis für diese Funktion ist der Oracle Notification Service (ONS). ONS-Daemons Abbildung 3: RAC-Service-Konfiguration für RCLB-Unterstützung

Java aktuell 3-2012 | 15 WebLogic Server

(RCLB)“-Funktion gewährleistet. Auch in [oracle@vm03-rac1-102178 ~]$ srvctl config scan SCAN name: vm-rac-102178-scan, Network: 1/138.3.20.0/255.255.252.0/cth0 diesem Fall werden FAN-Events benutzt, SCAN VIP name: scan1, IP: /vm-rac-102178-scan.osc.uk.oracle.com/138.3.21.220 um Connection Pools umzuorganisieren. Jedoch beinhalten die Events hier Informa- Listing 1: srvctl config scan tionen über die Veränderung der Auslas- tung des angeschlossenen RAC-Systems. Die Besonderheit von RCLB besteht [oracle@vm03-rac1-102178 ~]$ srvctl status database –d RACWLS darin, dass je nach Auslastung und Verfüg- Instance RACWLS1 is running on node vm03-rac1-102178 barkeit der RAC-Instanzen die Verteilung Instance RACWLS2 is running on node vm04-rac2-102178 der Anfragen optimal ist und dynamisch angepasst wird (siehe Abbildung 2). Bei Listing 2: Wurde der RAC erfolgreich gestartet? der Ermittlung der optimalen Verteilung werden CPU-Auslastung, Verfügbarkeit und Antwortzeiten berücksichtigt. [oracle@vm03-rac1-102178 ~]$ srvctl status device -s demosvc -d RACWLS Ohne FAN-Konfiguration auf RAC-Seite Service demosvc is running on instance(s) RACWLS1,RACWLS2 erfolgt die Verteilung der Anfragen aus dem Connection Pool zu der jeweiligen RAC-In- Listing 3: Wurde der Service erfolgreich gestartet? stanz nach dem Round-Robin-Algorithmus. RCLB unterstützt sowohl non-XA- als auch XA-Umgebungen mit globalen, ver- [oracle@vm03-rac1-102178 ~]$ srvctl config scan listener teilten Transaktionen. RCLB wird für den SCAN Listener LISTENER_SCAN1 exists. Port: TCP:1522 jeweiligen Service auf RAC-Seite konfigu- [oracle@vm03-rac1-102178 ~]$ srvctl status scan_listener SCAN Listener LISTENER_SCAN1 is enabled riert. Dazu muss der Service „GOAL“ entwe- SCAN listener LISTENER_SCAN1 is running on node vm04-rac2-102178 der auf „SERVICE_TIME“ oder „THROUGH- PUT“ gesetzt sein (siehe Abbildung 3).

Listing 4: Wurde der SCAN-Listener erfolgreich gestartet? Performanceverbesserung durch „GridLink Affinity“ „GridLink Affinity“ umfasst zwei Funktio- nen, die durch die Vergabe eines Affinitäts- [oracle@vm03-rac1-102178 ~]$ sqlplus /nolog Kontext die Performance der Anwendung SQL*Plus: Release 11.2.0.2.0 Production on Tue Apr 10 06:09:31 2012 Copyright (c) 1982 2010, Oracle. All rights reserved. verbessern. Die Funktion „Session Affinity“ SQL> connect SYS@RACWLS as sysdba stellt sicher, dass alle Anfragen innerhalb ei- Enter password: Connected. SQL> show parameter listener NAME TYPE VALUE Oracle WebLogic Server: ------Letzte Neuerungen im Überblick Listener networks string Local_listener string (DESCRIPTION(ADDRESS_LIST=(AD Die Übersicht auf der folgenden Sei- DRESS-(PROTOCOL=TCP)(HOST=138. te zeigt die wichtigsten Neuerungen 3.21.222)(PORT=1523)))) des WebLogic Servers (seit der Versi- remote listener string //vm-rac-102178-scan:1522 SQL> on 10.3.1). Nähere Informationen zu neuen Funktionen sind jederzeit in der WebLogic-Server-Dokumentation der Listing 5: Wurde der Remote-Listener richtig konfiguriert? jeweiligen Version unter „What‘s New in Oracle WebLogic Server“ zu finden, für WebLogic Server 12c (12.1.1) unter SQL> connect sys@RACWLS as sysdba http://docs.oracle.com/cd/E24329_01/ ... web.1211/e24494/toc.htm und für SQL> alter system set remote_listener=`//rac-scan:port` scope=both sid=`*`; WebLogic Server 11g (10.3.6) unter System altered. SQL> alter system register; http://docs.oracle.com/cd/E23943_01/ System altered. web.1111/e13852/toc.htm. ... Dort ist auch aufgeführt, wo die Über- sicht der „Deprecated Features“ zu fin- den ist. Listing 6: Remote-Listener-Konfiguration

16 |

iii iii iii iii iiiiiiiiiiii www.ijug.eu

Die wichtigsten Neuerungen aus dem Bereich „Architektur“

Funktion Beschreibung Engineered Systems mit Oracle WebLogic Server wurde für Exalogic seit WebLogic Server 10.3.4 weiter optimiert. Dazu gehört seit 12.1.1 u.a. das WebLogic Server Traffic Management über den Oracle Traffic Director als Teil der Exalogic Elastic Cloud Software. Cloud Computing Oracle WebLogic Server ist komplett integriert mit Oracle Enterprise Manager Cloud Control 12c und unterstützt den gesamten Cloud-Lebenszyklus. Eine für die Bereitstellung wichtige Komponente ist der Virtual Assembly Builder (derzeit mit WebLogic Server 10.3.6+ zertifiziert), der das Bundling der gewünschten Software, von Anwendungen etc. für eine Oracle VM unterstützt. In-Memory Datagrid Die Integration des WebLogic Servers mit (Active Cache) gibt es seit WebLogic Server 10.3.3. Im Zusammenspiel mit dem WebLogic Server löst Oracle Coherence als In-Memory Datagrid-Technologie typische Herausforderungen an Skalierbarkeit und Hochverfügbarkeit von jeglichem Zustand in verteilten, serverseitigen Java- Anwendungen. Es können dabei entweder HTTP-Session-Objekte (Coherence*Web) oder aus der Anwendung über die Coherence APIs Java-Objektstrukturen im Cache vorgehalten werden. Seit WebLogic Server 10.3.4 kann die Überwachung, das Starten und Stoppen von Oracle-Coherence-Knoten, auch über den Node Manager erfolgen. JPA 2.0 mit Oracle Ab WebLogic Server 10.3.4 ist TopLink der Default Persistence Provider und ersetzt Kodo/OpenJPA. TopLink Active GridLink Active GridLink for RAC (verfügbar seit WebLogic Server 10.3.4) ist inzwischen nicht nur für Exalogic, sondern auch für Datasource allgemeine WebLogic-Server-Installationen im Zusammenspiel mit einem Real Application Cluster einsetzbar. Seit 10.3.6 sind weitere Neuerungen wie Connection Labeling und Session Affinity Policy unterstützt. JMS JMS-Nachrichten können jetzt auch an Oracle Advanced Queuing angebunden werden. Dies erfolgt seit WebLogic Server 10.3.2 über eine Foreign JMS und eine JDBC Datasource. Für das Thema Hochverfügbarkeit und Skalierbarkeit werden seit WebLogic Server 10.3.4 zusätzlich Partitioned Distributed Topics unterstützt.

Die wichtigsten Neuerungen aus dem Bereich „Entwicklung“

Funktion Beschreibung Java EE 6 Vollständige Unterstützung von Java EE 6 Full Profile ab WebLogic 12c (12.1.1). Java SE 7 Oracle WebLogic Server 10.3.6 und 12.1.1 sind für das Java SE Development Kit (JDK) 7 zertifiziert. JDK 6 kann mit Web- Logic Server weiterhin verwendet werden. Entwicklungs- Als Java-Entwicklungsumgebung für Oracle WebLogic Server 12c sind derzeit NetBeans (7.1 oder höher) oder Oracle umgebung (IDE) Enterprise Pack for Eclipse (12.1.1 oder höher) verfügbar. Oracle JDeveloper bleibt weiterhin die strategische Entwick- nach Wahl lungsumgebung für . Die Unterstützung für WebLogic Server 12c ist für das Kalenderjahr 2012 geplant. Maven-Plug-in Das neue Maven-Plug-in für WebLogic Server (wls-maven-Plug-in) beinhaltet erweiterte Funktionalität für die Installa- tion, das Starten und Stoppen des WebLogic Servers, die Erzeugung von Domains, die Ausführung von WLST-Skripten (WebLogic Scripting Tool) und das Kompilieren und Bereitstellen von Anwendungen aus der Maven-Umgebung heraus. Die letzten Neuerungen sind seit dem WebLogic Server 12.1.1 verfügbar. Erstmalig war das Maven-Plug-in in der Version 10.3.4 enthalten.

Die wichtigsten Neuerungen aus dem Bereich „Betrieb“

Funktion Beschreibung

Custom MBeans per Es ist seit WebLogic Server 10.3.2 möglich, eigene MBeans, die im Domain-Runtime-MBean-Server registriert wurden, WLST manipulierbar mittels WebLogic Scripting Tool (WLST) zu manipuliert. WebLogic Thin T3 Client Der WebLogic Thin T3 Client ist seit WebLogic Server 10.3.3 eine leichtgewichtige, hoch performante Alternative zum WebLogic Full oder IIOP Client. ClassLoader Analysis Mit dem CAT kann seit WebLogic Server 10.3.4 untersucht werden, welche Java-Klassen wie in die Java VM geladen Tool (CAT) werden. Dies vereinfacht die Fehlerbehebung bei ClassLoader-Konflikten enorm. Erweiterte Diagnose- Neben der zusätzlich verfügbaren Enterprise-Manager-Umgebung (WLS Management Pack Enterprise Edition), welche Möglichkeiten die domänenübergreifende Überwachung, Fehlersuche und Administration unterstützt, gibt es eine Reihe von Neuerun- gen, die innerhalb der WebLogic Server Console zu finden sind. Dazu gehören beispielsweise das Monitoring Dashboard und die Diagnostics Request Performance Page, die seit WebLogic Server 10.3.3 enthalten sind. GlassFish-Anwendungen Es ist seit WebLogic Server 10.3.6 möglich, einfache Java-Anwendungen, die bisher auf GlassFish bereitgestellt wurden, in WebLogic Server unter Verwendung des GlassFish Deployment Descriptors (-web.xml) auf dem WebLogic Server bereitzustellen. deployen Es wird derzeit eine Teilmenge der in glassfish-web.xml enthaltenen Tags berücksichtigt. TLogs in der Es ist ab WebLogic Server 10.3.6 möglich, die Transaktions-Logs (TLOG) in der Datenbank persistent vorzuhalten. Dies ist Datenbank für den Recovery-Fall und den damit erforderlichen konsistenten Zustand eminent wichtig. Restful Monitoring API WebLogic Server unterstützt das Monitoring mittels RESTful Web Services (JAX-RS).

Java aktuell 3-2012 | 17 WebLogic Server

Für Datenbank-Operationen, die an globalen, verteilten Transaktionen partizi- pieren, wird über einen Affinitäts-Kontext sichergestellt, dass alle Anfragen innerhalb der Transaktion an dieselbe RAC-Instanz weitergeleitet werden. Diese Funktion heißt „Transaction Affinity“.

Active-GridLink-Konfiguration Für die Konfiguration einer Active-Grid- Link-Datasource werden folgende Infor- mationen von der RAC-Umgebung benö- tigt: Service-Name, SCAN-Adresse + Port, Benutzername + Kennwort. Der Daten- Abbildung 4: Active GridLink for RAC, Schritt 1 der Konfiguration bank-Administrator kann durch den Befehl „onsctl debug“ alle notwendigen Informa- tionen liefern. Die SCAN-Adresse lässt sich auch über den Befehl „srvctl config scan“ (siehe Listing 1) ermitteln. Zur Definition der Datasource sollte sichergestellt sein, dass sowohl die RAC- Umgebung (siehe Listing 2) als auch der Service (siehe Listing 3) sowie der SCAN- Listener (siehe Listing 4) erfolgreich ge- startet wurden. Für die erfolgreiche Anbindung via GridLink-Datasource ist die Konfiguration des Remote-Listeners erforderlich (siehe Listing 5). Falls die Konfiguration ange- passt werden muss, kann dies wie in Lis- ting 6 dargestellt erfolgen. Nachdem auf RAC-Seite alles vorbereitet wurde, bleibt noch die Konfiguration sei- tens Oracle WebLogic Server. In der Ober- Abbildung 5: Active GridLink for RAC, Schritt 2 der Konfiguration fläche und teilweise auch in der Dokumen- tation wird die Active-GridLink-Datasource als „GridLink-Datasource“ bezeichnet. Die- se kann zum Beispiel über die WebLogic- Server-Admin-Konsole angelegt werden. Unter der „Domain Structure“ befindet sich für die Domäne der Menüpunkt „Services –> Datasources“. Um eine neue Datasource zu konfigurieren, steht der Menüpunkt „New –> GridLink Datasource“ zur Verfü- gung (siehe Abbildung 4). Die GridLink-Datasource lässt sich jetzt Schritt für Schritt konfigurieren. Als näch- stes werden der Name und der JNDI-Name vergeben. Am Ende erfolgt die Auswahl des gewünschten JDBC-Treibers (siehe Ab- bildung 5). Abbildung 6: Active GridLink for RAC, Schritt 3 der Konfiguration Je nach Auswahl des JDBC-Treibers er- scheinen im nächsten Schritt unterschied- ner Http-Session an die gleiche RAC-Instanz sung der Verbindung über RCLB ein Affini- liche Eingabemöglichkeiten. Zum näch- weitergeleitet werden. Dies wird erreicht, täts-Kontext vergeben wird. Session-Affini- sten Schritt geht es mit „NEXT“ weiter. Hier indem beim ersten Aufruf nach der Zuwei- tät ist seit WebLogic Server 10.3.6 verfügbar. gibt es zwei Alternativen. In unserem Fall

18 |

iii iii iiiiii www.ijug.eu

nehmen wir die vorgegebene Auswahl Connection Loadbalancing) konfigu- „Enter individual listener information“ und riert werden. gehen mit „NEXT“ weiter. • Multi-Datasources ermöglichen rudi- Jetzt werden der RAC-Service bekannt- mentäre RAC-Instanzaffinität (für ver- gegeben sowie der RAC-Host und der Port teilte Transaktionen). eingetragen. Dazu wird die zuvor ermittelte SCAN-Adresse verwendet (siehe Abbildung Fazit 6). Darunter ist noch die Konfiguration des Oracle WebLogic Server und RAC wurden Datenbank-Benutzers erforderlich. entwickelt, um hochskalierbare und feh- Nach Prüfung der Angaben kann jetzt lertolerante Anwendungen zu betreiben. die Verbindung zur Datenbank durch Drü- Oracle WebLogic Server „Active GridLink cken der Auswahl „Test All Listeners“ getes- for RAC“ stellt das wichtige Bindeglied dar, tet werden. Im nächsten Schritt erfolgt die um auch für Java-EE-Anwendungen Eigen- Konfiguration für die FAN/ONS-Events. FAN- schaften von Oracle RAC zur Lastvertei- Events müssen aktiviert sein und Host und lung, Skalierbarkeit und Hochverfügbar- Port für ONS eingetragen werden. In unse- keit bestmöglich auszureizen. rem Fall ist das „vm-rac-102178-scan: 6200“. Jetzt kann die ONS-Client-Kommunika- Weiterführende Informationen tion zum RAC durch Drücken der Auswahl • Übersicht zu Oracle RAC [1]: http://www. „Test All ONS Nodes“ getestet werden. Zu- oracle.com/technetwork/database/clustering/ letzt wird noch definiert, auf welchen Ser- overview/index.html • Konfiguration von Active GridLink for RAC Da- vern oder Clustern die Datasource zur Ver- tasources in WebLogic Server 12c: http://docs. fügung stehen soll, und mit „Finish“ wird die oracle.com/cd/E24329_01/web.1211/e24367/ Konfiguration abgeschlossen. Nach Defini- gridlink_datasources.htm#CHDDJGBH tion der GridLink-Datasource kann unter • Active GridLink for RAC – ein technisches „$WLS_DOMAIN_HOME/yourdomain/con- Oracle Whitepaper: http://www.oracle.com/ fig/jdbc/“ die Konfiguration eingesehen technetwork/middleware/weblogic/gridlink- werden. rac-wp-494900.pdf • Use Oracle WebLogic Server with a JDBC Grid- Link Data Source: http://www.oracle.com/tech- Multi-Datasources: network/middleware/weblogic/wls-jdbc-grid- Abgrenzung zu Active GridLink for RAC link-howto-333331.html Zwar kann Oracle RAC mit WebLogic Ser- ver auch ohne „Active GridLink for RAC“- Michael Bräuer Datasources mittels Multi-Datasource [email protected] betrieben werden, jedoch haben diese im Sylvie Lübeck Vergleich gewisse Einschränkungen: [email protected]

• Multi-Datasources abstrahieren physi- Michael Bräuer ist leitender kalische Datasources, die jeweils einen Systemberater der ORACLE Deutschland B.V. & Co. KG. Verbindungspool zu einem RAC-Kno- Er nutzt seine langjährige ten ermöglichen. Es müssen dabei bei n Berufserfahrung in den Berei- RAC-Knoten n+1 Datasources im Web- chen Anwendungsintegration, Logic Server konfiguriert werden. Bei Middleware und Java EE, um Topologie-Änderungen des RAC-Clus- kritische Geschäftsanwendun- ters muss die Konfiguration durch den gen auf das passende techno- Administrator angepasst werden. logische Fundament zu stellen. • Multi-Datasources „pollen“: In wieder- kehrenden Intervallen wird der Zu- Sylvie Lübeck ist in der ORACLE stand der RAC-Knoten abgefragt, um Deutschland B.V. & Co. KG in Zustandsveränderungen zu ermitteln. der Abteilung „Business Unit Server Technologies – Fusion Durch die Konfiguration des Polling- Middleware“, die deutschland- Intervalls wird bestimmt, wie „zeitnah“ weit die Middleware-Themen eine Zustandsänderung erkannt wird. technisch und vertriebsun- • Multi-Datasources können entweder terstützend verantwortet. Ihr für Failover oder für Loadbalancing (na- Schwerpunktthema ist der tives Round-Robin, aber kein Runtime Oracle WebLogic Server.

Java aktuell 3-2012 | 19 Modellierung

Das Eclipse Modeling Framework: EMFStore, ein Modell-Repository

Jonas Helming und Maximilian Kögel, EclipseSource München GmbH

Mit dem Eclipse Modeling Framework (EMF) können Entitäten einer Anwendung modelliert und als Java-Klassen generiert werden. Dies ermöglicht einen sehr kurzen Entwicklungszyklus vom Datenmodell zu einer lauffähigen ersten Anwendung, in der Entitäten, Attribute und Referenzen bereits in einer Benutzeroberfläche sichtbar sind.

Im ersten Teil dieser Reihe demonstrier- nen ganz anderen Vorteil. Alle generierten sichtbar. Konflikte sind in diesem Szena- ten wir, wie Modelle in EMF erzeugt und Klassen folgen ähnlich wie beispielsweise rio unwahrscheinlich. Im zweiten Szenario daraus Code generiert werden kann. Der Java Beans einer definierten und stabilen arbeiten die Benutzer zunächst offline auf zweite Teil der Reihe beschrieb den Auf- API. Außerdem bieten sie Zusatzfunktio- den Entitäten. Dies entspricht dem An- bau des generierten Codes, die API der nen wie beispielsweise einen Notifizie- wendungsfall vieler Tools, beispielsweise generierten Klassen sowie nützliche Hilfs- rungs-Mechanismus an. Diese Tatsache einem Modellierungstool für Ingenieure. klassen. Die Inhalte der ersten beiden Teile ermöglicht es, wiederkehrende Features In diesen Domänen spielt es meist we- sind unter [1] zum Download verfügbar. durch Frameworks generisch zu lösen und niger eine Rolle, dass ein Client wirklich Nach der Einführung der Grundlagen von wiederzuverwenden. Der EMFStore ist ein offline, also der Server nicht erreichbar ist. EMF widmen wir uns nun den zahlreichen solches Framework und ermöglicht das Vielmehr geht es darum, dass ein Benutzer weiteren Frameworks, die auf EMF basie- kollaborative und verteilte Bearbeiten von des Tools nur konsistente Zustände mit ren. Wir beginnen mit dem EMFStore, der Modell-Instanzen (Modell-Repository). In dem Rest des Teams teilen will. Erst wenn es ermöglicht, zügig eine Client-/Server- einer fiktiven Anwendung, die auf dem eine Änderung abgeschlossen ist, wird ein Anwendung rund um ein EMF-Modell um- Bowling-Beispielmodell basiert, könnten Commit angestoßen, bei dem die Ände- zusetzen. also die Daten über Bowlingspieler und rungen in die zentrale Version der Entitä- Turniere in verschiedenen Bowlingcentern ten eingespielt werden. Einführung parallel angezeigt und bearbeitet werden. Das zweite Szenario ist also ähnlich ei- In den ersten beiden Teilen dieser Reihe Bei der verteilten Bearbeitung von nem Source-Code-Management-System wurden ein Datenmodell in EMF erstellt, Modell-Instanzen sind prinzipiell zwei Sze- (SCM). Für dieses Szenario wurde der daraus Code generiert sowie die gene- narien zu unterscheiden. Im ersten, dem EMFStore entwickelt. Im Gegensatz zu rierten Klassen im Detail vorgestellt. Ab- klassischen Datenbankszenario, arbeiten SCM-Systemen ist er jedoch nicht auf die bildung 1 zeigt das bisher verwendete alle Benutzer live auf den gleichen Daten, Versionierung von Textdateien ausgelegt, Beispielmodell, das das Spiel Bowling mit Änderungen sind sofort für alle Clients sondern versioniert die Entitäten auf der einer League und Tournaments abbildet. Im Beispiel wäre nun der nächste logische Schritt, eine Anwendung rund um das Mo- dell zu entwickeln, mit der Entitäten des Modells erstellt, bearbeitet sowie lokal ge- speichert werden können. In den meisten echten Szenarios müsste zusätzlich eine Serverlösung bereitgestellt werden, damit Entitäten kollaborativ auf mehreren Cli- ents bearbeitet werden können. EMF stellt insbesondere für die Ent- wicklung von Benutzeroberflächen bereits zahlreiche zusätzlich generierte Hilfs- klassen bereit; Details dazu stehen bei- spielsweise in der englischen Version des EMF-Tutorials unter [1]. EMF bietet aber neben generierter Funktionalität noch ei- Abbildung 1: Das Beispielmodell

20 |

iii iii iiiiii www.ijug.eu

Modellebene. SCM-Systeme interpretieren den Inhalt eines Textfiles meist lediglich auf Zeilenebene, das bedeutet, sie „verste- hen“ nicht wirklich, was darin steht. Der EMFStore hingegen nutzt die Vorteile von EMF aus, um Änderungen im Modell auf- zuzeichnen, zu interpretieren und poten- zielle Konflikte aufzulösen. Wie das genau funktioniert, wird im Abschnitt „Was steckt dahinter?“ beschrieben. EMFStore ist ein Eclipse-Open-Source-Projekt und kann Abbildung 2: Im Navigator und Editor können Entitäten erstellt und bearbeitet werden direkt in die eigene Anwendung integriert werden. Entitäten anzuzeigen und zu editieren. Der Nun kann eines der beiden Projekte Aller Anfang ist leicht Navigator und der Editor basieren auf der modifiziert werden, beispielsweise wird EMFStore ist ein Server-Framework, das EMF Client Platform [4]. das „Name“-Attribut eines Players im Edi- üblicherweise „headless“ in Anwendungen Ein lokal erstelltes Modell ist zunächst tor geändert oder man fügt neue Entitäten integriert wird, mehr dazu im Abschnitt nicht für andere Clients zugreifbar. Dazu hinzu. Sind die Änderungen abgeschlos- „API“. Um die Funktionalität mit einem ei- muss es auf den EMFStore hochgeladen sen, werden sie an den Server übertragen. genen Modell möglichst einfach testen werden („Share Project“). Beim „Share“ Dazu wird im Rechtsklick-Menü des Pro- zu können, nutzt EMFStore die EMF Client kann ein Server ausgewählt werden, auf jekts ein „Commit“ ausgelöst. Im angezeig- Platform [4], um eine generische Benutzer- den das Projekt übertragen wird, im Test- ten Dialog können die vorgenommenen oberfläche (UI) zu erzeugen. Damit kann Setup ist dieser Server „localhost“. Bei der Änderungen detailliert betrachtet und man ohne weiteres Zutun Entitäten eines ersten Anfrage verlangt der Server einen mit einem Kommentar versehen werden Modells erzeugen und modifizieren. Diese Login, im Test-Setup kann man den Stan- (siehe Abbildung 4). Dieser Commit-Kom- lassen sich dann auf den EMFStore übertra- dard-Benutzer „super“ mit dem Passwort mentar findet auch Eingang in die Historie gen und verteilt bearbeiten. Damit erhält „super“ verwenden. Im EMFStore-Browser des Projekts. man einen guten Überblick über die Funk- (siehe Abbildung 3) wird das Projekt nach tionalität, ohne bereits eine eigene An- dem erfolgreichen Share unter dem ge- wendung rund um ein Modell entwickelt wählten Server angezeigt. Projekte kön- zu haben. Initial wird also zunächst nichts nen alternativ auch direkt auf dem Server anderes als das eigene Modell, beispiels- erstellt werden, sie sind also zunächst weise das Bowling-Modell, benötigt. Nach nicht lokal verfügbar. dem Setup (siehe Kasten auf Seite 23) und dem Starten von Client und Server kann zunächst lokal ein Projekt erstellt werden. Dazu sollte in die EMFStore-Perspektive gewechselt werden. Alternativ kann man auch manuell die entsprechenden Views, Navigator und EMFStore Browser aus dem View-Menü in Eclipse öffnen. Abbildung 3: Der EMFStore-Browser zeigt auf Modell-Entitäten sind im EMFStore in Servern verfügbare Projekte an und erlaubt Projekten organisiert. Ein lokales Projekt den Check-out kann durch einen Rechtsklick in den leeren Abbildung 4: Im Commit-Dialog werden Än- Navigator erzeugt werden (Other –> New Um die Zusammenarbeit über den EMFStore derungen im Detail betrachtet und mit einem Project). Innerhalb eines Projekts können zu testen, ist ein zweiter Client erforderlich. Kommentar versehen dann über „New Model Element“ Entitäten Im Test-Setup kann dies auch der gleiche eines Modells erzeugt werden, beispiels- Client sein, auf dem die Entitäten anfänglich Ein „Update“ bringt die zweite Projekt-In- weise eine League. Ein Rechtsklick auf erstellt wurden, das heißt es werden auf dem stanz auf den gleichen Stand. Erneut zeigt eine bereits existierende Entität erlaubt gleichen Client zwei Versionen des gleichen ein Dialog Details der Änderungen an, in es, Kind-Entitäten (Containment) zu erstel- Projekts erzeugt. Dazu wird das eben geteil- diesem Fall derjenigen, die vom Server auf len, beispielsweise einen Player innerhalb te Projekt ein zweites Mal ausgecheckt. Dies den lokalen Client übertragen werden. einer League (siehe Abbildung 2). Aus wird durch einen Rechtsklick auf das Projekt Mit diesem Workflow (Commit/Update) dem Navigator kann per Doppelklick für im EMFStore-Browser über „Check-Out“ aus- können nun beliebig viele Clients auf den eine gewählte Entität ein Editor geöffnet gelöst. Der Navigator zeigt nun zwei Versio- gleichen Entitäten zusammenarbeiten. werden. Dieser erlaubt es, beliebige EMF- nen des gleichen Projekts an. Hierbei kann es natürlich zu überlappen-

Java aktuell 3-2012 | 21 Modellierung

nun lediglich diese Änderungen übertra- gen werden, gleiches gilt parallel für ein Update. Die Aufzeichnung der Änderun- gen bietet einen weiteren entscheidenden Vorteil, sie ist deutlich präziser als der Ver- gleich von Dateien. Bei einem potenziellen Konflikt kann der EMFStore Informationen auf der Mo- dellebene berücksichtigen, eine Ände- rung ist also nicht nur eine Modifikation in einer Datei, sondern eine Operation am Modell, beispielsweise „Referenz hinzuge- fügt“. Diese zusätzlichen Informationen erlauben eine deutlich präzisere Konflik- terkennungs-Strategie, es kommt also zu weniger falsch erkannten Konflikten (siehe auch [7]). Kommt es zum Konflikt, kann der User mit einer komfortablen UI Abbildung 5: Im Merge-Dialog wird im Konfliktfall entschieden, welche Änderungen angewendet beim Merge-Prozess unterstützt werden. werden sollen Die genaue Konflikterkennungs-Strategie kann bei Bedarf sogar modellspezifisch den Änderungen kommen. Im Beispiel – bewährt haben, hat die Vorgehensweise angepasst werden. Nicht zuletzt bietet der könnten zwei Clients gleichzeitig den signifikante Schwächen für Modelle be- EMFStore auch eine deutlich genauere His- Namen einer Entität auf unterschiedliche ziehungsweise Entitäten (siehe auch [7]). torie der vorgenommenen Änderungen, Werte setzen. In diesem Fall unterstützt Dies liegt im Wesentlichen an der Tatsache, beispielsweise wird durch die Aufzeich- der EMFStore interaktives Merging. Der dass das SCM auf der Datei- und Textebene nung die Reihenfolge der Modifikationen User kann im Fall von überlappenden Än- arbeitet und das enthaltene Modell nicht am Modell konserviert. derungen auswählen, welche Änderungen kennt. Wird nun auf zwei Clients parallel er tatsächlich übernehmen will (siehe Ab- eine Referenz erzeugt, werden also im Die API bildung 5). Bowling-Modell beispielsweise zwei Play- Im Abschnitt „Der erste Schritt“ wurden Das generische UI bietet noch einige er in eine League eingefügt, wird ein SCM die wichtigsten Anwendungsfälle in der weiterführende Funktionen. Beispielswei- dies möglicherweise als Konflikt erkennen, generischen UI der EMF-Client-Plattform se lässt sich sowohl für Projekte als auch nur weil zufällig die gleiche Zeile in einer beschrieben. Diese lässt sich zwar auch für einzelne Elemente eine Historie anzei- Datei verändert wird. Aus Sicht des Mo- anpassen, der EMFStore kann aber auch gen. In dieser History-View können auch dells spricht aber möglicherweise nichts völlig unabhängig von dieser UI in exis- vergangene Versionen wiederhergestellt gegen das parallele Einfügen von zwei Re- tierende Tools integriert werden. Dazu werden. Alle beschriebenen Funktionen ferenzen. sind in diesem Abschnitt ein paar wichtige kann man natürlich auch ohne das gene- Das zweite Problem von SCM-Systemen Beispiele der EMFStore-API beschrieben. rische UI verwenden. ist das Auflösen von Konflikten. Gerade EMFStore verwaltet die Projekte auf dem XMI-Serialisierungen können mit traditio- Client in einem sogenannten „Workspace“. Was steckt dahinter? nellen SCMs nur äußerst mühsam und Den aktuellen Workspace kann man durch Die Anwendungsfälle und das Einsatzsze- fehlerträchtig zusammengeführt werden. folgenden Code abrufen: nario des EMFStore ähneln stark einem In vielen Tools ist das zeilenweise Mergen SCM-System wie SVN oder Git. Technisch für Benutzer ohnehin keine Option. Workspace workspace = WorkspaceManager. gesehen arbeitet der EMFStore jedoch Um dieses Problem zu lösen, nutzt der getInstance().getCurrentWorkspace(); fundamental anders. Wollte man EMF- EMFStore eine Eigenschaft von EMF-Enti- Der Workspace bietet den Einstiegspunkt Entitäten in einem SCM versionieren, so täten aus. EMF bietet die Möglichkeit, über in eine API, um beispielsweise Projekte lo- müssten diese dazu beispielsweise in XML sämtliche Änderungen an den Entitäten kal zu erzeugen: serialisiert werden. Beim Commit werden informiert zu werden. Der EMFStore zeich- dann die Dateien vor und nach der Ände- net die vorgenommenen Änderungen auf ProjectSpace projectSpace = workspace.cr eateLocalProject(“ProjectName”, “Project rung verglichen, um die Unterschiede zu dem Client zunächst lokal auf. Wird nun Description”); berechnen − das sogenannte „Diffing“. Die- ein Commit ausgelöst, muss kein Vergleich ses Vorgehen funktioniert im Wesentlichen mit der Server-Version der Entitäten vorge- „ProjectSpace“ ist dabei ein Verwal- zeilenweise. nommen werden. Durch das Aufzeichnen tungscontainer für Projekte. Zusätzlich zu Während sich SCMs für ihren Einsatz- der Änderungen ist bereits bekannt, was den Projektdaten, also den Entitäten/EOb- zweck − das Verwalten von Source Code lokal geändert wird. Beim Commit müssen jects, enthält er Meta-Informationen wie

22 |

iii iii iiiiii www.ijug.eu

den Projektnamen, die Version, die lokalen Fazit Änderungen etc. EMFStore ist ein Framework, um EMF-En- Usersession usersession = EMFStoreClientUtil. createUsersession(“super”, “super”, Die Zugehörigkeit von Entitäten zu titäten kollaborativ zu bearbeiten. Dabei “localhost”, 8080); einem Projekt ist über den Containment- nutzt er die Vorteile von EMF aus, beispiels- projectSpace.shareProject(usersession); Baum in EMF definiert, ein Projekt enthält weise die generische API und den Notifizie- also alle direkten Teile, Kinder des Projekts rungs-Mechanismus. EMFStore funktioniert Listing 1 und deren Nachfahren. Um Entitäten der damit prinzipiell mit allen EMF-Modellen.

Anwendung direkt als Kind in ein Projekt Der EMFStore arbeitet nicht wie existieren- List projectList = hinzuzufügen, genügt es folgenden Code de Source-Code-Management-Systeme auf workspace.getRemoteProjectList(usersession); aufzurufen: der Datei-Ebene, sondern versioniert die workspace.checkout(usersession, projectList.get(0)); Entitäten auf Modell-Ebene. Dies erlaubt projectSpace.getProject().getModelEle- eine präzisere Konflikterkennung sowie ein Listing 2 ments().add(someEObject); komfortableres Mergen. Alle Funktionen des EMFStore sind direkt per API ansprech- Fügt man später Kinder zu einem Element bar, damit können eigene Clients mit (oder EMFStore-Setup hinzu, das bereits Teil des Projekts ist, so auch ohne) Benutzeroberfläche leicht reali- werden diese Kinder automatisch auch siert werden. Für ein einfaches Test-Setup wird der EMFStore in eine Teil des Projekts. Das oben erstellte Projekt Mithilfe der generischen UI der EMF- Eclipse-Modeling-Edition-Instanz installiert. Im produkti- ist anfänglich nur lokal verfügbar, es kann Client-Plattform lassen sich die wichtigsten ven Einsatz kann der EMFStore natürlich auch „headless“ durch folgenden Aufruf an den Server über- Anwendungsfälle ohne zusätzlichen Auf- laufen. Nach dem Download der aktuellen Eclipse-Mode- tragen und damit anderen Clients zugäng- wand schnell testen. EMFStore und EMF ling-Edition [2] kann der EMFStore von der Update-Site [3] lich gemacht werden (siehe Listing 1). Client Platform stehen unter der Eclipse installiert werden. Für ein einfaches Setup installiert man Die User-Session bestimmt dabei, mit Public License. Quellcode, Releases und zunächst alle Features. Die Installation enthält damit auch welchem Benutzer und an welchen Ser- Dokumentation sind unter [5] verfügbar. gleich die generische Oberfläche der EMF Client Platform ver das Projekt übertragen wird. Um das Im nächsten Teil dieser Reihe wenden wir [4]. Nach der Installation wird Eclipse neu gestartet. Um Projekt an einem anderen Client anzufor- uns der UI genauer zu und beschreiben die den EMFStore zu testen, wird nun noch ein Modell benö- dern (Checkout), genügt folgender Code. EMF Client Platform im Detail. Dabei ist ins- tigt. Dazu kann entweder ein eigenes Modell verwendet Zunächst werden alle Projekte vom Server besondere interessant, wie diese an die ei- werden oder kann man alternativ auch auf das Beispiel- angefordert und dann (im Beispiel willkür- genen Bedürfnisse angepasst werden kann. Modell zurückgreifen (siehe [1]), das unter [8] herunterge- lich) das erste Projekt für den Checkout laden werden kann. ausgewählt (siehe Listing 2). Weitere Informationen Um ein EMF-Modell mit dem EMFStore zu nutzen, Wenn nun Änderungen am Projekt, also sollte zunächst eine Änderung am Generator-Modell vor- an einem der enthaltenen Elemente ausge- [1] http://eclipsesource.com/emftutorial genommen werden, die eine effiziente Speicherung der [2] http://www.eclipse.org/downloads/packages/ löst werden, beispielsweise „someElement. eclipse-modeling-tools/indigosr1 Entitäten erlaubt. Dazu öffnet man im Modell-Plug-in die setName(„newName“)“, dann werden diese [3] http://eclipse.org/emfstore/download.php Datei „*.genmodel“ aus dem Ordner „model“ und klickt den aufgezeichnet und können an den Server [4] http://eclipse.org/emfclient Wurzel-Knoten doppelt. Es öffnet sich die Properties-View. [5] http://eclipse.org/emfstore synchronisiert werden mit: [6] http://eclipsesource.com/en/services/eclipse- In dieser ändert man den Wert von „Containment Proxies“ training/eclipse-modeling/ von „false“ nach „true“. Nun kann der Modell-Code neu ge- projectSpace.commit(null, null, new NullPro- [7] Operation-based Model Evolution, Maximilian neriert werden mit Rechtsklick auf den Wurzelknoten im gressMonitor()); Kögel, Dr. Hut Verlag, ISBN: 978-3843900812 Generatormodel und durch Auswahl von „Generate Model [8] http://eclipsesource.com/blogs/wp-content/ uploads/2011/03/exampleSolution.zip Code“ und „Generate Edit Code“. Umgekehrt können Änderungen vom Ser- Als letzten Schritt müssen der EMFStore-Server und ein ver, das heißt von anderen Clients, mit fol- entsprechender Client mit dem erstellten Modell gestartet gendem Aufruf abgerufen werden: werden. Dazu legt man zunächst zwei neue Launch-Konfi- Jonas Helming gurationen unter „Eclipse-Application“ an. Man belässt alle projectSpace.update(); [email protected] Einstellungen außer dem Namen auf den Standardwerten Maximilian Kögel und ändert für den Server den Wert „Run as a product“ Mit den vier einfachen Funktionen „Share“, mkoegel@ eclipsesource.com auf dem Reiter „Main“ nach „org.unicase.emfstore.server“. „Checkout“, „Commit“ und „Update“ kann Durch Ausführen der Launch-Konfigurationen können nun eine Anwendung ihre Daten bereits eine Client-und die Server-Applikation gestartet werden. über einen Server synchronisieren. „Pro- Jonas Helming und Maximilian Die gestartete Client-Instanz führt alle anfangs genannten Kögel sind Eclipse-EMF/RCP- jectSpace“ bietet noch eine Reihe anderer Anwendungsfälle bereits aus. Ein Video-Tutorial dazu sowie Trainer und Consultants sowie Funktionen, um etwa Änderungen eines zu den ersten Schritten mit dem EMFStore ist online [5] zu Geschäftsführer der Eclipse- Projekts aus der Historie abzurufen oder Source München GmbH. Sie lei- finden. das Projekt zu einem bestimmten Zeit- ten die Eclipse-Projekte „EMFS- punkt in der Historie zurückzusetzen. tore“ und „EMF Client Platform“.

Java aktuell 3-2012 | 23 Performance

Plug-ins für die VisualVM entwickeln: die MemoryPoolView

Kirk Pepperdine, Java Champion und Performance-Expert

Die VisualVM ist eine Desktop-Anwendung, die viele JDK-Tools unter einer grafischen Oberfläche vereinigt und ein reiches Toolset für die Performance-Analyse von Java-Anwendungen bietet. Eine der heraus- ragenden Eigenschaften der VisualVM ist ihre Erweiterbarkeit. Um zu demonstrieren, wie leicht die VisualVM um zusätzliche Fähigkeiten erweitert werden kann, wird in diesem Artikel schrittweise ein Plug-in entwickelt. Dieses wird Informationen über den Code Cache der JVM aus einer MemoryMXBean gewinnen und diese grafisch in einer Zeitleiste darstellen.

Zum Hintergrund: Die „Just In Time (JIT)“- eine sinnvolle Auswertung der Daten wäre 2 dargestellt ist. Nachfolgend ist seine Er- Kompilierung übersetzt Java-Byte-Code jedoch eine grafische Darstellung in Form stellung beschrieben. zur Laufzeit. Dadurch bekommt der Com- einer Zeitleiste sinnvoll. Um dies zu ver- Ein VisualVM-Plug-in ist nichts anderes piler die einmalige Gelegenheit, Informati- wirklichen, hat der Autor ein eigenes Visu- als ein NetBeans-Plug-in und damit ein onen über die Laufzeitumgebung und die alVM-Plug-in entwickelt, das in Abbildung spezielles JAR-Archiv. Zur Erstellung des Dynamik der Anwendung in die Optimie- rung einfließen zu lassen. Dies führt zu ei- ner massiven Beschleunigung der Anwen- dung, die zum Teil die Performance von entsprechendem C/C++ Code übertreffen kann. Der durch den JIT-Compiler erzeug- te, native Code wird in einem Memory- Pool gespeichert, der als „Code-Cache“ bekannt ist. Ist dieser voll, stellt der JIT- Compiler seine Arbeit ein. Wenn dies pas- siert, wird unsere Applikation langsamer und verbraucht mehr und mehr CPU-Zeit. Bedenkt man die Wichtigkeit des Code- Cache für die Performance, ist es über- raschend, dass es kaum Werkzeuge für Abbildung 1: VisualVM MBean dessen Überwachung gibt. Auf der ande- ren Seite ist die Nachfrage nach solchen Werkzeugen klein, weil vielen die wichtige Rolle des Code-Cache für die Performance der Anwendung nicht voll bewusst ist. Es ist ebenfalls überraschend, dass die JVM selbst nicht viel Einblick in diese geheim- nisvollen internen Abläufe bietet. Immer- hin wird der Code-Cache aber durch eine Instanz einer „java.lang.management. MemoryMXBean“ überwacht. Diese gibt uns einen Einblick, wie viel von diesem Speicherpool durch die JIT-Kompilierung genutzt wird. Abbildung 1 zeigt die Da- ten, wie sie durch das „MBeans Browser VisualVM“-Plug-in angezeigt werden. Das MBeans-Browser-Fenster bietet eine einfache, rein textbasierte Darstel- lung der Attribute des Memory-Pools. Für Abbildung 2: Memory-Pool-Visualisierung

24 |

iii iii iiiiii www.ijug.eu

public class Installer extends ModuleInstall { lus einer Anwendung reagieren. Auch unser ViewsManager nach Views, die für die Dar- MemoryPoolView benötigt einen eigenen stellung von Daten aus dieser Quelle regis- @Override Installer, um den eigenen Lebenszyklus zu triert sind. Daraufhin fragt der DataSource- public void restored() { verwalten. Der Installer wird am einfachsten ViewsManager jede der Views, ob sie die MemoryPoolViewProvider.initialize(); } mit dem Menüpunkt „New –> Module Ins- Daten der in Frage kommenden DataSour- taller“ erstellt. Der Installer wird dabei auch ce darstellen kann. Alle ViewProvider, die @Override automatisch im Manifest des Moduls regis- das bejahen, bekommen die Datenquelle public void uninstalled() { triert, sodass er von der Laufzeitumgebung übergeben und liefern dafür eine View MemoryPoolViewProvider.unregister(); gefunden wird. Listing 1 zeigt, wie wir den zurück. Die VisualVM erstellt für jede der } generierten Quellcode erweitern. Views einen neuen Reiter. Für die Darstel- Der Installer überschreibt die zwei lung der Daten ist von diesem Punkt an der } wichtigsten Methoden „restored()“ und ViewProvider zuständig. Listing 1: Erweiterter Quellcode „uninstalled()“. Diese Methoden werden Listing 2 zeigt den Quellcode, den der ViewProvider in Abhängigkeit vom Le- benszyklus registriert und deregistriert.

class MemoryPoolViewProvider extends DataSourceViewProvider { Die Methoden „supportsViewFor()“ und „createView()“ werden bei Bedarf vom Da- private static DataSourceViewProvider instance=new MemoryPoolViewProvider(); taSourceViewsManager aufgerufen. Bei der „supportsViewFor()“-Methode wird @Override ein Application-Objekt übergeben. In un- public boolean supportsViewFor(final Application application) { serem Fall geben wir als Antwort einfach return true; } „true“ zurück, da wir alle Arten von Anwen- dungen unterstützen. Für andere Zwecke @Override können wir hier gegebenenfalls weitere public synchronized DataSourceView createView(final Application application) { Tests durchführen, um zu entscheiden, ob return new MemoryPoolView(application); wir eine View anbieten möchten. } Nachdem der Provider implementiert static void initialize() { ist, wird die View gebaut und mit der Ap- DataSourceViewsManager.sharedInstance().addViewProvider(instance, Application.class); plikation verbunden. Dabei sind zwei The- } men wichtig:

static void unregister() { DataSourceViewsManager.sharedInstance().removeViewProvider(instance); • Wie sind Views aufgebaut, die in der Vi- } sualVM dargestellt werden können? } • Wie kann man die benötigten Daten vom Application-Objekt erhalten? Listing 2: DataSourceViewProvider Wir beginnen mit der DataSourceView, die Plug-ins kommt die NetBeans-IDE zum Ein- beim Start und beim Beenden der Anwen- vom Aufruf „MemoryPoolViewProvider. satz. Man könnte theoretisch auch andere dung aufgerufen. In der Implementierung createView()“ zurückgeliefert werden muss. Entwicklungstools verwenden, die Net- von „restored()“wird der MemoryPoolView- Beans-IDE bietet jedoch Vorlagen für das Provider beim DataSourceViewsManager Die Anatomie einer VisualVM-View Erstellen und Testen der Erweiterung und registriert. Der DataSourceViewsManager Abbildung 2 zeigt, dass jede einzelne View erleichtert so die Entwicklung. Zunächst verwaltet DataSourceView-Instanzen. Da- in einem eigenen Reiter enthalten ist. Je- muss dazu die VisualVM (hier Version 1.3.3) her muss der MemoryPoolViewProvider der dieser Reiter hat einen Titel und ein beim Plattform-Manager als Anwendungs- diese Klasse erweitern. Icon. Darüber hinaus sieht das Layout jeder plattform registriert werden. Als Nächstes Für ein besseres Verständnis dafür, wie View weitestgehend frei aus. Obwohl alle erzeugt man das neue NetBeans-Modul- das funktioniert, ist es wichtig, das Kon- Views daraufhin optimiert werden können, Projekt namens „MemoryPoolView“. Im zept der DataSources in der VisualVM zu die dargestellte Information optimal dar- Projektassistenten muss dabei die neu re- verstehen. Wie der Name vermuten lässt, zustellen, gibt es einige Layout-Vorgaben. gistrierte VisualVM-Plattform ausgewählt füttert eine DataSource die VisualVM mit Der Inhalt des Panels ist in einen Haupt- werden. Sobald das erledigt ist, kann die (Performance-)Daten. VisualVM wird be- bereich oben und vier Slots für die Dar- Implementierung beginnen. reits mit einer Reihe von fertigen Daten- stellung von DetailViews unterteilt. Der quellen ausgeliefert, darunter „SnapShot“, Hauptbereich wird üblicherweise dafür Der Lebenszyklus eines NetBeans-Moduls „Host“ und, für uns wichtig, „Application“. verwendet, Einstellungen vorzunehmen, NetBeans-Module können mit einem Mo- Wenn der Anwender eine DataSource öff- während die Daten selbst in den vier üb- dule-Installer auf Ereignisse im Lebenszyk- net, fragt die VisualVM den DataSource- rigen Darstellungsbereichen präsentiert

Java aktuell 3-2012 | 25 Performance

werden. In der MemoryPoolView enthält class MemoryPoolView extends DataSourceView { jeder Quadrant die Darstellung eines Me- mory-Pools. Unten rechts wird eine Zeit- public MemoryPoolView(Application application) { leiste der Code-Cache-Zähler angezeigt. super(application,“Memory Pools“, new ImageIcon(ImageUtilities.loadImage(IMAGE_PATH, true)).getImage(), Auch in der MonitorView sind alle vier Fel- 60, false); der des Rasters belegt. } In unserem Hauptdarstellungsbereich @Override sind vier Checkboxen angeordnet. Viel- protected DataViewComponent createComponent() { leicht hat mancher diese (optional ange- //Data area for master view: JEditorPane generalDataArea = new JEditorPane(); zeigten) Checkboxen bereits in anderen generalDataArea.setBorder(BorderFactory.createEmptyBorder(7, 8, 7, 8)); Views bemerkt. Das Threads-Plug-in zum Beispiel enthält zwei Checkboxen, eine für //Master view: jeden der zwei enthaltenen Views. Diese DataViewComponent.MasterView masterView = Checkboxen kontrollieren, ob die zugeord- new DataViewComponent.MasterView(„Memory Pools“, „View of Memory Pools“, generalDataArea); nete View dargestellt wird oder nicht. Der Titel und das Icon von Memory- //Configuration of master view: PoolView werden im Konstruktor über- DataViewComponent.MasterViewConfiguration masterConfiguration = geben. Der ViewProvider gibt in seiner new DataViewComponent.MasterViewConfiguration(false); „createView()“-Methode eine DataSource- View zurück. Daher muss MemoryPool- //Add the master view and configuration view to the component: dvc = new DataViewComponent(masterView, masterConfiguration); View diese Klasse erweitern. MasterView und DetailsView werden in einem Aufruf // the magic that gets a handle on all instances of MemoryPoolMXBean der createComponent() erzeugt, wie in Lis- findMemoryPools(); ting 3 gezeigt. Das letzte visuelle Detail ist die Positio- MemoryPoolPanel panel; for ( MemoryPoolModel model : models) { nierung. Eines der Argumente im Konst- panel = new MemoryPoolPanel(model.getName()); ruktor ist die magische Zahl „60“. VisualVM model.registerView(panel); sortiert die Reiter nach den Benutzerein- Point position = calculatePosition(model.getName()); stellungen. Die magische Nummer schlägt dvc.addDetailsView(new DataViewComponent.DetailsView( die Position „60“ vor. Das heißt, dass jeder model.getName(), „memory pool metrics“, position.y, panel, null), position.x); Tab mit einer kleineren magischen Rück- } fallposition links davon positioniert wird; return dvc; Views mit einer größeren Nummer landen } rechts von unserem Tab. Um eine Details- private Point calculatePosition(String name) { View zu positionieren, sind ein Quadrant return positions.get(name); } und ein Slot anzugeben. In der DataView- Component werden zu diesem Zweck die static { Konstanten „TOP_LEFT“, „BOTTOM_RIGHT“ positions = new HashMap(); etc. angeboten. Die Position wird verwen- positions.put( „Par Eden Space“, new Point(DataViewComponent.TOP_LEFT,10)); det, wenn zwei DetailsViews im selben positions.put( „PS Eden Space“, new Point(DataViewComponent.TOP_LEFT,10)); positions.put( „Eden Space“, new Point(DataViewComponent.TOP_LEFT,10)); Quadranten liegen. Abbildung 2 zeigt, positions.put( „G1 Eden“, new Point(DataViewComponent.TOP_LEFT,10)); dass die Young Generational Spaces bei- positions.put( „Par Survivor Space“, new Point(DataViewComponent.TOP_LEFT,20)); de in „TOP_LEFT“ platziert wurden. Eden positions.put( „PS Survivor Space“, new Point(DataViewComponent.TOP_LEFT,20)); Space hat die Position „10“ und der Survi- positions.put( „Survivor Space“, new Point(DataViewComponent.TOP_LEFT,20)); vor Space die Position „20“. All das wird in positions.put( „G1 Survivor“, new Point(DataViewComponent.TOP_LEFT,20)); MemoryPoolView konfiguriert (siehe Lis- positions.put( „CMS Old Gen“, new Point(DataViewComponent.TOP_RIGHT,10)); positions.put( „PS Old Gen“, new Point(DataViewComponent.TOP_RIGHT,10)); ting 3). positions.put( „Tenured Gen“, new Point(DataViewComponent.TOP_RIGHT,10)); positions.put( „G1 Old Gen“, new Point(DataViewComponent.TOP_RIGHT,10)); Die Anbindung der Daten positions.put( „CMS Perm Gen“, new Point(DataViewComponent.BOTTOM_LEFT,10)); Nachdem das Basislayout eingerichtet ist, positions.put( „Perm Gen“, new Point(DataViewComponent.BOTTOM_LEFT,10)); werden die darzustellenden Daten bereit- positions.put( „PS Perm Gen“, new Point(DataViewComponent.BOTTOM_LEFT,10)); positions.put( „G1 Perm Gen“, new Point(DataViewComponent.BOTTOM_LEFT,10)); gestellt. Genau wie für den Aufbau der positions.put( „Code Cache“, new Point(DataViewComponent.BOTTOM_RIGHT,10)); Views unterstützt die VisualVM bei der } Daten-Akquise und -Behandlung. In un- serem Fall brauchen wir einen Handle für Listing 3: MemoryPoolView alle Instanzen von MemoryPoolMXBean.

26 |

iii iii iiiiii www.ijug.eu

VisualVM ermöglicht den Zugriff ohne die protected void findMemoryPools() { Notwendigkeit, komplexen JMX Client- try { code zu erstellen. Listing 4 zeigt, wie wir MBeanServerConnection conn = getMBeanServerConnection(); die „findMemoryPools()”-Methode unser- ObjectName pattern = new ObjectName(“java.lang:type=MemoryPool,name=*”); for (ObjectName name : conn.queryNames(pattern, null)) { er MemoryPoolView implementieren. initializeModel(name, conn); Die Handles für MXBeans liefert eine } MBeanServerConnection. Die Serverver- } catch (Exception e) { bindung selbst stammt von einem JmxMo- LOGGER.throwing(MemoryPoolView.class.getName(), “Exception: “, e); del, das wiederum von der JmxModelFac- } } tory kommt. Diese gesamte Infrastruktur wird von der VisualVM bereitgestellt. Es private MBeanServerConnection getMBeanServerConnection() { sind lediglich die Kriterien zu definie- JmxModel jmx = JmxModelFactory.getJmxModelFor((Application)super.getDataSource()); ren, nach denen die Server-Verbindung return jmx == null ? null : jmx.getMBeanServerConnection(); durchsucht werden soll. Das erfolgt über } ein Objektnamens-Pattern. Abbildung 1 zeigt, dass der Objektname, der verwen- Listing 4: Ein Handle für alle MemoryMXBean-Instanzen det wird, um Instanzen von Memory- PoolMXBean zu binden, in etwa so aussieht: „java.lang:type=MemoryPool,name=»CMS Old Gen»“. Das Namens-Attribut können public class MemoryPoolPanel extends JPanel implements MemoryPoolModelListener { wir dabei mit Wildcards anpassen, um alle Speicherpools zu finden. Jetzt müssen wir private SimpleXYChartSupport chart; nur noch die Datenpunkte aus den erhalte- nen Beans abfragen, um diese anzuzeigen. public MemoryPoolPanel(String name) { setLayout(new BorderLayout()); SimpleXYChartDescriptor description = SimpleXYChartDescriptor.bytes(0, Charting mit VisualVM 20, 100, false, 1000); Abbildung 2 zeigt die Daten der MXBean description.setChartTitle(name); als XY-Plot. Wenn das Plug-in läuft, wird description.setDetailsItems(new String[3]); der Graph alle zwei Sekunden aktualisiert.

description.addLineItems(“Configured”); So komplex die Graphen auch aussehen, description.addLineItems(“Used”); die mitgelieferten VisualVM Charts sind er- staunlich einfach zu verwenden. description.setDetailsItems(new String[]{“Size current”,”configured”, MemoryPoolView verwendet von den “occupancy”}); drei verschiedenen Graph-Typen „Dezimal“, description.setXAxisDescription(“Time”); „Prozent“ und „Byte“ den Byte-Typ. Wir bau- description.setYAxisDescription(“Memory Pool (K)”); en unser Chart unter Verwendung des vor- chart = ChartFactory.createSimpleXYChart(description); gegebenen Builder-Patterns (siehe Listing 5). Der Prozess startet durch die Erstellung add(chart.getChart(),BorderLayout.CENTER); einer Beschreibung unseres Charts. Die ini- tialen Parameter sind „Minimalwert“, „Ma- } ximalwert“, „Anfangs-Y-Begrenzung“, ein @Override Bool-Wert, um festzulegen, ob das Chart public void memoryPoolUpdated(MemoryPoolModel model) { versteckt werden kann (zeigt eine Check- long[] dataPoints = new long[2]; box in der MasterView an), sowie die Größe dataPoints[0] = model.getCommitted(); des Puffers, der die Datenpunkte enthält. dataPoints[1] = model.getUsed(); chart.addValues(System.currentTimeMillis(), dataPoints); Dieser Beschreibung fügen wir einen Titel und die Labels für die derzeitige Größe, String[] details = new String[3]; Voreinstellung und Belegung sowie Labels details[0] = Long.toString(model.getCommitted()); für die X- und Y-Achse hinzu. Dann ergän- details[1] = Long.toString(model.getMax()); zen wir noch eine Linie für die Belegung details[2] = Long.toString(model.getUsed()); chart.updateDetails(details); und derzeit konfigurierte Größe. Danach } müssen wir lediglich noch die ChartFacto- } ry anweisen, unser Chart zu erstellen. Im abschließenden Schritt wird das Mo- del mit der View verbunden. Wir brauchen Listing 5: MemoryPoolPanel einen Timer, um das Chart in regelmäßigen

Java aktuell 3-2012 | 27 Performance

Abständen zu aktualisieren. Auch hier hilft uns VisualVM durch die Bereitstellung ei- class MemoryPoolModel implements MBeanCacheListener { ner CachedMBeanServerConnection. Eine public MemoryPoolModel(final ObjectName mbeanName, final JmxModel model, CachedMBeanServerConnection speichert final MBeanServerConnection mbeanServerConnection) throws die Werte aus einer MBeanServerConnec- Exception { this.mbeanName = mbeanName; tion zwischen. Ebenso verfügt sie über ei- this.mbeanServerConnection = mbeanServerConnection; nen Timer, der in festgelegten Intervallen CachedMBeanServerConnectionFactory.getCachedMBeanServerConnection(model, das „Flushen“ des Cache auslöst. Dies aktu- 2000).addMBeanCacheListener(this); alisiert den Cache und benachrichtigt an- name = mbeanServerConnection.getAttribute(mbeanName, “Name”).toString(); schließend alle MBeanCacheListener über type = mbeanServerConnection.getAttribute(mbeanName, “Type”).toString(); die Aktualisierung. Wir müssen lediglich } die im Interface vorgegebene „flushed()“- @Override Methode implementieren. Wenn flushed() public void flushed() { aufgerufen wird, graben wir uns durch die try { CompositeData, die alle Datenwerte bün- CompositeData poolStatistics = (CompositeData)mbeanServerConnection. deln, die wir benötigen (siehe Listing 6). getAttribute(mbeanName, “Usage”); if ( poolStatistics != null) { Zum Schluss müssen wir uns noch um CompositeType compositeType = poolStatistics.getCompositeType(); die Aktualisierung des Charts kümmern. if ( compositeType != null) { Sobald der Cache aktualisiert wurde, mel- Collection keys = compositeType.keySet(); det das Model der View die Verfügbarkeit for ( String key : compositeType.keySet()) { frischer Daten. Die View kann diese Daten if ( key.equals(“committed”)) this.committed = (Long)poolStatistics.get(“committed”); dann aus dem Model abfragen. Um Werte else if ( key.equals(“init”)) hinzuzufügen, müssen wir sie in ein „long[ ]“ this.initial = (Long)poolStatistics.get(“init”); packen und sie dann dem Chart weiterge- else if ( key.equals(“max”)) ben. Die Details werden nach demselben this.max = (Long)poolStatistics.get(“max”); Muster aktualisiert (siehe Listing 7). else if ( key.equals(“used”)) this.used = (Long)poolStatistics.get(“used”); else Fazit LOGGER.warning(“Unknown key: “ + key); Die VisualVM bietet eine Menge Unter- } stützung bei der Visualisierung von Perfor- tickleListeners(); mance-Daten. Unser Beispiel deckt dabei } } nur einen kleinen Teil der verfügbaren Un- } catch (Throwable t) { terstützung ab. So bietet die VisualVM zum LOGGER.throwing(MemoryPoolModel.class.getName(), “Exception recovering data from Beispiel auch Unterstützung beim Erstel- MemoryPoolMXBean “, t); len von Snapshots. Der hier vorgestellte } MemoryPoolView ist unter http://java.net/ } projects/memorypoolview verfügbar.

Aus dem Amerikanischen übersetzt von Anton Epple, http://eppleton.de Listing 6: MBeanCacheListener

Kirk Pepperdine http://kirk.blog-city.com/

Kirk Pepperdine beschäftigte public void memoryPoolUpdated(MemoryPoolModel model) { sich viele Jahre mit Hochleis- long[] dataPoints = new long[2]; tungssystemen und verteilten dataPoints[0] = model.getCommitted(); Anwendungen. Er ist heute auf dataPoints[1] = model.getUsed(); Java fokussiert mit dem Ziel, die chart.addValues(System.currentTimeMillis(), dataPoints); Performance in jeder Phase des Projekt-Lebenszyklus zu verbes- String[] details = new String[3]; sern. Aktuelles über Werkzeuge details[0] = Long.toString(model.getCommitted()); und Techniken zum Thema Java detailss[1] = Long.toString(model.getMax()); Performance Tuning vermittelt details[2] = Long.toString(model.getUsed()); chart.updateDetails(details); er in seinem Blog (http://kirk. } blog-city.com) und auf der Web- seite „Java Performance Tuning“ (http://www.javaperformance- tuning.com). Listing 7: Aktualisieren des Chart

28 |

iii iii iiiiii www.ijug.eu

Apache Camel Security – Payload Security

Dominik Schadow, Trivadis GmbH

Mit Apache Camel steht Java-Entwicklern ein mächtiges Open-Source-Integrations-Framework zur Verfügung. Es können unterschiedlichste Systeme, von Datenbanken über Messaging-Systeme bis hin zu Web-Services, über Routen integriert werden. Bei der Übertragung sensibler Daten steht der Entwickler dann vor der Aufgabe, diese entsprechend zu schützen. Gleichzeitig sollen auch nur berechtigte Benutzer überhaupt Zugriff auf bestimmte Routen erhalten. Der Artikel zeigt die verschiedenen Sicherungsmöglich- keiten von Camel-Routen auf.

Apache Camel [1] stellt zur Sicherung von das von Passwörtern in Property-Datei- Das Beispielprojekt Routen bereits out-of-the-box verschiede- en oder die Konfiguration der Transport Camel-Projekte, ob gesichert oder nicht, ne Komponenten bereit und ist gleichzei- Layer Security (TLS) in Camel. Bei Pass- sind dank der Maven Camel Archetypes tig durch weitere Security-Frameworks wie wörtern funktioniert dies ähnlich wie [7] sehr schnell und einfach aufgesetzt. Als Apache Shiro und Spring Security erwei- in Spring mit Jasypt [3], bei TLS hilft die Ausgangsbasis kommt hier der Archetyp terbar. Die Sicherheit von Camel und der Verwendung der JSSE Utility [4]. „camel-archetype-spring“ zum Einsatz. Camel-Routen lässt sich dabei grob in die Ziel des Beispielprojekts ist es, eine vor- folgenden vier Kategorien [2] einteilen: • Endpoint Security handene und völlig ungesicherte Camel- Die Endpunkte wie CXF oder auch Jet- Route (findUserData) auf ausgewählten • Configuration Security ty können auf verschiedene Arten gesi- Abschnitten der Route zu sichern (siehe • Endpoint Security chert werden, beispielsweise durch die Abbildung 1). (Component Security) Verwendung von Interzeptoren oder Gesichert werden die Daten immer • Route Security durch andere, von der Komponente an- nach der „UserDataBean“, vor dem Auf- • Payload Security gebotenen Möglichkeiten. Aus diesem ruf des Web-Service „CategoryEndpoint“. Grund wird Endpoint Security oft auch Das bedeutet, dass der Request an diesen Alle genannten Kategorien lassen sich be- als „Component Security“ bezeichnet. Web-Service auf unterschiedliche Arten liebig miteinander kombinieren. Configu- • Route Security gesichert ist, die Response der Über- ration Security und Endpoint Security sind Hier dreht sich alles um die Authentifi- sichtlichkeit halber hingegen nicht. Diese auch außerhalb der Camel-Welt bekannt, zierung und Autorisierung. Verwendet könnte genauso wie der Request gesichert der Fokus dieses Artikels liegt deshalb auf werden können dabei zwei bekannte werden, mit entsprechend vertauschten der Kategorie „Payload Security“. Ein Folge- Frameworks: Apache Shiro und Spring Ver- und Entschlüsselungs-Rollen. artikel widmet sich dann der Route Secu- Security. Mehr zur Route Security erfah- Im Beispiel sollen möglichst viele un- rity. Bei diesen beiden Kategorien sind im ren Sie in der nächsten Ausgabe. terschiedliche Sicherungsvarianten von Apache-Camel-Umfeld einige Besonder- • Payload Security Camel zum Einsatz kommen, was in der heiten vorhanden. Die beiden anderen Ka- Diese Kategorie kümmert sich um die Praxis so sicherlich nicht gemacht wird. tegorien werden der Vollständigkeit halber Nachrichtensicherheit, also die Ver- Das Beispiel verfügt dazu über einen CXF- hier nur kurz beschrieben. schlüsselung oder Signierung der Nutz- Endpoint !cxf:bean:userDataEndpoint!, der daten. Hierfür stehen zwei Camel-Da- zur Unterscheidung der unterschiedlich • Configuration Security tenformate zur Verfügung: das XML- gesicherten Routen am Ende über sechs Hierunter fällt das Sichern sensibler Be- Security-Data-Format [5] und das allge- verschiedene Operationen verfügt. Aus- reiche der Camel-Konfiguration, etwa meinere Crypto-Data-Format [6]. gangsbasis ist die ungesicherte Web-Ser-

Java aktuell 3-2012 | 29 Integrations-Framework

Abbildung 1: Die Camel-Route des Beispielprojekts im Überblick

vice-Operation „findUserData(int ssn)“, die Route mit digital signierter Nachricht. Der stammt vom Apache-XML-Security-Projekt zu einer gegebenen Sozialversicherungs- Web-Service umfasst so am Ende sechs „Santuario“ [9]. nummer die Benutzerdaten zurückliefert. Operationen: die ungesicherte, vier ver- Camel selbst bietet dabei nur eine Un- In einem normalen Projekt würde man schlüsselte (zwei herkömmlich und zwei termenge der XML-Security-Möglichkeiten diese Route entsprechend direkt absi- mit XML, jeweils symmetrisch und asym- an, XML-Signatures sind (derzeit?) nicht chern. Damit der Unterschied zwischen metrisch verschlüsselt) sowie eine digital nativ enthalten (siehe Kasten „Asymmetri- den verschiedenen Sicherungsmethoden signierte Operation. sche und symmetrische XML-Verschlüsse- deutlicher wird, ist das Beispiel um weitere Die folgenden Listings zeigen nur Aus- lung mit Camel“). Apache Santuario selbst Methoden ergänzt. Ein an die Operation schnitte des Source-Codes. Das vollständi- unterstützt aber auch die XML-Signatures, angehängtes „Enc“, zum Beispiel bei „find- ge Beispielprojekt steht auf GitHub unter eine selbstentwickelte Integration in eine UserDataAsymEncXML()“, liefert die Daten https://github.com/dschadow/CamelSe- Route ist also denkbar. asymmetrisch verschlüsselt zurück. Im Fall curity im SpringSource-Tool-Suite-Projekt Um die XML-Security-Features in Ca- von XML im XMLSecurity-Data-Format, an- „CamelPayloadSecurity“. mel nutzen zu können, muss das Artefakt dernfalls im Crypto-Data-Format. Die Endung „Sign“, also bei „findUser- Das XMLSecurity-Data-Format DataSign()“, steht entsprechend für eine Der große Vorteil des XMLSecurity-Data- Asymmetrische und symmetrische Formats (und der XML-Encryption all- XML-Verschlüsselung mit Camel gemein) besteht darin, dass neben der Bis einschließlich Version 2.8 unter- Vorsicht geboten: vollständigen Nachricht auch nur einzel- stützt Camel nur die symmetrische Unsichere XML-Verschlüsselung ne Elemente oder Elementinhalte gezielt Verschlüsselung innerhalb des XMLS- Im Oktober 2011 meldete die Ruhr- verschlüsselt werden können. Hierbei be- ecurity-Data-Formats. Zur Verfügung Universität Bochum [15], dass der stimmen XPath-Ausdrücke, welches Ele- stehen dabei die Algorithmen „Triple- XML-Encryption-Standard erfolgreich ment, beziehungsweise Elemente oder DES“ und „AES“ (128, 192 und 256 Bit gebrochen werden konnte. Da hierbei auch welcher Element-Inhalt mit einbe- Länge). Seit Version 2.9 kann auch die W3C-Empfehlung selbst, und nicht zogen werden sollen. Gleichzeitig lassen eine asymmetrische Verschlüsselung nur eine Implementierung, für Prob- sich so auch unterschiedliche Fragmente verwendet werden. Dabei wird, wie leme sorgt, ist kein einfacher Work- mit unterschiedlichen Schlüsseln und/ üblich, ein symmetrischer Schlüssel around möglich. oder Algorithmen sichern, sodass ein (ein sogenannter „Content Encryp- Allerdings werden mit der sich zurzeit Empfänger nur einzelne für ihn verschlüs- tion Key“) verwendet. Dieser wird in der Verabschiedung befindlichen selte Bestandteile der Nachricht wieder anschließend mit dem öffentlichen XML-Encryption-1.1-Empfehlung ge- zu Klartext entschlüsseln kann. Lediglich Schlüssel des Empfängers verschlüs- zielt diese Probleme angegangen. das Verschlüsseln von Attributen ist nicht selt (also ein Key Encryption Key) und Wer sich jetzt in Projekten für die XML- möglich. so zusammen mit der verschlüsselten Sicherheit entscheidet beziehungs- Diese Eigenschaften sind keine Erfin- Nachricht an den Empfänger übertra- weise entscheiden muss, sollte daher, dung von Apache Camel. Stattdessen gen. Für die asymmetrischen Verfah- sobald entsprechende aktualisierte wird hier auf die W3C-Empfehlung zur ren stehen dabei die Algorithmen RSA Implementierungen vorliegen, den XML-Encryption [8] zurückgegriffen (siehe 1.5 (RSA_v1dot5) sowie RSA OAEP Wechsel angehen. Kasten „Unsichere XML-Verschlüsselung“). (RSA_OAEP) zur Verfügung. Die Implementierung dieser Empfehlung

30 |

iii iii iiiiii www.ijug.eu

„camel-xmlsecurity“ zur Liste der Abhän- gigkeiten in der Maven-POM-Datei hinzu- org.apache.camel camel-xmlsecurity gefügt werden (siehe Listing 1). 2.9.0 Symmetrische Verschlüsselung Die Verschlüsselung mit dem XMLSecurity- Listing 1 Data-Format ist Camel-typisch sehr einfach, vor allem bei der Verwendung von symmet- rischer Kryptografie. Durch die Verwendung der von Camel gesetzten Standardwerte (Algorithmus „Triple-DES“, Pass-Phrase „Just another 24 Byte key“, Verschlüsselung der Stelle der Route wie folgt aus: Listing 2

In der Realität sollte zumindest ein eigenes Attribut Default Beschreibung Passwort gesetzt sein. Noch komplexer wird die Route, wenn weitere Attribute secureTag null XPath des zu ver-/entschlüsselnden Elements, „null“ verschlüsselt die vollständige Nachricht. vom Standard abweichen und beispiels- weise nur ein bestimmtes Element ver- secureTagContents false „true“ verschlüsselt nur den Elementinhalt, „false“ das komplette Element. Hat nur Auswirkungen bei Verwen- schlüsselt werden soll (siehe Tabelle 1 und dung des secureTag-Attributs. Listing 2). passPhrase null Passphrase für die Ver-/Entschlüsselung. Ohne Angabe Natürlich kann man die Nutzdaten an wird die Default–Pass-Phrase verwendet. Die Pass- jedem beliebigen Punkt der Route ver- und Phrase muss zum Algorithmus und dessen Schlüssel- entschlüsseln. So lassen sich auch unter- länge passen. schiedliche Routenabschnitte oder Nach- xmlCipherAlgorithm TRIPLEDES Einer der folgenden symmetrischen Verschlüs- richtenteile mit verschiedenen Schlüsseln selungsalgorithmen für den Nachrichteninhalt: XMLCipher.TRIPLEDES (http://www.w3.org/2001/04/ oder Algorithmen sichern. Nur der jewei- xmlenc#tripledes-cbc), lige Empfänger kann dann sein Fragment XMLCipher.AES_128 (http://www.w3.org/2001/04/ entschlüsseln und die Daten verarbeiten. xmlenc#aes128-cbc), Egal an welchem Punkt der Route, Listing XMLCipher.AES_192 (http://www.w3.org/2001/04/ xmlenc#aes192-cbc), 3 zeigt, wie die Daten entsprechend ent- XMLCipher.AES_256 (http://www.w3.org/2001/04/ schlüsselt werden. xmlenc#aes256-cbc) Wie man sieht, muss das Attribut namespaces none Namespace(s) verwendet im secureTag-Attribut. „xmlCipherAlgorithm“ auch bei der Ent- schlüsselung angegeben werden. An- Tabelle 1: XML-Encryption-Attribute (symmetrisch/ asymmetrisch) dernfalls wird der Camel-Standard-Algo- rithmus (TripleDES) verwendet und nicht etwa das Attribut „algorithm“ aus dem Attribut Default Beschreibung „EncryptedData“-Block geladen. Der Ent- schlüsselungsversuch des Beispiels (Route recipientKeyAlias none Schlüssel-Alias zur Identifikation im Schlüsselspeicher. „encryptSymmetric“) würde dann mit ei- keyCipherAlgorithm none Asymmetrischer Algorithmus zur Ver-/Entschlüsselung ner Fehlermeldung abbrechen. des Schlüssels aus folgender Liste: XMLCipher.RSA_ v1dot5 (http://www.w3.org/2001/04/xmlenc#rsa–1_5), Asymmetrische Verschlüsselung XMLCipher.RSA_OAEP (http://www.w3.org/2001/04/ xmlenc#rsa-oaep-mgf1p) In der Praxis wird man häufiger auf die asymmetrische Kryptografie zurückgrei- keyOrTrustStorePara- none Verweist auf das KeyStoreParameters-Element mit den fen, allein schon wegen des deutlich ein- meters notwendigen Key-/TrustStore-Informationen. facheren Schlüsselaustausches mit den beteiligten Partnern. Hier müssen dann Tabelle 2: XML-Encryption-Attribute (asymmetrisch) zwei Algorithmen angegeben werden:

Java aktuell 3-2012 | 31 Integrations-Framework

„xmlCipherAlgorithm“ zur symmetrischen Verschlüsselung der Nutzdaten (Content Encryption Key) und „keyCipherAlgorithm“ symmetrischen Schlüssels (Key Encryption Key) aus dem Schritt zuvor. Die asymmetri- sche Verschlüsselung ist damit in Wahrheit Listing 3 eine hybride Verschlüsselungsform. Wie Listing 4 zeigt, sind dabei auch einige Kon- figurationsparameter mehr notwendig. Wichtig ist die Verknüpfung der soge- nannten „keyOrTrustStoreParametersId“ mit dem „keyStoreParameters“-Element innerhalb des Camel-Kontexts. Dieses Ele- selbstgeneriert mit dem Java-KeyTool. Da- bei sind sowohl der private als auch der öffentliche Schlüssel im selben KeyStore gespeichert. In der Praxis würde man diese Listing 4 beiden Schlüssel in unterschiedlichen KeyS- tores speichern und mit verschiedenen Passwörtern sichern, beziehungsweise wür- de man bei fremden Empfängern ohnehin den sein, damit die Entschlüsselung mit „unmarshall“ durchgeführt werden kann (siehe Listing 5). Auch hier ist das (selbe) Listing 5 „keyStoreParameters“-Element zwingend erforderlich. Typische Fehler und Probleme, die auf- org.apache.camel treten können: Wird für die Verschlüsselung camel-crypto ein nicht vorhandener Algorithmus ange- 2.9.0 geben, lautet die Fehlermeldung: „java. lang.NullPointerException: Transformation unexpectedly null…“. Vor allem bei der XML-basierten Konfiguration (Spring) gilt Listing 6 es zu beachten, dass als Algorithmus nicht etwa XMLCipher.AES_128, sondern http:// www.w3.org/2001/04/xmlenc#aes128-cbc Crypto-Parameter zur Verfügung, schließ- Wie beim XMLSecurity-Data-Format angegeben werden muss. lich integriert das Crypto-Data-Format die findet auch beim Crypto-Data-Format die „Java Cryptography Extension“ in Camel. Verschlüsselung mit „marshal“, die Ent- Das Crypto-Data-Format Auf Systemen mit „JCE Unlimited Strength schlüsselung mit „unmarshal“ statt. Neu Auch das Crypto-Data-Format kümmert Jurisdiction Policy Files“ [10] oder gar mit Version 2.9 ist die Unterstützung für sich um die Verschlüsselung der Nutzdaten. „BouncyCastle“ [11] Crypto-Provider stehen das weit verbreitete PGP und damit für Unterstützt wird dabei jedes beliebige Da- weitere und nochmals deutlich stärkere Al- asymmetrische Kryptografie. tenformat, natürlich auch XML. Verschlüs- gorithmen zur Verfügung. Um die Crypto- selt wird daher auch immer die vollständige Features verwenden zu können, müssen Symmetrische Verschlüsselung Nachricht mit einem Schlüssel, eine Teilver- diese ebenfalls über ein weiteres Artefakt Grundsätzlich kann der symmetrische schlüsselung ist nicht möglich. Dafür stehen zur Liste der Maven-Abhängigkeiten hinzu- Schlüssel per Routen-Konfiguration in aber auch deutlich mehr Algorithmen und gefügt werden (siehe Listing 6). XML oder Java angegeben oder aber im

32 |

iii iii iiiiii www.ijug.eu

Header der Nachricht unter dem Namen „CamelCryptoKey“ abgelegt werden. Letz- teres entspricht dabei in etwa einem ver- schlossenen Tresor, dessen Schlüssel man auf der Rückseite angebracht hat. Listing 7 zeigt daher die sicherere Variante per Kon- figuration. Wie man sieht, ist hier die Konfiguration etwas aufwändiger: Neben der Route muss noch ein Crypto-Data-Format innerhalb des Listing 7 Camel-Kontexts konfiguriert werden. Die- ses verweist per „keyRef“-Attribut auf eine Bean, aus der der entsprechende Schlüssel Listing 9 zeigt die Bean selbst, wobei generiert werden. Es fällt auf, dass pro verwendetem Listing 8 Algorithmus eine solche Bean angelegt beziehungsweise eine allgemeine Key- Generator-Bean um weitere Methoden import java.security.Key; zur Schlüsselerzeugung erweitert werden import java.security.NoSuchAlgorithmException; muss. Auch die Konfiguration muss dann import javax.crypto.KeyGenerator; um entsprechende „crypto“-Elemente er- public class KeyGeneration { gänzt werden. Einmal angelegt, lassen sich private static Key desKey = null; Crypto-Data-Format-Elemente aber nach private static Key aesKey = null; Belieben wiederverwenden. Die Entschlüs- selung funktioniert erwartungsgemäß static { einfach mit dem Aufruf von „“. Das Attribut „ref“ verweist generator = KeyGenerator.getInstance(„DES“); dabei ebenfalls auf das jeweilige Crypto- desKey = generator.generateKey(); Data-Format-Element. generator = KeyGenerator.getInstance(„AES“); aesKey = generator.generateKey(); Asymmetrische Verschlüsselung } catch (NoSuchAlgorithmException e) { e.printStackTrace(); Asymmetrisch verschlüsselt wird, wie be- } reits kurz erwähnt, mit PGP. Dazu generiert } man sich beispielsweise mit „GnuPG“ ein neues Schlüsselpaar und stellt Camel den public static Key getDesKey() { öffentlichen zum Ver- und den privaten return desKey; } Schlüssel zum Entschlüsseln zur Verfü- gung. In Camel muss dabei kaum noch et- public static Key getAesKey() { was konfiguriert werden. Nach Angabe der return aesKey; Dateien, der Schlüssel-Benutzer-ID und } des Passworts (nur beim privaten Schlüs- } sel) extrahiert Camel die weiteren Infor- mationen wie Algorithmus und Schlüs- Listing 9 sellänge automatisch aus dem gewählten Schlüssel. Die einzige Änderung in obiger symmetrischer Route ist die Anpassung der „ref“-Attribute in den „marshal“- und „unmarshal“-Elementen (siehe Listing 10). Außerdem muss das „dataFormats“- Listing 10 Element um die Einträge zur Ver- und Ent- schlüsselung mit PGP erweitert werden

Java aktuell 3-2012 | 33 Integrations-Framework

(sofern nur ver- oder entschlüsselt wird genügt der jeweilige Eintrag allein, siehe Listing 11). Typische Fehler und Probleme sind: but ist der DES/CBC/PKCS5Padding-Algo- rithmus. „DES“ gilt aufgrund seiner kurzen Schlüssellänge bereits seit geraumer Zeit als unsicher und sollte nicht mehr verwen- Listing 11 det werden. Hier wäre „Triple-DES“ (DE- Sede) oder auch „AES“ die deutlich bessere Wahl für den Standardalgorithmus gewe- sen. Im Gegensatz zum XMLSecurity-Data- daher unbedingt ein sicherer Algorithmus Digitale Signaturen Von der asymmetrischen Verschlüsselung Listing 12 ist es dann nur noch ein kleiner Schritt hin zu den digitalen Signaturen. Da das XMLS- ecurity-Data-Format (noch?) keine XML- Signaturen in Camel unterstützt, bietet lichkeit, Nachrichten mit Camel-Mitteln digital zu signieren [12]. Wer jetzt erwartet, einfach „marshal“ durch „sign“ und „un- marshal“ durch „verify“ zu ersetzen sowie einige Attribute für den Schlüssel anzupas- Listing 13 sen, wird leider enttäuscht. Digitale Signa- turen funktionieren in Camel ein bisschen Datei um die Abhängigkeit „spring-ws-se- 2.9.0 verhindert das ein Bug (CAMEL-4996 anders. Um eine Nachricht zu signieren, curity“ erweitert werden (siehe Listing 13). [13]), sodass der Header auch nach der wird diese an einen Endpunkt ‘crypto:sign´ Camel stellt hier noch weitere Mög- Verifizierung exakt dem Header nach der geschickt. Die notwendigen Konfigura- lichkeiten zum Laden des Schlüssels und Signierung entspricht. Im Falle einer er- tionsangaben werden nicht über Attribute auch zur Angabe weiterer Parameter wie folgreichen Verifizierung gibt es übrigens hinzugefügt, sondern als Parameter an die beispielsweise des Algorithmus zur Ver- keinerlei Rückmeldung von Camel, die Endpunkt-URI angehängt. Das Verifizieren fügung. Details dazu stehen auf der Ca- Verarbeitung der Route wird stattdessen einer Nachricht funktioniert entsprechend mel-Homepage [12]. Eine Einschränkung einfach fortgesetzt. Lediglich bei einer mit einem Endpunkt „crypto:verify“. In Lis- aber gibt es: Leider lässt sich das Element gescheiterten Verifizierung bricht die Ver- ting 12 wird die Nachricht sofort nach der „keyStoreParameters“ aus dem XMLSe- arbeitung im „crypto:verify“-Endpunkt mit Signierung verifiziert, normalerweise sind curity-Data-Format nicht als KeyStore für der nicht so ganz eindeutigen Meldung diese Schritte natürlich getrennt. „crypto:sign“ verwenden. „Cannot verify signature of exchange“ ab. Die Route allein genügt in diesem Fall Wer jetzt die entsprechende Route auf- Auf diese Exception muss der Entwickler nicht. Der Parameter „keystore=#signa- ruft, wird sich vielleicht über die scheinbar dann entsprechend in der Route reagieren tureStore“ in der URI deutet es an: Ein unveränderte Nachricht wundern. Nach und beispielsweise die Nachricht auf eine „#“-Zeichen in URI-Attributen verweist dem Aufruf des „crypto:sign“-Endpunkts andere Weise verarbeiten oder komplett auf eine Bean mit entsprechender ID. Im enthält der Header der Camel-Message verwerfen. Um diese Exception zu simu- Beispiel ist daher zusätzlich eine Bean mit nur ein zusätzliches Attribut: „CamelDigi- lieren, genügt es, nach dem Aufruf von der ID „signatureStore“ notwendig. Diese talSignature“. Dieses besitzt den verkürz- „crypto:sign“ den Body beispielsweise mit muss den KeyStore zur Verfügung stellen. ten Hashwert der Nachricht, zum Beispiel „Another body“ zu verändern und ten, von fertigen Beans bis hin zur Eigen- Body der Nachricht ist damit signiert. diesen dann zu verifizieren. entwicklung. Das Beispiel verwendet der Nach der erfolgreichen Verifizierung Typische Fehler und Probleme sind: Eine Einfachheit halber die „KeyStoreFactory- durch „crypto:verify“ sollte dieses Attri- häufig auftretende Exception (leider auch Bean“ aus dem „Spring-WS-Security“- but wieder automatisch von Camel ge- bei stark unterschiedlichen Ursachen) lau- Paket. Entsprechend muss dazu die POM- löscht werden. Bis einschließlich Camel tet „Cannot sign message as no Private Key

34 |

iii iii iiiiii www.ijug.eu

has been supplied. Either supply one in Anschließend müssen der Algorithmus In der nächsten Ausgabe dreht sich the route definition sign(keystore, alias) or sowie die dafür notwendigen Parameter alles um den zweiten großen Bereich der sign(privateKey) or via the message header festgelegt und die passenden Schlüssel Camel Security: die Absicherung einer ‘CamelSignaturePrivateKey’”. Sie tritt zu- generiert und verwaltet werden. Hier ist es Camel-Route (Route Security) mit Apache nächst einmal auf, falls der KeyStore nicht bei beiden Formaten besser, nicht auf die Shiro und Spring Security. geladen werden konnte. Das heißt, dass Standard-Algorithmen bei fehlender An- entweder die ID in der URI nicht mit der gabe zu vertrauen, sondern explizit einen Weitere Informationen Bean übereinstimmen, der KeyStore-Pfad/- (sicheren) Algorithmus anzugeben. Allein [1] http://camel.apache.org [2] http://camel.apache.org/security.html Dateiname in der Bean nicht korrekt oder schon, um bei einer Änderung des Stan- [3] http://www.jasypt.org das Passwort des KeyStores falsch ist. Auch dard-Algorithmus nicht mit unerwarteten [4] http://camel.apache.org/camel-configuration- ein nicht über den Alias gefundener Schlüs- Exceptions konfrontiert zu werden. utilities.html [5] http://camel.apache.org/xmlsecurity-datafor- sel führt zu dieser Exception. Lediglich ein Ärgerlich ist, dass die drei hier gezeigten mat.html falsches Schlüssel-Passwort liefert eine an- kryptografischen Anwendungen leicht [6] http://camel.apache.org/crypto.html dere Exception zurück: „Cannot recover key“. oder gar völlig unterschiedliche Konfi- [7] http://camel.apache.org/camel-maven-arche- types.html Wie im Beispiel umgesetzt, ist es wichtig, gurationsmöglichkeiten verwenden. Zu- [8] http://www.w3.org/TR/xmlenc-core dass für das XMLSecurity- und das Crypto- mindest bei der KeyStore-Konfiguration [9] http://santuario.apache.org Data-Format getrennte KeyStores verwen- wäre es wünschenswert, wenn diese nur [10] http://www.oracle.com/technetwork/java/ det werden. In der Realität wird dieser Fall einmal neutral und unabhängig vom javase/downloads/index.html [11] http://www.bouncycastle.org wohl ohnehin nicht häufig anzutreffen sein, Data-Format konfiguriert werden müsste [12] http://camel.apache.org/crypto-digital-signa- meist wird man sich für das Crypto- oder und dann mit jeglicher Variante – Crypto, tures.html das XMLSecurity-Data-Format entscheiden. XMLSecurity oder digitalen Signaturen – [13] https://issues.apache.org/jira/browse/CA- MEL–4996 Verwendet jedoch die „signatureStore“- verwendet werden könnte. [14] Ibsen, Claus and Anstey, Jonathan: “Camel in Ac- Bean denselben KeyStore wie beim XML- Gleichzeitig gilt es bei der Routen-Konfi- tion”, 2011, Manning, ISBN 978–1–935182–36–8 Security-Data-Format (camel.jks), kann der guration auch, die vorhandenen Fallstricke [15] http://aktuell.ruhr-uni-bochum.de/pm2011/ pm00330.html.de Schlüssel nicht geladen werden und es zu beachten. Gerade die sonst so hervor- kommt zu entsprechenden Fehlern. ragende Camel-Dokumentation ist in den Dominik Schadow Bereichen „Crypto“, „XMLSecurity-Data-For- [email protected] Fazit und Ausblick mat“ sowie „digitale Signaturen“ noch sehr Bereits die Absicherung der Nutzdaten rudimentär und enthält nur wenige Bei- einer Camel-Nachricht kann, wie gezeigt, spiele. Auch das ansonsten herausragende sehr komplex werden. Viele verschiede- Buch „Camel in Action“ [14] schweigt sich ne Möglichkeiten stehen zur Verfügung. zum Thema Sicherheit leider aus. Gleich zu Beginn der Implementierung Subjektiv betrachtet, lässt sich das XML- steht dabei die Entscheidung an, ob das Security-Data-Format besser verwenden herkömmliche Crypto- oder das XML- und macht einen moderneren Eindruck. Security-Data-Format verwendet werden Gleichzeitig sind hier die Sicherungsmög- Dominik Schadow arbeitet als Senior Consultant im Bereich soll. Welches der beiden Formate besser lichkeiten (vollständiges Dokument, Do- „Application Development“ bei der Trivadis GmbH in Stuttgart. geeignet ist, wird nicht unbedingt vom zu kument-Fragmente, mit unterschiedlichen Neben seinem Fokus auf Java-Enterprise-Applikationen und -Ar- sichernden Datentyp bestimmt. Ein besse- Schlüsseln/ Algorithmen) deutlich umfang- chitekturen sowie Integrationsthemen rund um Apache Camel res Entscheidungsmerkmal ist sicherlich, reicher. Aber auch mit dem Crypto-Data- beschäftigt er sich als Discipline Manager Application Develop- ob die vollständige Nachricht verschlüsselt Format lässt sich ein immenser Sicherheits- ment Security mit dem Thema „Sichere Software-Entwicklung“. In werden soll oder nur Teile davon, eventuell gewinn für die Camel-Routen erzielen und seiner Freizeit leitet er das Open-Source-Projekt „JCrypTool“ , mit auch mit unterschiedlichen Schlüsseln. man hat mehr Algorithmen zur Verfügung. dem Anwendern die Kryptografie näher gebracht werden soll.

Trainings für Java / Java EE Wissen wie´s geht ® • Java Grundlagen- und Expertenkurse Unsere Schulungen können gerne aformatikƒ • Java EE: Web-Entwicklung & EJB auf Ihre individuellen Anforderungen angepasst und erweitert werden. • JSF, JPA, Spring, Struts aformatik Training & Consulting GmbH & Co. KG • Eclipse, Open Source Weitere Themen und Informationen Tilsiter Str. 6 | 71065 Sindelfingen | 07031 238070 zu unserem Schulungs- und • IBM WebSphere, Portal und RAD Beratungsangebot finden Sie • Host-Grundlagen für Java Entwickler unter www.aformatik.de www.aformatik.de

Java aktuell 3-2012 | 35 Projektmanagement

Projektmanagement-Zertifizierung Level D nach GPM

Gunther Petzsch, Saxonia Systems AG

Das Arbeiten mit und in Projekten ist für viele IT-Fachkräfte zum Alltagsgeschäft geworden. Doch mit der Frage, warum Projekte überhaupt so wichtig sind und wie diese erfolgreich durchgeführt werden können, haben sich wahrscheinlich nur wenige beschäftigt. Warum also nicht eine Projektmanagement-Zertifi- zierung besuchen und sich richtig mit der Materie befassen?

Gerade bei den täglich relevanten Themen Schritte zur Zertifizierung und sich somit alle am Firmenstandort wie „Kommunikation“, „Konfliktmanage- Den Aussagen der Trainer und Prüfer zufol- treffen und gemeinsam arbeiten konn- ment“ und „Planung“ kann nicht genug ge gelingt es den wenigsten Teilnehmern, ten. Die Schulung war in fünf Blöcken von Wissen vorhanden sein. Auch das Verständ- die Prüfung ohne eine Teilnahme am je- jeweils drei beziehungsweise zwei aufein- nis für die Arbeitsweise eines Projektleiters weiligen Vorbereitungskurs zu bestehen. anderfolgenden Tagen koordiniert. Einen und dafür, wie Projektziele durch das Team Denn dieser baut exakt auf den prüfungs- Großteil der Zeit nahm die Vermittlung beeinflusst werden, kann zum Erfolg eines relevanten Themen auf und vermittelt von Wissen anhand der entsprechenden Projekts entscheidend beitragen. den Kursbesuchern das gewünschte und Kapitel und Folien aus den Schulungs- benötigte Wissen. Darüber hinaus geben unterlagen ein. Dieses Arbeiten wurde in Projektmanagement-Zertifizierung Level-D die Dozenten spezielle Anmerkungen bei der Schulung aber gut anhand von pra- Die GPM ist die Deutsche Gesellschaft für den wichtigen beziehungsweise interes- xisnahen Beispielen, Lern- und Teamspie- Projektmanagement. Gemessen an der santen Themen für die Prüfung. Aber auch len, freiem Arbeiten an entsprechenden Anzahl von Mitgliedern ist die Organisa- die umfassende Praxiserfahrung und die Lernaufgaben und deren anschließenden tion das größte Kompetenz-Zentrum im vielen Beispiele im Kurs helfen, die Lern- Ergebnispräsentation aufgelockert. Auch Bereich Projektmanagement in Europa. inhalte aufzunehmen und das Gelernte wenn dies das Lernen erleichterte, so war Über die International Project Manage- umzusetzen. das Arbeiten doch für alle Teilnehmer an- ment Association ist die GPM weltweit Der bei der Saxonia Systems AG durch- strengend. vernetzt. Durch die Mitarbeit an internatio- geführte Vorbereitungskurs umfasste etwa nalen Normen und Richtlinien trägt sie we- zwölf Tage. In dieser Zeit wurde der Lehr- Aufwand und Voraussetzungen sentlich zur Professionalisierung und Wei- stoff auf knapp 280 Folien vermittelt, was für die Prüfung terentwicklung des Projektmanagements sich natürlich von Kurs zu Kurs unterschei- Im Prinzip gibt es keine fachlichen Voraus- bei. Sie nimmt weitreichenden Einfluss den kann. Womöglich schwankt die Dauer setzungen für die Teilnahme zur Prüfung. auf Projektmanager und fordert von die- des Kurses auch je nach Zeit oder Informa- Aber natürlich ist es von Vorteil, wenn man sen zusätzlich auch die Einhaltung eines tionsgehalt der Veranstaltung. Ausschlag- selbst schon in dem einen oder anderen Ethik-Kodex, der sich an den wesentlichen gebend für die Wahl eines Kurses werden Projekt tätig gewesen ist und somit auch Grundwerten ausrichtet. Die Projektma- letztendlich oftmals die Kosten oder eine Erfahrungen in den entsprechenden Kom- nagement-Zertifizierung Level-D ist die er- Weiterempfehlung sein. petenzelementen gesammelt hat. ste von vier Stufen in den Zertifizierungen Ein solcher Kurs bedeutet einen er- Um zur Prüfung zugelassen zu werden, zum Projektmanagement, wobei die Berei- heblichen Aufwand für die Teilnehmer, muss eine Projektarbeit ausgearbeitet und che von „A“ bis „D“ unterteilt werden. Diese wobei eine gewisse Portion Eigenmo- abgegeben werden. Im Rahmen der Level- Zertifizierungen sind unter dem Namen tivation von Vorteil ist. Die Schulung, D-Zertifizierungen spricht man von einem „IPM 4-L-C“- Zertifikate für Projektmanager über die hier berichtet wird, war eine Transfernachweis. Das Thema für diesen zusammengefasst. Level-D steht für „Zerti- Inhouse-Schulung in den Firmenräumen Nachweis ist ein selbst gewähltes Projekt, fizierter Projektmanagement-Fachmann“. des Autors. Dies hatte den Vorteil, dass das entsprechend den Kompetenzen des Zahlen der GPM besagen, dass Ende 2011 Teilnehmer, die oft in Projekten innerhalb Projektmanagements aufgearbeitet wer- etwa 21.200 Projektmitarbeiter das Zertifi- Deutschlands unterwegs sind, nicht noch den muss. Dieses Projekt kann fiktiv, aber kat der Stufe D besaßen. eine Reise zusätzlich einplanen mussten auch real stattgefunden haben. Folgende

36 |

iii iii iiiiii www.ijug.eu

Themen müssen Inhalt des Transfernach- Im Anschluss sollte er die verbleibenden sert sich die Mitarbeit und das Verstehen weises sein: zwei Fragen mündlich beantworten. Hier- von Projekten. Strukturen und Probleme bei dürfen Hilfsmittel wie Whiteboard, können besser erfasst und somit frühzeitig • Projekt und Projektziele Zettel und Stift benutzt werden. Für die positiv beeinflusst werden. Auch für Men- • Stakeholder-Analyse und Projektum- Beantwortung der Fragen stehen dem schen, die nicht unbedingt den Wunsch feld-Betrachtung Prüfling 20 Minuten der Prüfungszeit zur hegen, eine Projektleitung zu überneh- • Risiko-Analyse Verfügung. Die restliche Zeit ist für weitere men, ist dieser Kurs beziehungsweise das • Projektorganisation Fragen auch zu anderen Themen oder zur Zertifikat aufgrund der oben genannten • Projektphasen-Planung Besprechung des Transfernachweises vor- Punkte von großem Nutzen. Aus persönli- • Projektstruktur-Planung gesehen. cher Erfahrung ist die Teilnahme an einem • Ablauf- und Terminplanung Beide Prüfungen finden am selben Tag Vorbereitungskurs sehr zu empfehlen. Im • Einsatzmittel- und Kostenplanung statt. Nach Bestehen der Prüfung erhält Vergleich mit einer SCJP-Zertifizierung, bei • Ein Wahlthema zu den Verhaltenskom- man das entsprechende Zertifikat und ei- der man mittels eines entsprechenden Bu- petenzen nen Antrag auf eine kostenlose Mitglied- ches sehr konkret vorbereitet wird, ist die • Ein weiteres Wahlthema aus den Pro- schaft in der GPM über ein Jahr. Das Zerti- Literatur für das Projektmanagement doch jektmanagement-Kompetenzen fikat ist fünf Jahre gültig und kann danach sehr umfassend und durchaus in manchen gegen Zahlung eines bestimmten Betrags Punkten konträr. Ohne die hilfreichen Der Transfernachweis wird als PDF-Datei um weitere fünf Jahre verlängert werden. Tipps vom Kursleiter kann man hier schnell im Portal der GPM nach Abschluss der Das intensive Lernen für die Prüfung stolpern. Arbeit hochgeladen. Diese muss spätes- ist aus Sicht des Autors unabdingbar. Die Man könnte sich die Frage stellen, ob tens vierzehn Tage vor dem eigentlichen Gründe hierfür sind der Umfang des Lern- für die Zertifizierung nicht zu viel Auf- Prüfungstermin erfolgen und darf die stoffs, die unzähligen Möglichkeiten der wand verlangt wird. Aber im Nachhinein maximale Seitenanzahl von 60 sowie eine Fragestellung und Inhalte sowie das Zu- betrachtet war aus Sicht des Autors alles Dateigröße von 7 MB nicht überschreiten. sammenlegen der Prüfungen (mündliche stimmig. Ohne den Transfernachweis, bei Dennoch ist der Transfernachweis schon und schriftliche) an einen Tag. dem das erworbene Wissen gleich verstan- mit gewissem Aufwand verbunden. Der Die Teilnehmer des Kurses hatten zwei den und umgesetzt werden musste, wäre Dozent sprach von etwa 80 Stunden Ar- Tage vor der Prüfung einige Beispielfra- die Prüfung durchaus schwieriger gewor- beitszeit. Erwähnenswert ist noch, dass gen bekommen, um diese probeweise den. Und natürlich hat dieses Zertifikat bis zu drei Prüfungsteilnehmer diese Pro- zu beantworten. Das Ergebnis war nie- auch eine Auswirkung auf das Berufsleben, jektarbeit gemeinsam erstellen können. derschmetternd. Nur etwa die Hälfte der empfiehlt man sich doch für höhere Auf- Der Aufwand wird also zunächst für die Gruppe hatte gerade so bestanden. Dabei gaben und vielleicht auch für eine höhere einzelne Person geringer. Nachteilig da- hatten sich alle schon auf die Prüfung vor- Lohngruppe. bei ist, dass diese Arbeit bei einer höheren bereitet. Das bedeutete für einige noch Zertifizierung (Level-C) nicht komplett an- zwei zusätzliche Nachtschichten zum Ler- Quellen erkannt wird und an dieser Stelle Mehr- nen. Unterschätzen sollte man die Prü- www.gpm-ipma.de aufwand entsteht. Weiterhin ist natürlich fungsvorbereitung auf keinen Fall. die Abarbeitung aller Themengebiete des Der Prüfungstag begann mit der Transfernachweises gleichzeitig Vorberei- schriftlichen Prüfung. Die maximal erreich- Gunther Petzsch tung auf die Prüfung zur Zertifizierung. bare Punktezahl lag bei 120 Punkten, zum [email protected] Bestehen wurden also 60 Punkte benötigt. Prüfung Die Reihenfolge für die mündliche Prüfung Die Prüfung zum Abschluss der Zertifizie- war am Vortag in der Gruppe bestimmt rung besteht aus zwei Teilen – einer schrift- worden. Somit wusste jeder Einzelne, lichen und einer mündlichen Prüfung. Die wann er in etwa an der Reihe war. Alle Teil- schriftliche Prüfung hat eine Dauer von nehmer des Kurses bestanden die mündli- zwei Stunden. Dabei dürfen keine Unter- che Prüfung. lagen und keine sonstigen technischen Geräte, außer einem nicht programmier- Fazit baren Taschenrechner, benutzt werden. Zum Erlangen dieses Zertifikats muss rich- Die mündliche Prüfung hat eine Dauer tig Aufwand betrieben werden. Zitat eines von etwa 30 Minuten und wird von zwei Kursleiters am ersten Kurstag: „Melden Sie Gunther Petzsch ist Sun-zertifizierter Java-Entwickler. Er lebt Assessoren abgenommen. Der Prüfling sich schon mal für die nächsten drei Mona- und arbeitet in Dresden. Dort studierte er auch erfolgreich Wirt- muss dabei drei Karten aus einem Pool te bei Ihrem Lebenspartner ab.“ Im Gegen- schaftsinformatik an der Hochschule für Technik und Wirtschaft von etwa 150 Prüfungsfragen ziehen und zug werden Wissen und Werte vermittelt, Dresden. Danach arbeitete er unter anderem für das Bundeskri- nach dem Prüfen und Vorlesen der Fragen die man tagtäglich im Beruf oder auch in minalamt in Wiesbaden. Aktuell ist Gunther Petzsch als Senior eine Karte davon zurück in den Pool legen. der Freizeit anwenden kann. Ferner verbes- Consultant für die Saxonia Systems AG tätig.

Java aktuell 3-2012 | 37 Android

Android in Lehre und Forschung: Entwicklung wissenschaftlicher Applikationen der nächsten Generation

Jonas Feldt und Johannes M. Dieterich, Institut für Physikalische Chemie, Georg-August-Universität Göttingen

Das rapide Wachstum des Marktes für intelligente Mobilgeräte und die schnelle Entwicklung von Hard- und Software schaffen neue Möglichkeiten für Lehre und Forschung. Höchste Mobilität und intuitive Interaktionsmöglichkeiten zeichnen diese neue Geräteklasse aus und stehen der Nutzung durch wissen- schaftliche Apps offen. Der Artikel beleuchtet am Beispiel der „Atomdroid“-App, einer Android-Applikation für Computer-Chemie und –Biochemie, technische Aspekte von Entwicklung und Nutzung wissenschaft- licher Applikationen im Android-Kontext.

Klassische wissenschaftliche Applikatio- Geräte-Generation und der virtuellen tät und -Aufwand je nach Gerät anpassen. nen sind immobil. Serverseitige Applika- Maschine von Android (DalvikVM) für die Eine sinnvolle Standard-Konfiguration und tionen laufen auf Rechenzentren, client- oben genannten Anforderungen aus- harte Limits können hier helfen, Fehlab- seitig sind sie an Workstations oder – im reicht, ist ein häufig genannter Kritikpunkt stimmungen und daraus resultierende mobilsten Fall – an Notebooks gebunden am Android-Ökosystem die hohe Markt- Beschwerden seitens der Nutzer zu mini- (siehe Abbildung 1). Begründet wird dies Fragmentierung hinsichtlich Hardware- mieren. Zusätzlich dazu ermöglicht Goog- mit den hohen Rechenanforderungen, Spezifikationen und Android-Versionen. le durch die Fragments-Kompatibilitäts- die für Visualisierung und Modellierung Die Erfahrung zeigt, dass die Nutzerbasis bibliothek eine vereinfachte Anpassung der wissenschaftlichen Systeme benötigt tatsächlich stark fragmentiert ist (siehe Ab- der Benutzeroberfläche auf verschiedene werden. Mit dem Aufkommen der neuen bildungen 2 und 3). Damit assoziierte Pro- Bildschirmgrößen auch für Android-Versi- Geräteklasse intelligenter Mobilgeräte bleme lassen sich allerdings durch zwei re- onen ab 1.6 [3]. stellt sich die Frage, ob sich die klassen- lativ einfache Regeln minimieren: Erstens Unabhängig von diesen Regeln sollte zu typischen Eigenschaften (Mobilität, ver- sollte eine strikte Einhaltung der Android- Beginn eines Android-Projekts die minimal änderte Haptik, intuitivere Kontrolle) im Programmierstandards erfolgen [2] und vorausgesetzte API-Version gut bedacht wissenschaftlichen Kontext nutzen lassen. zweitens sind die bekannten manuellen werden. Ältere API-Level korrespondieren Ein vollständiger Ersatz althergebrachter und/oder automatischen Stellschrauben mit einer größeren Zahl potenzieller Nut- Programmcodes ist weder gewünscht geboten, die unter anderem Grafik-Quali- zer, aber auch mit einem erhöhten Ent- noch realistisch. Ziel ist lediglich, die neu- geschaffenen Möglichkeiten mit neuen, modernen Apps zu nutzen. Naheliegende Ziele sind hierbei, Forschern ultramobi- le Werkzeuge an die Hand zu geben, die auch in der Wissensvermittlung intuitiv eingesetzt werden können. Der Artikel zeigt Schwierigkeiten und Lösungsmög- lichkeiten auf diesem Weg am Beispiel der Erfahrungen mit der von den Autoren ent- wickelten „Atomdroid“-App für Android- Systeme [1], wobei diese weder einen An- spruch auf Vollständigkeit noch auf opti- male Lösungen erheben.

Android: Allgemeine Probleme und Lösungsansätze Neben der offensichtlichen Frage, inwie- weit die Leistung der heutigen, mobilen Abbildung 1: Klassische Aufteilung von Computerchemie-Programmen

38 |

iii iii iiiiii www.ijug.eu

wicklungsaufwand, da sich alte Versionen häufig auf nicht performanten Geräten fin- den. Zum jetzigen Zeitpunkt erscheint den Autoren API-Level 8 (Android 2.2) ein guter Kompromiss zu sein. Schlüssel-Technolo- gie ist hier hinsichtlich Performance der in der DalvikVM enthaltene JIT [4]. Das Erreichen potenzieller Nutzer ist durch die Market-Umgebungen prinzipiell sehr einfach. Die Statistikmöglichkeiten des Google-Markts sind exzellent und bie- ten einen genauen, anonymisierten Über- blick über die Nutzerbasis. Es stellt sich allerdings heraus, dass Nutzer zwar sehr einfach Apps installieren und kommen- tieren können, eine beidseitige Kommu- nikation von Entwicklern mit Nutzern aber unnötig erschwert wird. Durch das Fehlen Abbildung 2: Fragmentierung bezüglich der Android-Version einer Antwortmöglichkeit ist es nicht di- rekt möglich, auf Kritik oder Vorschläge zu reagieren. Die Option, dem Entwickler eine Mail zu schicken, nutzen trotz explizi- ter Aufforderung in der App-Beschreibung nur vergleichsweise wenige Nutzer (unter 0,1 Prozent bei Atomdroid). Hier stehen mangelhafte Rückkopplungsmechanis- men einer agilen, nutzerorientierten Ent- wicklung im Weg.

Performance für den täglichen Einsatz Zunächst muss man Visualisierungs- und Simulations-Performance unterscheiden. Während wissenschaftliche Simulationen Prozessor- und Speicher-intensiv sind (unter Vernachlässigung einer Beschleu- nigung durch GPU-Einsatz), spielt die Grafik-Performance offensichtlich eine zentrale Rolle bei Visualisierungsaufga- Abbildung 3: Hardware-Fragmentierung ben. Einschränkend gehen die Autoren im Folgenden davon aus, dass immer die DalvikVM verwendet wird und nicht durch Einsatz des Android Native Development Kits (NDK) Sprachen wie C/C++ zum Ein- satz kommen. Die Visualisierung wird auf Android durch eine Mischung von Android-inter- nen APIs für die Darstellung von Menüs oder Listen sowie OpenGL ES für die Dar- stellung von 3D-Objekten realisiert. Diese Kombination ist leicht verwendbar und im Fall von OpenGL ES standardisiert und portabel. Die intuitive Haptik mit Multi- touch-Events erlaubt eine sehr natürliche Interaktion (siehe Abbildung 4). Die heuti- ge Generation von Geräten ermöglicht die Abbildung 4: Grafische Darstellung eines Moleküls (PDB-ID 2LFA) Darstellung großer Datensätze.

Java aktuell 3-2012 | 39 Android

Interessant ist, ob rechenintensivere Si- mulationen auf mobilen Geräten möglich static double dihedralAngle(double[] first, double[] second, double[] third, sind. Eine mobile wissenschaftliche App double[] fourth, double[] t1, double[] t2, double[] t3, double[] t4) { for(int i = 0; i < 3; i++){ sollte auch eine gewisse Autonomie hin- t1[i] = first[i] - second[i]; sichtlich Standardaufgaben ermöglichen. t2[i] = third[i] - second[i]; In der Computerchemie ist dies gleichzu- } setzen mit einfachen, kraftfeldbasierten crossproduct(t1, t2, t3); Simulationen, um beispielsweise die räum- for(int i = 0; i < 3; i++){ t1[i] = fourth[i] - third[i]; liche Struktur eines Moleküls zu berech- t2[i] = second[i] - third[i]; nen. Kraftfelder sind durch ihren geringen } Speicherplatzbedarf gut für mobile Geräte crossproduct(t1, t2, t4); geeignet. crossproduct(t3, t4, t1); Um eine gute Performance auf And- final double length = value(t1); roid-basierten Geräten sicherzustellen, if(length < 0.001) return 0.0; sind nach Erfahrung der Autoren mehrere Faktoren wichtig. Neben der Wahl einer return Math.PI - angle(t3, t4); passenden Methode sind die üblichen } Optimierungen zur Minimierung von Fließkommaoperationen von Bedeutung. Listing 1 Speziell ist bei Android allerdings die Not- wendigkeit der Minimierung von Speicher- operationen (Allokation und Freigabe). Zum einen muss vermieden werden, für final Gradient grad = uff.gradient(Geometry g, float[][] bonds, double[][] distances, typische Vektoroperationen kleine „double double[][] freeScratch,UFFData[] data); final Gradient grad = uff.gradient(Geometry g); []“ in Schleifenkontexten zu allozieren. Die Optimierung ist aus Standard-Java be- kannt und im Listing 1 exemplarisch für Listing 2 die Berechnung eines Diederwinkels dar- gestellt ist. Hier sind die Arrays „t1“ bis „t4“ tempo- richtige Richtung war. Dennoch reicht die Ein Problem stellt sicherlich noch die rär benötigte Vektoren. Der so optimierte Performance der DalvikVM hier nicht an Verwendung externer Bibliotheken dar. Code ist deutlich (etwa Faktor fünf) schnel- eine aktuelle JVM heran, die solche Opti- Obwohl einer prinzipiellen Verwendung ler als eine naive Implementation. Darüber mierungen schlicht nicht benötigt. der allermeisten Java-5-kompatiblen Bib- hinaus ist es, anders als bei Standard-Java, Optimierte Apps sind durchaus für die liotheken nichts im Wege steht, ist die Per- sehr wichtig, auch weniger häufig auftre- erwähnten Standardaufgaben geeignet, formance von JVM-orientiertem Code in tende Speicher-Operationen zu vermeiden. ein kartesischer Gradient (inkl. Energie) der DalvikVM häufig suboptimal. Abhän- Der Unterschied wird verständlich, wenn lässt sich selbst für ein Molekül mit 155 gig davon, ob die Bibliothek in einem Per- man verschiedene Interfaces zu unserer Atomen auf Tegra2-Hardware in 106,8 ± formance-kritischen Teil des Programms eingebauten Kraftfeld-Routine betrachtet. 0,2 Millisekunden berechnen. Es ist somit eingesetzt wird und als Quellcode vorliegt, Aufgabe ist, einen kartesischen Gradienten möglich, die Minimumsstruktur durch eine lohnen sich Optimierungsanstrengungen. des Moleküls zu berechnen, eine Operation, lokale Optimierung in circa einer Minute die für die implementierte Methode „O(N²)“ zu finden. So vorbereitete Strukturen sind Mobile Moleküle mit der Anzahl von Atomen skaliert und Startpunkt für weitere Analysen und Simu- Ein zentraler Aspekt wissenschaftlicher mehrfach für eine lokale Optimierung auf- lationen. Apps ist die Verfügbarkeit relevanter Daten. gerufen wird (siehe Listing 2). Die Unterteilung in zwei verschiedene Für chemische Zwecke sind dies meistens Im ersten Fall werden benötigte Arrays Anwendungsklassen ermöglicht darüber Molekül-Strukturen. Daher ist für die Ent- und Felder wiederverwendet, im zwei- hinaus eine einfache Parallelisierung mit wicklung wichtig, dass es Nutzern einfach ten Fall in der Gradient-Routine jeweils Android-Bordmitteln. Hierzu werden re- ermöglicht wird, neue Moleküle zu erhalten einmal lokal alloziert. Wie aus Abbildung chenintensive Simulationsaufgaben aus und selbst erstellte zu verteilen. Man unter- 5 zu ersehen, beschleunigen solche Opti- dem User Interface Thread mittels Asyn- scheidet zwischen direkter Nutzer-Interak- mierungen auf Android-Plattformen den cTasks ausgelagert. Diese Abstraktion er- tion ohne zusätzliche Hard- oder Software Code beträchtlich und sind auf älteren höht zum einen die grafische Interaktivität und indirekter mittels Server-Funktionalitä- Versionen wie Froyo zwingend notwendig. der App, zum anderen vereinfacht sie ne- ten und verfügbaren Netzwerken. Anhand der Honeycomb-Timings (Android benläufiges Programmieren durch defi- Für den direkten Datenaustausch zwischen 3.0) ist ersichtlich, dass der Gingerbread nierte Interfaces, ohne den Aufwand eines Mobilgeräten kommen Bluetooth und NFC Garbage Collector ein guter Schritt in die direkten Thread-Managements. in Betracht. Bluetooth ist weiter verbreitet

40 |

iii iii iiiiii www.ijug.eu

und besitzt eine höhere Übertragungsrate bei einer größeren Reichweite. Atomdroid erlaubt es, Molekül-Strukturen zwischen zwei Geräten per Bluetooth verschlüsselt zu versenden. Obwohl für den direkten, autonomen Austausch sehr praktisch, ska- liert diese Lösung nicht. Hier ist serverba- sierter Datenaustausch notwendig. Die Au- toren haben sich entschieden, keine echte Server-Software zu entwickeln, sondern lediglich Dateibäume auf einem vorhan- denen Webserver zu nutzen. Dieser Ansatz hat neben einem verringerten Entwick- lungsaufwand die Vorteile, dass Webserver in den meisten Fällen leicht verfügbar sind und zusätzlich auch andere potenzielle Applikationen einfachen Zugriff erhalten. Ein offener Standard-Server ist verfügbar, Abbildung 5: Einfluss von speicheroptimiertem Code in Android und JavaSE zusätzlich gibt es die Option, einen eige- nen Server einzurichten. Forschungs- oder Lerngruppen wird so ermöglicht, eigene Spezialserver zu unterhalten. Die HTTP-basierte Kommunikation von Atomdroid mit dem Server ist sche- matisch in Abbildung 6 dargestellt. Dabei sind mehrfach verwendete Daten immer zwischengespeichert, um die hohe Latenz und die geringe Bandbreite mobiler Netz- werke zu umgehen. Nutzerseitig findet eine Navigation mithilfe von Molekül-Ka- tegorien statt. Nach der Auswahl eines Mo- leküls wird der Inhalt der Info-Datei ange- zeigt und der Nutzer kann falls gewünscht die Strukturdaten herunterladen. Zur einfachen Suche (Namen- und Sum- menformel-basiert) werden auf dem Server vorbereitete Index-Dateien vorgehalten, die clientseitig abgerufen, gecacht und Abbildung 6: Schematische Darstellung der Client-Server-Interaktion durchsucht werden können. Bei der na- mensbasierten Suche erfolgt durch einen Damerau-Levenshtein-Algorithmus eine einfache Korrektur von Tippfehlern. Die Summenformel-basierte Suche ermöglicht es zum Beispiel, nach allen Molekülen auf dem Server zu suchen, die sechs Kohlen- stoff- und zwei Stickstoff-Atome enthalten. Nutzer können aus Atomdroid her- aus Geometrien mit dem Standard- oder Custom-Server teilen. Die Geometrie und weitere, per Eingabemaske abgefragte Daten werden hierzu per Mail an eine Kon- taktadresse geschickt. Obwohl diese Vor- gehensweise umständlicher als ein direk- ter Upload ist, ermöglicht sie eine direkte Kontrolle der Korrektheit des Moleküls und zusätzlicher Daten. Abbildung 7: Nutzungszahlen verschiedener Atomdroid-Versionen

Java aktuell 3-2012 | 41 Android

Fazit alle wissenschaftlichen Rechen-Anforde- keiten als Telefonie und Zeitvertreib und Es scheint schon jetzt – trotz Nischenda- rungen, die heutzutage typischerweise es obliegt Nutzern und Entwicklern, diese seins – eine signifikante Nachfrage nach durch Rechenzentren befriedigt werden, zu nutzen und dadurch einen neuen Markt wissenschaftlichen Anwendungen auf nicht erfüllbar sein. Wichtig wird hier eine zu erschließen. Android zu geben. Die Anzahl an aktiven nahtlose Integration mit zentralisierten Installationen der App (Stand März 2012: Rechenkapazitäten in Form von Cloud Literatur 3700) übersteigt die anfänglichen Vorstel- Computing sein. Entscheidend könnte [1] Atomdroid: https://play.google.com/store/ apps/details?id=org.atomdroid lungen um ein Vielfaches (siehe Abbildung hier Flexibilität hinsichtlich der serversei- [2] Android Coding Standards: http://developer. 7). Auch andere wissenschaftliche Apps tigen Umgebung sein, die typischerweise android.com/guide/practices/compatibility. finden eine recht breite Verwendung, wo- verschiedene Programmcodes und server- html [3] Fragments: http://developer.android.com/gui- bei die Anzahl der Nutzer proportional zum abhängig Queuing-Systeme umfasst. Eine de/topics/fundamentals/fragments.html Lehranspruch der Apps zu sein scheint. Ein offene und einfache Plug-in-Architektur [4] Android API-Versionen: http://developer.an- interessanter Nebenaspekt ergibt sich aus sollte hier ausreichende Anpassungsmög- droid.com/guide/appendix/api-levels.html der fehlenden Akzeptanz von Updates, die lichkeiten zur Verfügung stellen. weitere Permissions erfordern. Im Lehrkontext muss zuerst eine brei- Jonas Feldt und Johannes Dieterich Viele Nutzer scheinen eine kritische te Adaption der existierenden Technolo- [email protected] Einstellung zu neuen Berechtigungen bei gien und Medien erfolgen. Ausdrücklich Jonas Feldt ist Student im Mas- Updates zu haben. Dies ist eine positive Ent- sollte diese nicht nach dem Prinzip „neuer ter-Studiengang für Chemie an wicklung, die allerdings bei der Entwicklung ist besser“ erfolgen, sondern evolutionär der Georg-August-Universität bedacht werden sollte. So ist zum Beispiel neue Technologien zur effektiven Wissens- Göttingen. Neben seinem Stu- bei Atomdroid eindeutig zu sehen, dass vermittlung einbinden. Zentrale Heraus- dium ist er als wissenschaftliche das Bluetooth-Update mit den neuen as- forderung für Entwickler wird hier sein, Hilfskraft in der Arbeitsgruppe soziierten Berechtigungen viele Nutzer von Nutzer-Feedback aktiv zu suchen und zu „Computational Chemistry and einem Update abgehalten hat. Dies erhöht verarbeiten. Wünschenswert wären hier Biochemistry“ tätig. nochmals die Fragmentierung, diesmal auf allerdings einfachere Kommunikations- Johannes Dieterich, Jahrgang App-Seite. Google scheint hier durch das möglichkeiten zwischen Entwicklern und 1985, ist seit September letzten neue Feature der Developer Privacy Policies Nutzern auf den Vertriebsplattformen. Jahres als Postdoktorand am das Ziel zu haben, eine Vertrauensbasis zwi- Die Autoren gehen davon aus, dass Institut für Physikalische Chemie schen Nutzer und Entwickler zu schaffen. mobile Systeme und mit ihnen Android als der Georg-August-Universität Für die Zukunft kann sicherlich ein Plattform für wissenschaftliche Applikati- Göttingen beschäftigt. Er befasst weiteres Wachstum der Leistungskapazi- onen eine wichtige Rolle spielen werden. sich dort unter anderem mit der tät mobiler Endgeräte erwartet werden. Google wird hierbei sicherlich prägend Weiterentwicklung genetischer Ihre Nutzung als lokale Rechen-Ressource dafür sein, in welche Richtung sich das An- Algorithmen zur globalen Op- timierung chemischer Proleme. wird daher von wachsender Bedeutung droid-Ökosystem entwickelt. Schon jetzt sein. Dennoch werden auf absehbare Zeit bietet Android allerdings mehr Möglich-

Der Redaktionsbeirat der Java aktuell stellt sich vor Dr. Jens Trapp (links) arbeitet seit 2007 als erfahrungen sammelte er im Automobil- der Erfahrungsaustausch innerhalb der Software-Entwickler bei Google in Ham- und Versicherungsbereich sowie im öffent- Java-Comunity eine große Bedeutung hat. burg. Davor war er 8 Jahre für Sun Mi- lichen Sektor. Neben technischen Themen Daniel van Ross (rechts) ist Software- crosystems unter anderem als Software- gilt sein Interesse den Vorgehensmodellen Entwickler bei der Neptune-Labs GmbH Architect und Java Ambassador tätig. Der in der Softwareentwicklung und der Orga- in Lemgo. Sein Arbeitsschwerpunkt ist die Schwerpunkt seiner Arbeit liegt auf Client- nisation von verteilten Projektteams. Er ist Entwicklung serverseitiger Java-Anwen- Technologien (neben Java auch Javascript, Mitglied im Redaktionsbeirat, weil für ihn dungen. Daneben versorgt er die Webseite Html5/SVG, etc.) und Daten- der Java User Group Deutschland modellierung und -verarbei- e.V. mit aktuellen Neuigkeiten tung (Google BigQuery, etc.). und ist an der Planung der jähr- Ronny Kröhne (Mitte) ist lich in Göttingen stattfindenden ein IBM Architekt mit 12 Jah- Source Talk Tage beteiligt. Er ist ren Projekterfahrung. Schwer- Java-User seit Erscheinen der punkt seiner Arbeit ist die Version 1.1 und möchte mit der Erstellung von Java-EE-Anwen- Arbeit an der Java aktuell einen dungen mit lokalen und global fachmännischen Beitrag für die verteilten Teams. Branchen- Community leisten.

42 |

iii iii iiiiii www.ijug.eu

10 Years PatternTesting – ein Rückblick

Oliver Böhm, T-Systems GmbH

Wir schreiben das Jahr 2002. Das Y2K-Problem ist bereits Geschichte, der Euro eingeführt und der Zusammenbruch des Neuen Marktes noch deutlich zu spüren. Man ist vorsichtiger geworden mit neuen Technologien, die die Welt verändern werden. In dieser Zeit machte sich eine kleine Gruppe um Vincent Massol (heute XWiki) und Matt Smith auf, eine der ersten AOP-Bibliotheken in die Welt zu setzen. Was aber verbirgt sich hinter Aspekt-orientierter Programmierung (AOP)?

Dieser Artikel gibt einen Einblick in die wunderbare Welt der Aspekt-Orientierung public class Konto { und die Arbeit an und mit PatternTesting. Konto private double kontostand = 0.0; Was hat sich in den letzten zehn Jahren verändert, außer dass der AspectJ-Compi- public double abfragen() { Kontostand ler inzwischen Eingang in das Eclipse- Öko- return kontostand; System gefunden hat? Sind Aspekte in- zwischen in der Java-Welt angekommen? } abfragen Oder ist AOP nur die Antwort auf die Frage, public void einzahlen(double betrag) { die keinen interessiert? kontostand = kontostand + betrag; einzahlen

Es war einmal … } abheben … eine Programmiersprache, die erfreu- public void abheben(double betrag) { te sich unter Kaffeetrinkern (und nicht nur ueberweisen kontostand = kontostand - betrag; dort) großer Beliebtheit. Aber es fehlte et- was. Man konnte zwar mit Objekten alle } Dinge dieser Welt nachbilden, aber die Re- alisierung von Transaktionen, Autorisierung public void ueberweisen(double betrag, Konto anderesKonto) { oder Logging ging durch alle Klassen und this.abheben(betrag); anderesKonto.einzahlen(betrag); entzog sich meist erfolgreich der Kapselung. } Wie schafft man es, diese „Querschnittsbe- lange“ (auch als „crosscutting concerns“ } bezeichnet) herauszuziehen und in einer eigenen Klasse zu kapseln? Dies waren die Listing 1 Überlegungen, die bereits im letzten Jahr- hundert zu einem neuen Paradigma führ- bin-reich.html), aber ansonsten kann man ten – der Aspekt-orientierten Programmie- hier die eigentliche Business-Logik einer public class Konto { rung (AOP). AOP ist nichts komplett Neues, Konto-Verwaltung noch sehr gut nachvoll- sondern baut auf der Objekt-Orientierung ziehen. Im Gegensatz zu diesen fachlichen private static Logger log = Logger.getLogger(Konto.class) (oder auch der prozeduralen Programmie- Anforderungen (im AOP-Jargon auch als private double kontostand = 0.0; ... rung) auf, bietet jedoch zusätzliche Sprach- „Concern“ bezeichnet) gibt es jede Menge mittel an, um die bereits angesprochenen nicht-fachlicher „Concerns“ wie folgende public void einzahlen(double betrag) { kontostand = Querschnittsbelange zwar nicht in Klassen, Punkte, die sich mit OO-Mitteln schwer kontostand + betrag; aber in Aspekten zu kapseln. kapseln lassen: log.info(„neuer Kontostand: „ + kontostand); } • Protokollierung (Logging) Im Land der Aspekte public void abheben(double betrag) { kontostand = Um uns einen ersten Eindruck von der • Autorisierung kontostand - betrag; log.info(„neuer Kontostand: „ + Aspekt-orientierten Vorgehensweise zu • Sicherheit kontostand); verschaffen, betrachten wir Listing 1 aus • Transaktionen } dem Bank-Bereich. Für eine reale Konto- ... Verwaltung sollte man jetzt zwar nicht Betrachten wir dazu die Anforderung „Alle } unbedingt ein „double“ verwenden (siehe Kontobewegungen müssen protokolliert http://haupz.blogspot.de/2009/01/ich- werden“ (siehe Listing1). Listing 2

Java aktuell 3-2012 | 43 Testen Separation of Concerns public aspect LogAspect { Konto LogAspect Kontostand private static Logger log = Logger.getLogger(LogAspect. class); abfragen einzahlen after(double neu) : set(double Konto.kontostand) && abheben args(neu) { ueberweisen log.info(“neuer Kontostand: “ + neu); }

} Abbildung 1: Separation of Concerns

Listing 3 Achtung: Code-Verschmutzung do-Anweisung geschrieben steht. Damit In Java würde man dieses Problem viel- hat man es geschafft, diese neue Anforde- public void ueberweisen(double betrag, Konto anderes- leicht wie in Listing 2 lösen (die neu rung der Protokollierung in einem eigenen Konto) { hinzugekommenen Anweisungen sind Aspekt zu kapseln (siehe Abbildung 1). assert anderesKonto != null; this.abheben(betrag); ande- resKonto.einzahlen(betrag); kursiv gekennzeichnet). Außer beim Zugriff auf Klassen-Attribu- } Die Business-Logik ist schon etwas te kann man noch bei folgenden Punkten schwieriger zu erkennen. Wenn weitere im Programm eingreifen: Listing 4 Anforderungen wie Transaktionssicherheit oder Autorisierung hinzukommen, wird es • Aufruf einer Methode sehr schnell unübersichtlich. • Ausführen einer Methode public static User login(String name) throws LoginEx- ception { • Behandeln einer Exception assert name != null; Rettung naht • Initialisierung einer Klasse … Wie würde man die obigen Anforderungen • Initialisierung eines Objekts assert user != null; in der Aspekt-Orientierung ausdrücken? In return new user; etwa so: Füge an allen Stellen, an denen das Diese Punkte heißen im AOP-Jargon auch } Attribut „kontostand“ geändert wird, eine „Joinpoints“. Über „Advices“ können diese Log-Anweisung hinzu. Mit AspectJ (einer Stellen dann um weitere Funktionalitäten Listing 5 Aspekt-orientierten Erweiterung von Java) ergänzt werden. Advices sind so etwas wie sähe die Realisierung dieser Anforderung die Methoden der Aspekt-Orientierung public aspect NullPointerTrap { ungefähr so aus (siehe Listing 3). – im obigen Beispiel war es die (einzelne) after() returning(Object ret) : execution(public Ob- „aspect“ ist der Rahmen um das Ganze, Log-Anweisung. ject+ *..*(..)) { in dem die eigentliche Anforderung imple- Damit haben wir alle Zutaten beisam- assert ret != null; mentiert wird. Die tatsächliche Anweisung men, um die Anforderungen auf Klassen } } ist kursiv hervorgehoben und entspricht in (wie bisher) oder Aspekte aufzuteilen und etwa dem, was im obigen Kasten als Pseu- dem Ziel, der „Separation of Concerns“, ein

Listing 6

@MayReturnNull public static User login(String name) { …

}

Listing 7

after() returning(Object returned) : execution(public Object+ *..*(..)) && !execution(@MayReturnNull public Object+ *..*(..)) { ... }

Listing 8 Abbildung 2: Das System als Menge von „Concerns“

44 |

iii iii iiiiii www.ijug.eu

oder andere Ausnahme-Situationen zu signalisieren • Objekte mit einer Null-Semantik (wie „Collections.EMPTY_LIST“) einführen, die als Ersatz für „null“ als Parameter oder Rückgabewert dienen können

Die Anfänge von PatternTesting Die gedankenlose Verwendung von null- Werten ist nur eine von vielen Ursachen für Fehler im ausgelieferten Programm. Weitere, immer wieder gern gemachte Fehler sind fehlende Freigaben von Res- sourcen, Deadlock-Situationen, verges- sene Exception-Handler (mit generierter „e.printStackTrace()“-Anweisung) und viele Abbildung 3: Das Jugendangebot des Landtags von NRW (Stand: 10. April 2012) andere mehr. Einige dieser Kandidaten las- sen sich durch statische Code-Analyse und Tools wie FindBugs oder PMD aufspüren; gutes Stück näher zu kommen. Und das griff in Google erhält man alle JSP-Seiten, für andere Fehlerquellen wie den sorglo- Schönste daran ist, dass wir bei der Ent- in denen „NullPointerException“ auftaucht sen Umgang von null als Parameter oder wicklung nicht immer an alles auf einmal (darunter auch einige Foren – die man ge- Rückgabewert müsste man in den Code denken müssen, sondern uns jetzt immer trost übergehen kann). Dabei ist es eigent- eingreifen, um sie aufzudecken. nur auf einen „Concern“ konzentrieren lich relativ einfach, NullPointerExceptions Wie wir aber bereits gesehen haben, können (siehe Abbildung 2). zu vermeiden – man lässt einfach keine ist dies mit der Aspekt-Orientierung mög- Null-Werte zu, weder als Argument, noch lich und führte dazu, dass Vincent Massol Neues Altes aus der Java-Welt als Rückgabewert (siehe Listing 5). im März 2002 mit PatternTesting eine der Verlassen wir kurz die Welt der Aspekte Wenn jetzt während der Testphase (und ersten AOP-Bibliotheken aus der Taufe und wenden wir uns wieder der Java-Welt umgelegtem „-ea“-Schalter) doch ein null- hob. Anfangs war PatternTesting mehr ein zu. 2002 erschien Java 1.4, das als Sprach- Argument übergeben wird, ist der Schul- „Proof of Concept“, um Architektur- und erweiterung „asserts“ mitbrachte. Damit dige schnell gefunden. Auch wenn man Implementierungs-Entscheidungen au- kann man Sicherungen im Code einbauen, damit NullPointerExceptions drastisch re- tomatisch überprüfen zu können. Es war um die Fehlersuche zu beschleunigen (sie- duzieren kann, ist es ziemlich öde, diese als Sammlung von Aspekten angelegt, die he Listing 4). assert-Anweisungen manuell am Anfang man erweitern und spezifizieren konnte, Aktiviert werden „asserts“ über den und Ende jeder Methode einzufügen. Hier wie weit diese Prüfungen reichen sollte Schalter „-ea“ (enable assertions) beim kommt wieder die Aspekt-Orientierung ins (sofern man sich mit AspectJ auskannte). Start der Java-VM. Übergibt man dann Spiel: Sie erlaubt uns, diese „Querschnitts“- Es gab einen AbstractNullTest, der auf während der Test-Phase (in der man übli- Anforderung zu formulieren (siehe Listing „null“ als Argument oder Rückgabewert cherweise diesen Schalter aktiviert) einen 6). Damit wird der zweite Teil der obigen hinwies, einen AbstractSop-Aspekt, der Null-Parameter an diese Methode, gibt die Anforderung realisiert: Am Ende jeder bei „System.out.println(..)“-Anweisungen assert-Anweisung eine Warnmeldung aus, Methode mit Rückgabewert eine assert- Compiler-Warnungen ausgab oder einen dass die zugesicherte Bedingung verletzt Anweisung einfügen. AbstractDatabaseTest, mit dem man beim wurde, und das Programm wird beendet. Eine der Stärken von AOP ist, dass man Einsatz von Hibernate oder anderer Per- Dadurch kommt man der Fehlerursache über Wildcards mehrere Stellen (im AOP- sistenz-Frameworks Aufrufe aus java.sql sehr viel früher und schneller auf die Spur. Jargon auch als Joinpoint bezeichnet) im unterbinden konnte. Da sich dieses Test-Hilfsmittel noch nicht Programm ansprechen kann, um wie hier bei allen Entwicklern herumgesprochen zusätzliche Überprüfungen einzufügen. AspectJ 1.0 und 1.1 hat, nachfolgend ein Vorschlag, wie man Um auf die Eingangsfrage zurückzukom- In der Anfangsphase arbeitete der AspectJ- damit NullPointerExceptions fangen kann. men („Wie fängt man NullPointerExcep- Compiler noch als eine Art Präprozessor, tions?“): Gar nicht! Man vermeidet einfach der die Aspekte in Java-Code umwandelte, Wie man NullPointerExceptions fängt „null“ als gültigen Wert, indem man sich an bevor er sie an den Java-Compiler weiter- NullPointerExceptions sind mit die ärger- folgende Dinge hält: reichte. Entsprechend war die erste Ver- lichsten Fehler, die anzutreffen sind (siehe sion (v0.2) von PatternTesting auch ein Abbildung 3). Bei der Eingabe von „Null- • Mit Exceptions wie mit einer FinderEx- Proof of Concept für den Einsatz des As- PointerException filetype:jsp“ als Suchbe- ception arbeiten, um „kein Ergebnis“ pectJ-Compilers, zumal auch die Tool- Un-

Java aktuell 3-2012 | 45 Testen

terstützung für die Entwicklung noch in gab. Wichtigste Neuerung war neben der GLOSSAR den Kinderschuhen steckte. Fusion mit AspectWerkz und der Unterstüt- Dies änderte sich mit AspectJ 1.1, das zung von Load Time Weaving die Verwen- Concern 2003 auf dem Markt erschien. Damit wan- dung und Unterstützung von Annotations Spezifische Anforderung oder Ge- delte sich die Architektur grundlegend. – sie können jetzt auch zur Auswahl von sichtspunkt, welche(r) in einem Soft- Der AspectJ-Compiler setzte jetzt auf dem Joinpoints herangezogen werden. ware-System behandelt werden muss, Java-Compiler aus Eclipse auf und konn- Nehmen wir an, wir wollen für die Log- um die übergreifenden Systemziele te so direkt Bytecode erzeugen. Auch die in-Methode „null“ als gültigen Rückga- zu erreichen (nach Ramnivas Laddad, inkrementelle Kompilierung hielt damit bewert zulassen, dann könnten wir dies 2003) Einzug in den AspectJ-Compiler und sorg- durch eine @MayReturnNull-Annotation te zusammen mit AJDT, dem AspectJ-De- anzeigen (siehe Listing 7). Listing 8 zeigt Querschnittsbelang velopment-Tool-Plug-in für Eclipse, dafür, eine Annotation, die von PatternTesting (Crosscutting Concern) dass die IDE- Unterstützung immer besser verwendet wird, um diese Methoden von Dies sind Anforderungen und Dinge wurde. Mit PatternTesting 0.3 wurde 2004 der Überprüfung auszuschließen. wie Transaktionen, Autorisierung oder auf AspectJ 1.1 umgestellt und Unterstüt- Während man in PatternTesting 0.3 noch Security, die sich durch alle Klassen zung für das Avalon-Framework hinzuge- AspectJ-Kenntnisse benötigte, um die be- ziehen und sich mit Mitteln der Ob- fügt. Gleichzeitig übernahm Matt Smith reitgestellten (abstrakten) Aspekte in ein jekt-Orientierung nur schwer kapseln die Projekt- Leitung. Projekt einzubinden, kann ab PatternTes- lassen. ting 0.5 (das 2008 nach vierjähriger Ruhe- Java 5 und AspectJ 5 zeit erschien) diese Bibliothek auch ohne Joinpoint Mit JDK 1.5 (das von Sun als Java 5 ver- solche Kenntnisse eingesetzt werden, da Ein Punkt im Programm, an dem man kauft wurde) hielten 2005 einige Neue- alle Aspekte über Annotationen gesteuert einen –> Advice zur Ausführung brin- rungen Einzug in die Sprache: Generics, werden können. Nach wie vor ist aber auch gen kann. Joinpoints sind zum Beispiel Autoboxing oder Annotations. Auch bei die Erweiterung bestehender Aspekte vor- der Aufruf oder die Ausführung von der AOP- Unterstützung für Java tat sich gesehen und möglich. Als weiterer Vorteil Methoden, der Zugriff auf Attribute einiges: AspectJ und AspectWerkz fusio- haben die verwendeten Annotationen oder die Initialisierung von Objekten. nierten. AspectWerkz war neben AspectJ auch Dokumentations-Charakter. So zeigt ebenfalls eine Aspekt-orientierte Erwei- die „@MayReturnNull“-Annotation dem Pointcut terung für Java, webte aber die Aspekte Entwickler an, dass die Login-Methode Pointcuts sind ein AOP-Sprachmittel beim Laden einer Klasse ein (LTW: Load auch „null“ als Rückgabe-Wert liefern kann. und dienen dazu, einzelne oder meh- Time Weaving). Dies ist der Grund dafür, rere Joinpoints zusammenzufassen. dass AspectJ heute neben dem Compile Von Maven 1 nach Maven 2 Time Weaving (CTW) auch diesen Weg un- 2008 war ein sehr bewegtes Jahr in der Advice terstützt, um die Aspekte in den Code zu Geschichte von PatternTesting. Der Autor Der Code, der an den –> Pointcuts aus- bekommen. Beide Verfahren haben Vor- hatte ein Jahr zuvor Kontakt zu Vincent geführt wird. und Nachteile, sodass es durchaus sinnvoll Massol und Matt Smith und ihnen unter ist, sie zu unterstützen: anderem seine Hilfe bei PatternTesting an- Compile-Time-Weaving (CTW) geboten, da seit ein paar Jahren keine Wei- Beim Compile-Time-Weaving wird • Beim Compile Time Weaving (CTW) terentwicklung mehr zu erkennen war. Ehe vom Compiler aus den Java-Klassen werden Laufzeit-Fehler vermieden, da er sich versah, hatte er die Projekt-Leitung und Aspekten direkt während des die Aspekte bereits durch den Compiler inne, da beide mit anderen Projekten be- Compile-Vorgangs Code erzeugt. überprüft und übersetzt wurden. schäftigt waren. • Mit Load Time Weaving (LTW) können Anfangs befasste der Autor sich noch Load-Time-Weaving (LTW) auch Bibliotheken von Dritt-Anbietern hauptsächlich damit, den Build und die Beim Load-Time-Weaving wird über instrumentiert („kompiliert“) werden. Projekt-Struktur von Maven 1 auf Maven einen Weaving-Agent während des Prinzipiell ist dies auch mit CTW mög- 2 umzustellen. Dabei leistete ihm das „as- Lade-Vorgangs der Byte-Code der ge- lich, allerdings verbieten manche Li- pectj-maven“-Plug-in wertvolle Dienste bei ladenen Klassen erweitert. zenz-Bestimmungen die Veränderung der Kompilierung. Als Infrastruktur für den von Jar- Dateien. Build wurde anfangs Continuum von Apa- Avalon-Framework che eingesetzt, inzwischen läuft der Build Ein ehemaliges Komponenten-Frame- Gleichzeitig passte man sich mit der Num- mit Jenkins auf einem ausgedienten Mac- work für serverseitige Container, das merierung der Java-Versionierung an. Nach Mini (PowerPC, Ubuntu). Während für die inzwischen eingestellt wurde. AspectJ 1.2 (das sich von AspectJ 1.1 nur sonstige Infrastruktur (CVS, Wiki) Source- durch eine Verbesserung der Tool-Kette un- forge.net sehr nützlich ist, sieht es im Be- terschied) kam AspectJ 5, das sich (analog reich der öffentlichen Build-Server noch zu Java) intern als Version 1.5 zu erkennen mau aus. Einzig CloudBees.com scheint

46 |

iii iii iiiiii www.ijug.eu

hier Angebote für Open-Source-Projekte zu unterbreiten, deren kostenlose Res- sourcen sich aber als nicht ausreichend für PatternTesting erwiesen haben. Die nächs- ten Schritte waren dann die Umstellung auf AspectJ 5, die Verwendung von Anno- tationen sowie die Weiterentwicklung der vorhandenen Aspekte.

Performance-Probleme bis AJDT 1.6.1 Mit dem Anwachsen der Code-Basis und der Entwicklung neuer Aspekte litten vor allem größere Projekte unter der fehlende Performance des AJDT-Plug-ins in Eclipse 3.3. Dies änderte sich erst mit Eclipse 3.4 und AJDT 1.6.2. Vor allem die Möglichkeit, eigene Warnungen und Fehler schon wäh- rend der Compile-Phase ausgeben zu las- sen, erhöhten die Wartezeiten nach dem Abbildung 4: Der ClasspathMonitor innerhalb der JConsole Speichern der Sourcen, wenn die automa- tische Kompilierung angestoßen wurde. Dies führte schließlich dazu, dass Pattern- Szenario von PatternTesting Exception. Concurrent), der die gleiche Funktionalität Testing aufgeteilt wurde in: Einige Exceptions werden um zusätzliche besitzt, aber zur Beschleunigung der Tests Informationen angereichert, um die Feh- alle Test-Methoden parallel ausführt. Eine • PatternTesting Runtime (die Basis für lersuche zu erleichtern. Und man erhält weitere Beschleunigung ermöglicht die Pa- alle anderen Unter-Projekte) darüber hinaus Unterstützung für das Tes- rallelSuite (ab 1.2), die alle in einer Suite zu- • PatternTesting Check-CT (Compile- ten der Exception-Handler. sammengefassten Klassen parallel startet. Time-Checks) Durch die Abhängigkeit von PatternTes- • PatternTesting Check-RT (Runtime- PatternTesting 2010 ting Runtime zu JUnit 4.8 laufen diese Run- Checks) 2010 war es dann endlich soweit: Die Ver- ner leider nicht in älteren Eclipse-Versionen. sion 1.0 wurde am 20. Juni 2010 ausgelie- Dies wird sich aber mit der nächsten Version Dadurch war man jetzt in der Lage, wäh- fert. Gleichzeitig gab es mit http://pattern- ändern – hier werden auch ältere Versionen rend der Arbeit mit Eclipse die Compile- testing.org eine neue Heimat, die von der bis Eclipse 3.4 (das z.B. Basis für IBMs RAD Time- Checks wegzulassen und sie nur Agentes GmbH gesponsert wird. Damit 7.5 ist) unterstützt werden. während des Daily Builds zu aktivieren. änderten sich auch die Maven- Koordinaten Weiterer Vorteil dieser Trennung war, dass für die aktuelle Version von PatternTesting man auch die Runtime-Checks weglassen Runtime (siehe Listing 9). Seit Version 1.0.3 org.patterntesting konnte (z.B. nach der Test-Phase, wenn ist PatternTesting auch wieder im zentralen patterntesting-rt die Anwendung ausgeliefert werden soll), Maven-Repository zu finden, nachdem es 1.2.10-YEARS ohne dass der Source-Code geändert wer- zwischenzeitlich durch diverse Umstellun- den muss. Lediglich PatternTesting Run- gen dort längere Zeit nie angekommen war. Listing 9 time muss mit ausgeliefert werden, da dort die ganzen Annotationen enthalten sind. JUnit-Unterstützung Ein Jahr später kam dann mit Pattern- Mit 1.0 gab es auch einen eigenen JUnit- @RunWith(SmokeRunner.class) Testing Exception noch ein weiteres Runner, um bestehende Tests bei Bedarf public class Rot13Test { @Broken(till = “01-Jun-2012”) Projekt für die Unterstützung aussage- ausblenden oder als „kaputt“ kennzeich- @Test kräftigerer Exceptions hinzu. Wenn etwa nen zu können (siehe Listing 10). public final void testCryptBobsFile() throws ein Socket mit „Socket socket = new So- Mit dem SmokeRunner können Tests als IOException { ... cket(„10.11.12.13“, 80);“ geöffnet wird und „Broken“ (mit Fix-Datum) oder als Integra- } der angegebene Rechner (10.11.12.13) tions-Tests (die während dem Entwickler- @IntegrationTest(“online access needed”) @Test nicht erreichbar ist, bekommt man eine Test ausgeblendet werden) gekennzeichnet public final void testCryptURI() throws IOException { ConnectException mit der lapidaren Mel- werden. Auch können Tests an bestimmte ... dung „Connection refused“. Wäre es nicht Plattformen oder Bedingungen verknüpft } sinnvoller, wenn stattdessen „Connection werden, um ausgeführt zu werden. } to 10.11.12.13 refused“ ausgegeben wer- Der kleine Bruder des SmokeRunners den würde? Dies ist genau das Einsatz- ist der ParallelRunner (aus PatternTesting Listing 10

Java aktuell 3-2012 | 47 Interview

Rückblick und Ausblick PatternTesting hat sich von einer reinen kräftigere Fehlermeldungen zu bekommen. Was haben uns die letzten zehn Jahre im AspectJ-Bibliothek zu einem Hybrid entwi- Wer jetzt Lust auf PatternTesting bekom- Java-Umfeld gebracht? Der größte Sprung ckelt. Die Runtime-Komponente kann auch men hat, findet im PatternTesting-Wiki un- war sicherlich der von Java 1.4 auf Java 5, als reine Java-Bibliothek eingesetzt werden ter „Getting Started“ (siehe http://source der uns neue Sprach-Features bescherte. und man erhält neben dem SmokeRun- forge.net/apps/mediawiki/patterntesting/ Bei Java 6 lag der Fokus auf dem Desktop, ner noch einige Tester, um beispielsweise index.php? title=Getting_Started) ein ein- Java 7 ließ fast 5 Jahre auf sich warten, „equals(..)“- und „hashCode()“-Implemen- faches Hello-World-Beispiel sowie mit „Tes- nachdem viele geplante Features auf Java tierungen zu überprüfen, die Serializable- ting with PatternTesting“ eine Anleitung, 8 verschoben wurden. Eigenschaft zu testen oder Dateien auf wie man den SmokeRunner und die ver- Bei AspectJ sind vor allem AspectJ 5 Gleichheit zu überprüfen. Ein ClasspathMo- schiedenen Tester einsetzen kann. und die Vereinigung mit AspectWerkz her- nitor gibt Aufschluss über den Classpath vorzuheben. Danach hat sich am Sprach- und findet unter anderem doppelte und Links Kern nichts geändert, lediglich die Perfor- inkompatible Klassen (siehe Abbildung 4). 1. PatternTesting: http://patterntesting.org/ mance und die IDE-Unterstützung wurden Leider funktioniert der ClasspathMonitor 2. PatternTesting Wiki: http://sourceforge.net/ apps/mediawiki/patterntesting/ AspectJ- stetig verbessert. Die Versionsnummer nur mit der Sun-VM korrekt. Für die Java-VM Homepage: http://eclipse.org/aspectj/ wurde dabei an Java angepasst – aktuell von IBM ist jedoch Besserung in Sicht: Hier 3. Performance Boost with Eclipse 3.4: http://oli. ist AspectJ 1.7 (oder kurz: AspectJ 7). wird es einen PatternTesting Agent geben, blogger.de/20090323/ Der große Durchbruch für AspectJ lässt der die notwendigen Informationen für den Oliver Böhm noch auf sich warten. Aber AOP-Techniken ClasspathMonitor sammelt. Was bleiben [email protected] haben sich in der Zwischenzeit ihren Platz wird, ist die Unterstützung für Java 5, da es in der Java-Welt erobert, um zusätzliche noch einige Projekte gibt, die nicht auf ein Oliver Böhm beschäftigt sich mit Anforderungen im Code unterzubringen, aktuelleres JDK umschwenken können oder Java-Entwicklung unter Linux und Aspekt-Orientierter SW-Entwick- ohne bestehende Klassen zu verändern. dürfen. Dazu passt auch die Unterstützung lung. Neben seiner hauptberuf- Manche Frameworks agieren dazu als älterer JUnit-Versionen, um PatternTesting lichen Tätigkeit als JEE-Architekt Java-Agent oder als Proxy (zum Beispiel auch mit älteren Eclipse-Versionen einset- bei T-Systems ist er Buchautor, einige Mock-Frameworks), andere setzen zen zu können. Ferner ist die Unterstützung Projektleiter bei PatternTesting dazu einen eigenen Classloader ein (etwa weiterer Exceptions (wie der SQLException) und Board-Mitglied der Java User JBoss-AOP). geplant, um im Falle eines Falles aussage- Group Stuttgart.

„Von den Erfahrungen der anderen zu profitieren, ist essentiell …“

Usergroups bieten vielfältige Möglichkeiten zum Erfahrungsaustausch und zur Wissensvermittlung unter den Java-Entwicklern. Sie sind aber auch ein wichtiges Sprachrohr in der Community und gegenüber Oracle. Wolfgang Taschner, Chefredakteur der Java aktuell, sprach darüber mit Tony Fräfel, dem Vorsit- zenden der Swiss Oracle User Group (SOUG).

Wie bist du zur SOUG gekommen? Fräfel: Die SOUG ist ein unabhängiger den praktischen Erfahrungen, die andere Verein. Ein siebenköpfiger Vorstand ist Mitglieder gemacht haben. Wir ermöglichen Fräfel: 1987 hat sich mein damaliger Ar- verantwortlich für die Aktivitäten. Er wird es, Kontakte auf nationaler und internationa- beitgeber für das rDBMS Oracle entschie- unterstützt von einem Komitee, das für die ler Ebene zu knüpfen und zu pflegen. Wich- den. Die Oracle-Kundschaft in der Schweiz Aktivitäten in der französischsprechenden tig ist uns auch unsere Unabhängigkeit – wir war damals noch überschaubar und ein Schweiz verantwortlich ist, sowie von un- vertreten die Interessen unserer Mitglieder, Erfahrungsaustausch sehr willkommen. serem Sekretariat. nicht diejenigen von Herstellern. In der SOUG fanden wir erfahrene Oracle- Spezialisten und ich durfte meine Firma Was zeichnet die SOUG aus? Wie viele Veranstaltungen gibt es pro Jahr? dort vertreten. Fräfel: Im Fokus steht klar der Erfahrungs- Fräfel: Zurzeit sind es circa vier Special- Wie ist die SOUG organisiert? austausch. Unsere Mitglieder profitieren von Interest-Group-Meetings pro Jahr in der

48 |

iii iii iiiiii www.ijug.eu

deutschsprachigen Schweiz und etwa zwei Fräfel: Oracle soll dafür sorgen, dass Java in der Westschweiz. Dazu starten wir unter Open Source bleibt und die namhaften dem Namen „SOUG bi dä Lüt“ (SOUG bei Hersteller an der Weiterentwicklung be- den Leuten) mit lokalen Meetings am spä- teiligt sind. Indirekt profitiert dann auch teren Nachmittag. Nicht zu vergessen ist Oracle, obwohl, wie der Rechtsstreit mit unsere Teilnahme an der DOAG Konferenz Google zeigt, Oracle natürlich auch direkt + Ausstellung in Nürnberg, die aufgrund profitieren will. Ein Sieg von Oracle wäre in unserer intensiven Zusammenarbeit mit meinen Augen schlecht für Java und könn- der DOAG zur SOUG-Jahreskonferenz te sich auch für Oracle als Bumerang er- avancierte. Durch unsere Kooperationen weisen. Ich bin gespannt, wie das Gericht mit anderen Usergroups haben unsere entscheidet. Mitglieder auch die Möglichkeit, an vielen Veranstaltungen zu günstigen Mitglieder- Wie sollte sich die Community gegenüber konditionen teilzunehmen. Oracle verhalten?

Was motiviert dich besonders, als Vorstand Fräfel: Als SOUG arbeiten wir eng und die SOUG zu führen? gut mit Oracle zusammen. Wir sind aber nicht mit allem einverstanden, was Oracle Fräfel: Eine Usergroup macht für mich Tony Fräfel, Präsident der Swiss macht. Konstruktive Kritik wird von unse- Sinn. Als Mitglied habe ich viel profitiert Oracle User Group (SOUG) ren Oracle-Kontakten offen aufgenommen und mit meinem Engagement im Vorstand und nach Möglichkeit auch berücksich- möchte ich dafür sorgen, dass möglichst tigt. Die Unabhängigkeit von Oracle ist in viele Leute auch davon profitieren können. Was hast du bei der Übernahme von Sun der Java Community noch stärker veran- durch Oracle empfunden? kert als in der SOUG und das soll auch so Was bedeutet Java für dich? bleiben. Unabhängig heißt für mich aber Fräfel: Mit der SOUG waren wir ja sozusa- miteinander und nicht gegeneinander. Fräfel: Nach 4GL und CASE war Java für gen auf der Seite von Oracle. Mein erster Ein konstruktiver Dialog soll von beiden mich zuerst ein Rückschritt und ich fühlte Gedanke war, dass Oracle den schon lange Seiten angestrebt werden. Mein Eindruck mich wie zu Beginn meiner Informatik- versuchten Einstieg ins Hardware-Business ist, dass verschiedenste Vertreter der Java Karriere als Assembler-Programmierer. Die mit Sun nun wohl schaffen werde. Inte- Community von Oracle mit offenen Armen Vorteile der Objektorientierung und Platt- ressant war für mich aber die Frage, was empfangen werden und damit einen star- formunabhängigkeit wurden mir jedoch mit den Software-Assets von Sun gesche- ken Einfluss auf die Weiterentwicklung von schnell bewusst. Auch wenn ich heute hen würde. Die meisten Produkte würden Java haben. nicht mehr selber programmiere, ist Java wohl, wie in solchen Situationen üblich, Tony Fräfel für mich ein wichtiges Instrument, um die in die Oracle-Produkte integriert oder [email protected] immer komplexer werdende IT-Infrastruk- stillgelegt werden. Was aber mit Java und tur im Griff zu haben. Unterschiedliche MySQL? Beide sind für mich Symbole von Plattformen wird es auch in Zukunft geben Open Source und Oracle ist, wie wir alle Zur Person: Tony Fräfel – es ist aber nicht nötig, dass jede Plattform wissen, sehr profitorientiert. Java kommer- ihre eigene, proprietäre Programmierspra- ziell auszuschlachten würde wohl auch Anfang der 1980er Jahre begann che besitzt. Oracle nicht gelingen, und wenn sie Java Tony Fräfel seine Informatik-Lauf- stilllegen wollten, würden es andere unab- bahn als Programmierer/Analytiker. Welchen Stellenwert besitzt die Java-Com- hängig von Oracle weiterentwickeln. Auf Von 1987 bis 2000 war er im Umfeld munity für dich? jeden Fall war ich gespannt, wie es mit Java von Oracle als Consultant und Pro- weitergehen würde. jektleiter tätig, danach in verschie- Fräfel: Der Erfahrungsaustausch ist für denen Management-Positionen im mich im vielfältigen Java-Umfeld noch Wie sollte sich Java weiterentwickeln? Bereich Anwendungsentwicklung wichtiger als bei den Oracle-Produkten. und Integration. Heute ist er als Niemand kann sich all die Frameworks und Fräfel: Ganz klar als Open Source. Nur so Senior Manager bei der Trivadis AG Weiterentwicklungen anschauen. Von den bleibt für mich die Plattformunabhängig- verantwortlich für das Ressourcen- Erfahrungen der anderen zu profitieren, ist keit erhalten. Das ist in meinen Augen eine Management. Tony Fräfel enga- essentiell. Mit der Mitgliedschaft der SOUG große Chance für die Hersteller – sowohl giert sich seit 1991 im Vorstand im iJUG ermöglichen wir unseren Mitglie- hardware- als auch softwareseitig. der SOUG: zuerst als Redakteur des dern die Vernetzung mit noch mehr Java- SOUG Newsletters, seit 2009 als Prä- Spezialisten und können noch attraktivere Wie sollte Oracle deiner Meinung nach mit sident. Java-Events in der Schweiz anbieten. Java umgehen?

Java aktuell 3-2012 | 49 Spring Cloud

Cloud Foundry: die Spring Cloud

Eperon Julien, Trivadis AG

Die Java-kompatible Cloud-Plattform „Spring Cloud“ wird durch Cloud Foundry bereitgestellt. Der Artikel zeigt den Reifegrad der Plattform und ihre Eignung für unternehmensweite Anwendungen. Zudem erleichtert ein Vergleich von Spring Cloud mit anderen Cloud-Angeboten das Verständnis und die Beurteilung der Technologie.

Zum Einstieg eine kleine Einführung in die Data-Center-Space) an. Installation und dedizierte Umgebung in der Cloud abzu- drei Kategorien von Cloud-Angeboten: Konfiguration eines Betriebssystems bilden versucht und lediglich Aspekte wie sowie jeglicher Software sind dem Kun- Persistenz oder Hochverfügbarkeit auf das • Software-as-a-Service (SaaS) den überlassen. Oft stehen aber vor- jeweilige Cloud-Angebot anpasst. Es ist bei SaaS ist ein Softwareverteilungs-Modell, konfigurierte Images als Basis zur Ver- solchen Angeboten nicht möglich, seine bei dem Anwendungen entweder durch fügung. Anwendung offline zu testen, und auch den Anbieter der Anwendung oder –– Amazon EC2 (http://aws.amazon. nicht, eine realitätsnahe Kopie der Cloud- durch einen separaten Provider gehos- com/ec2/): Einer der ersten großen Umgebung lokal aufzusetzen. Typischer- tet werden. Typische Vertreter sind: Cloud-Anbieter. Cloud Foundry be- weise richtet man eine dedizierte Entwick- –– .com (http://www.sales- nutzt diesen Service im Hintergrund. lungs- und Testumgebung in der Cloud ein. force.com): Dieses Unternehmen Cloud Foundry geht hier einen ganz an- bietet seit rund zehn Jahren ein Cloud-Foundry-Grundlagen deren Weg. Das zentrale Angebot besteht CRM-System als Service an. Sales- Die Cloud-Foundry-Plattform hat in ih- aus einer Virtual Machine, genannt „Micro force hat in dem Bereich eine solide rer Geschichte die zweite Evolutionsstufe Cloud Instance“. Diese VM lässt sich auf der Reputation aufgebaut. erreicht. Die erste Version baute auf den lokalen Entwicklermaschine im VMware- –– Business Productivity Online Stan- Amazon-Services EC2 und S3 auf und war Player starten. So hat der Entwickler die dard (BPOS, http://www.microsoft. auch von dieser Infrastruktur abhängig. gesamte Cloud lokal bei sich. Die Vorteile com/online/): Eine von Microsoft be- Der Hauptbestandteil der ersten Version liegen auf der Hand: Der Entwickler ist völ- reitgestellte Online-Office-Lösung war ein Abstraktionslayer in Form einer lig unabhängig von einem Netz-Zugang und als Alternative zu den lokal in- Management-Console. Mit dieser ließen und hat immer alles, was er benötigt, bei stallierten Microsoft-Office-Produk- sich Java-Web-Anwendungen und dazu- sich. Für den Cloud-Anbieter lohnt es sich ten positioniert. gehörende Dateien in die Cloud hochla- ebenfalls, denn es dümpeln bei ihm kei- • Platform-as-a-Service (PaaS) den und verwalten. Die aktuelle Version ne Entwicklungs-Instanzen herum, die Das Paradigma PaaS bietet via Internet beschränkt sich nicht mehr nur auf Java, dauerhaft Ressourcen belegen, aber nur erreichbare Server mit installiertem und sondern unterstützt beispielsweise auch selten benutzt werden. Es ist deshalb gut gewartetem Betriebssystem. Typische Ruby und Node.js. Zudem müssen als möglich, dass dieses Modell Schule macht Vertreter sind: Infrastruktur-Grundlage auch nicht mehr und dieser Ansatz ein Standard für Cloud- –– Windows Azure (http://www.micro- zwingend die Amazon-Angebote ver- basierte Entwicklung wird. soft.com/windowsazure/): Dies ist die wendet werden. Die erste Version ist als Mit Cloud Foundry verkürzt sich die Cloud-Infrastruktur von Microsoft. „Classic“-Version immer noch verfügbar Zeit wesentlich, bis eine Anwendung „up –– Google App Engine (http://code.goog- (siehe „Links“ am Ende des Artikels). and running“ ist. Beschaffung und Inbe- le.com/appengine/): Google App En- Cloud Foundry befindet sich immer triebnahme der Hardware fallen komplett gine ist die Cloud-Lösung von Google. noch im Beta-Stadium und bietet unter weg. Die grundlegende Installation und • Infrastructure-as-a-Service (IaaS) anderem auch deshalb noch keine kom- Konfiguration von Betriebssystem, Daten- Diese Kategorie bietet die größten Frei- merzielle Version an. Die Plattform basiert bank und Application-Server übernimmt heiten bei der Wahl der Software, je- ausschließlich auf Open-Source-Software. Cloud Foundry. In der Micro Cloud VM ist doch gleichzeitig die wenigsten Opti- Sie unterscheidet sich von anderen Cloud- alles Notwendige bereits installiert und onen hinsichtlich Vorkonfiguration und Angeboten hauptsächlich in der Art, wie konfiguriert. Falls erforderlich, kann der vorhandener Services. IaaS bietet ledig- Anwendungen dafür entwickelt werden. Entwickler über die Kommandozeile selber lich die Server-Hardware und zugehö- Üblicherweise gehen die Cloud-Angebo- Hand bei der Konfiguration der VM-Instanz rige Technologie (Netzwerk, Storage, te davon aus, dass man seine bisherige, anlegen.

50 |

iii iii iiiiii www.ijug.eu

wickler angesprochen. Es wird in Zukunft ein kommerzielles Angebot auf cloud- foundry.com geben. Gerüchteweise sollen die Preise mit denen einer Private Cloud auf vSphere-Basis vergleichbar sein. Von Cloud Foundry gibt es jedoch noch keine offiziellen Preispläne oder Preisvergleiche.

Technische Details Micro Cloud Foundry empfiehlt die Benut- zung ihrer eigenen Virtual Machine, die in einem VMware Player oder einem kompa- tiblen Produkt gestartet werden kann. Sie enthält die folgenden Software-Pakete, ausnahmslos Open-Source-Produkte (gül- tig für Version 1.1.0 der Micro Cloud VM):

• Java 1.6 (JRE 1.6.0_24-b07): Die Java Vir- Abbildung 1: Verwaltung einer installierten Anwendung aus der STS heraus tual Machine von Oracle (http://www. java.com) • Nginx 0.8.54: Ein HTTP-Server und Re- Aus Sicht des Entwicklers ist die Ziel- wesentlich umfangreichere Kontrolle und verse-Proxy (http://www.nginx.org/) plattform durch die Micro Cloud VM vor- größere Flexibilität. Die Art der Applikati- • Tomcat 6.0.32: Der oft benutzte Java gegeben. Darin ist Cloud Foundry der onen auf diesen beiden Plattformen kann Web Application Server von Apache Google App Engine ähnlich. Auf der Micro jedoch sehr ähnlich sein. Bekannterweise (http://tomcat.apache.org/) Cloud VM hat der Entwickler aber Zugriff schränkt Google jedoch auch den Web- • MySQL 5.1: Relationale Datenbank auf Maschinen-Ebene, ähnlich wie er es Entwickler ein. So ist nur ein Subset der (http://www.mysql.com/) in einer Amazon EC2-Instanz hat. Zudem Klassen aus dem JDK verwendbar. Zudem • PostgreSQL 9.0: Relationale Datenbank lassen sich Cloud-Foundry-Anwendungen schreibt Google statt einer relationalen (http://www.postgresql.org/) potenziell in jeder Cloud publizieren, die Datenbank die Verwendung ihres Data- • MongoDB 1.8: NoSQL-DB (http://www. das CF-API implementiert hat. Dieses API stores vor. Dafür muss man sich in einer mongodb.org/) ist Open-Source und lizenzkostenfrei. Falls Cloud-Foundry-Anwendung mehr darum • Redis 2.2 Key-Value Store (http://redis.io) sich das Modell durchsetzt, werden andere bemühen, diese skalierbar zu entwickeln. • RabbitMQ 2.4 Messaging (http://www. Cloud-Anbieter davon profitieren wollen. Die Vorgaben der App Engine führen di- rabbitmq.com/) Zurzeit ist allerdings kein weiterer CF-API- rekt zu einer skalierbaren Architektur. Dies • Unterstützung der folgenden Runtimes: Anbieter bekannt. erlaubt es Google wiederum, bei Bedarf Java 1.6, Node.js 0.4.5, Ruby 1.8 und 1.9 Im Vergleich zu anderen Cloud-Ange- einfacher zu skalieren (siehe Tabelle 1). • Unterstützung für die folgenden Frame- boten wie der Google App Engine, die die Die Benutzung der Micro Cloud Found- works: Grails, Ruby on Rails 3, Sinatra, Basis-Plattform dem Benutzer nicht zu- ry ist momentan noch gratis. Allerdings reine Java-EE WebApps (Servlet 2.5), gänglich machen, bietet die Cloud Foundry werden damit auch hauptsächlich die Ent- Node.js, Lift, Spring

Amazon EC2 Micro Cloud Foundry Google App Engine

OS Beliebig Cent OS Google-eigen Programmier-Sprache Beliebig Gesamter Java-Stack Teile des Java-Stacks, Python Deployment- Komplexität Große Unterschiede Ein paar Klicks Skripte und Shortcuts Unterhalt/Support Sehr große Community Noch Beta Mittelgroße Community Plattform-Bindung Lediglich Bindung an die Infra- Bindung an Infrastruktur, OS und Bindung an gesamte Plattform (die struktur Application Server, falls die Micro aber sehr nahe an Java ist) Cloud VM benutzt wird Preismodelle Verschiedene Preispläne Noch kein kommerzielles Angebot Relativ einfache Preispläne

Tabelle 1: Vergleich von Cloud Foundry und App Engine

Java aktuell 3-2012 | 51 Spring Cloud

Wie aus der Liste ersichtlich ist, unter- stützt die VM auch Nicht-Java-Runtimes und -Frameworks wie Ruby und Node.js. Aktuell können Java-Anwendungen auf zwei Arten in die Micro Cloud Foundry in- stalliert werden: Man kann entweder die „vmc“ benutzen, die Kommandozeilen- basierte VM-Konsole, oder man geht den direkten Weg und installiert direkt aus Ec- lipse beziehungsweise aus der Spring Tool Suite (STS, siehe Abbildung 1). Sowohl auf der Kommandozeile als auch in der STS können Einstellungen der Applikation vorgenommen werden, bei- spielsweise in Bezug auf die Anzahl der zu verwendenden Instanzen, die Speicher-Zu- teilung und die Konfiguration abhängiger Services. Die Kommandozeilen-Version ist allerdings ausgereifter als die STS und bie- Abbildung 2: Die Micro Cloud Foundry Virtual Machine tet häufig mehr Optionen an. Als Ausgleich ermöglicht die STS komplexere Vorgänge auf Knopfdruck. Man erhält zum Beispiel Benutzung der Cloud Foundry Tools und ein Maven-Plug-in für einfaches den direkten Zugriff auf Dateien in den In- Das Prinzip der Micro Cloud Foundry er- automatisiertes Deployment zu nennen. stanzen über eine „Remote Systems View“. fordert während der Entwicklung von An- Das Cloud Foundry API ist, wie erwähnt, Das Konzept der Instanzen erlaubt Hoch- wendungen weder privaten noch öffentli- öffentlich. Somit kann prinzipiell jeder- verfügbarkeit. Als Load Balancer wird Nginx chen Zugang zu einer Cloud-Infrastruktur. mann ein Toolset zur Verwaltung der De- den Tomcat-Servern vorgeschaltet. Alle As- Stattdessen betreibt jeder Entwickler seine ployments schreiben. Ein Plug-in, das die- pekte werden durch den Server transparent Cloud-Instanz als lokale VM auf seinem Ent- ses API benutzt, wurde kürzlich für die IDE verwaltet. Eine Basis-Konfiguration ist stan- wicklungsrechner. Wenn die Anwendung IntelliJ IDEA angekündigt. dardmäßig vorhanden. Muss ein Entwickler für den produktiven Betrieb bereit ist, lässt tiefer in die Konfiguration eintauchen, kann sie sich prinzipiell in jeder Cloud instal- Nachteile und Alternativen er sich jederzeit über die Kommandozeile lieren, die kompatibel zum Micro-Cloud- Wie bei jedem Cloud-Angebot besteht auf den Server einloggen und hat vollen Foundry-API ist. Da das Cloud-Foundry- der größte Nachteil der Cloud Foundry Zugriff auf alle lokalen Ressourcen. Angebot immer noch im Beta-Stadium darin, dass keine volle Kontrolle über je- Cloud Foundry bietet natürlich auch ei- ist, gibt es noch keinen kostenpflichtigen des Detail der Maschine und den Deploy- nen Monitoring-Service, der die installier- Support und damit einhergehend natür- ment-Prozess erlangt werden kann. Die ten Anwendungen überwacht. Durch die lich auch keine Betriebsgarantien. Tatsache, dass das API öffentlich ist und Kommandozeile werden vergangene Ab- Auch wenn die Cloud-Foundry-VM die Cloud-Foundry-VM zu 100 Prozent mit stürze, die durch Cloud Foundry registriert komplett vorinstalliert geliefert wird, kann Open-Source-Technologien gebaut wurde, wurden, ans Tageslicht gebracht. Natürlich es dennoch sein, dass einige weitere Ein- schwächt diesen Nachteil ein wenig ab. lassen sich auch die Logs einsehen. stellungen vorgenommen werden müs- Die Cloud Foundry kann durchaus als Mit Cloud Foundry lässt sich direkt nur sen. Beispiele sind Umgebungsvariablen produktionsreif bezeichnet werden. Die- ein limitiertes Set von Datenbanken ver- oder zusätzliche Benutzer für den Zugriff se Aussage bezieht sich hauptsächlich wenden. Für E-Mail gibt es keine direkte auf externe Systeme (siehe Abbildung 2). auf die Infrastruktur. Das Tooling und die Unterstützung. Solche Services können API wurden in der Vergangenheit häufi- aber mit Java-Mitteln einfach selber erstellt Integration in die Entwicklungsumgebung gen auch konzeptionellen Anpassungen werden. Schließlich steht einer auf Cloud SpringSource bietet von Haus aus in der unterworfen, was für den breiten Einsatz Foundry betriebenen Java-Anwendung IDE SpringSource Tool Suite (STS) integrier- in Unternehmen ein Risiko darstellt. Die der gesamte Java-Stack zur Verfügung und te Unterstützung für Cloud Foundry. Damit Cloud-Foundry-Konsole wird lediglich zur es lassen sich somit prinzipiell alle durch lassen sich Deployments in die Cloud oder Konfiguration der Instanzen verwendet. Java unterstützten Services verwenden. auf die lokale VM per Drag & Drop ausfüh- Die Hauptanforderungen an ein Produk- Zudem bietet die Micro Cloud Foundry ren. Mit der Ruby-basierten Kommando- tivsystem wie Ausfallsicherheit, Skalie- von Haus aus Unterstützung für Ruby und zeile ist dieselbe Aufgabe ebenfalls sehr rung, Security und Backup werden bereits Node.js. Diese beiden Frameworks ste- einfach zu erledigen und besteht aus ei- durch die Cloud-Infrastruktur abgedeckt. hen zur Service-Implementation natürlich nem Einzeiler. Als weitere nützliche Werk- Wirklich vergleichbare Alternativen zur ebenso zur Verfügung. zeuge für die Entwicklung sind die Cloud Cloud Foundry existieren zurzeit nicht. Am

52 |

iii iii iiiiii www.ijug.eu

nächsten kommt Amazon Elastic Beanstalk. tuelle Konzept mehr Bestand hat und es in in einem annehmbaren Rahmen. Da die Dieser Service bietet eine Ablaufumgebung naher Zukunft nicht umgekrempelt wird. Cloud Foundry im Gegensatz zu früheren für Java-Web-Applikationen, ist aber auch Die Benutzung der Plattform ist aus Versionen die Wahl der Frameworks nicht auf diese beschränkt. Ruby- oder Node.js- Entwicklersicht immer noch gratis. Es wird mehr so stark einschränkt, öffnet sich der Anwendungen wie bei der Cloud Foundry aber in Zukunft kostenpflichtige Enter- Anwendungsbereich. lassen sich auf dieser Plattform nicht betrei- prise-Versionen geben. Es existiert bisher ben. Es gibt bei AWS Beanstalk auch keine noch sehr wenig Literatur zum Thema Links Möglichkeit, sich für die Entwicklung ein „Cloud Foundry“. Dies kann als mangeln- • Cloud Foundry Homepage: http://www.cloud- VM-Image lokal zu installieren. des Interesse auf Entwicklerseite gedeutet foundry.com werden. • Cloud Foundry Open-Source-Plattform: http:// www.cloudfoundry.org Zukünftige Entwicklung Es ist jedoch davon auszugehen, dass • Cloud Foundry Maven-Plug-in: https://github. Cloud Foundry weist noch ein gewisses das Fehlen von professionellem Support com/cloudfoundry/vcap-java-client/tree/mas- Entwicklungspotential auf. Hier sind einige und Betriebsgarantien die Hauptursache ter/cloudfoundry-maven-plugin der Features, die in naher Zukunft auf dem für die noch dürftige Verbreitung ist. • Classic-Version der Cloud Foundry, die für In- Plan stehen: stanzen der ersten Generation verwendet wird: Fazit https://classic.cloudfoundry.com • Die Möglichkeit, andere Clouds zu nut- Es empfiehlt sich, Cloud Foundry für ein- zen, wie beispielsweise vCloud oder fachere und strategisch nicht wichtige Julien Eperon vSphere von VMware Anwendungen und Show-Cases bereits im [email protected] • Die Verfügbarkeit von professionellem produktiven Umfeld einzusetzen. Als Ent- Support und Betriebsgarantien wicklungs-Plattform bietet sie den spezi- Julien Eperon schloss sein Stu- ellen Vorteil, dass sich die Entwickler nicht dium 2006 an der ETH Lausanne Cloud Foundry ist immer noch im Beta- zu sehr mit dem Setup eines Entwicklungs- mit einem Master in Informatik Stadium und wurde in der Vergangenheit und Testservers beschäftigen und mit dem ab. Danach arbeitete er in einem amerikanischen Unternehmen komplett überarbeitet. Damit hat das aktu- Template-Mechanismus alle denselben als Consultant für Software- elle Konzept der lokalen Entwicklungs-VM Setup verwenden. Cloud Foundry bewegt Entwicklung. Seit April 2010 ist erst Einzug gehalten. Zuvor war die Cloud sich durchaus in eine erfolgversprechen- er bei Trivadis in Lausanne in den Foundry komplett von der Amazon-EC2- de Richtung. Das API bietet via Komman- Bereichen „Private Banking“ und Infrastruktur abhängig und war auch nur dozeile oder STS die wichtigsten Elemente „Gesundheitswesen“ tätig. Sein dort lauffähig. Es ist zu hoffen, dass das -ak für den durchschnittlichen Java-Entwick- Fokus liegt auf Java-Entwicklung ler und die Einarbeitungszeit bewegt sich im Linux-Umfeld.

Source Talk Tage 2012 Auch in diesem Jahr laden die Java User Group Deutschland und die Sun User Group Deutschland Ende August wieder zu den Source Talk Tagen nach Göttingen. An zwei Tagen werden Vorträge und Trainings zu den Themen Java, Web-Technologien, Sys- temverwaltung, Cloud-Computing und eLearning angeboten. Besonderen Wert legen die Veranstalter darauf, dass neben den Tracks auch die hochwertigen Trainings für Vollzeitstudierende kostenfrei sind.

Am 28. und 29. August 2012 steht das Mathematische Institut in Göttingen wieder im Zeichen der Source Talk Tage. Neu ist in diesem Jahr die Möglichkeit, am ersten Tag über das Linux Professional Institut (LPI) eine Prüfung mit Zertifikat abzulegen. Als Besonderheit wird die Prüfungsgebühr für eine Anzahl von Vollzeitstudierenden zu einem großen Teil von Paten übernommen. So finanziert die Sun User Group die Gebühr für sechs TeilnehmerInnen. Weitere Paten werden noch gesucht.

Neu ist auch der Schwerpunkt „Cloud Computing“ am zweiten Tag. Dieser Schwerpunkt wird von Prof. Dr. Ramin Yahyapour, dem neuen Leiter der Gesellschaft für wissenschaftliche Datenverarbeitung mbH Göttingen (GWDG), unterstützt, die EDV-Dienstleis- tungen für die Universität Göttingen und für alle Max-Planck-Institute in Deutschland bereitstellt. Neben den Tracks stehen hoch- wertige Trainings auf dem Programm. Highlights sind NetBeans mit Geertjan Wilenga, Active Directory mit Samba 4 vom SerNet- Samba-Team, PHP-Programmierung für Fortgeschrittene von den Stud.IP-Profis von data-quest, Clojure mit Stefan Kamphausen, Arduino vom Fritzing Team. Aktuelle News und weitere Informationen unter www.sourcetalk.de.

Java aktuell 3-2012 | 53 Windows Azure

Windows Azure Service Bus: Kommunikationsdienst auch für Java

Holger Sirtl, Microsoft Deutschland GmbH

Microsoft stellt mit Windows Azure eine Cloud-Plattform bereit, die nicht nur von .NET-, sondern auch von Java-, PHP- oder Node.js-Entwicklern dazu genutzt werden kann, eigene Anwendungen in der Cloud zu betreiben und gezielt einzelne Cloud Services (etwa zur Datenspeicherung oder Benutzer-Authentifi- zierung) zu nutzen. Ein besonders interessanter Dienst in Windows Azure ist der Service Bus zur netzwerk-, unternehmens- und technologieübergreifenden Kommunikation zwischen verteilten Web-Services. Dieser Artikel stellt den Service Bus vor und zeigt, wie damit auch Java-basierte Services mit lokalen oder entfernten Software-Komponenten kommunizieren können.

Cloud-Computing-Dienste werden häu- kann. Zum anderen bietet Windows Azure Die Windows-Azure-Storage-Services fig entsprechend ihrer Abstraktionsebene auch eine Reihe von Ressourcen, die Ent- auf der Datenschicht fassen alle Non-SQL- in Infrastruktur-, Platform-, Software-as- wicklern bei Implementierung, Test und Persistenzdienste zusammen. Diese sind a-Service und weitere kategorisiert. Ge- Deployment dieser Anwendungen helfen. über „RESTful“-Schnittstellen zugänglich. mäß dieser Einteilung lässt sich Windows Abbildung 1 zeigt eine Referenz-Ar- Wer für den Zugriff nicht den Weg über diese Azure als Platform-as-a-Service-Angebot chitektur, in der sowohl die Services der Schnittstellen gehen möchte, erhält in den einordnen, das auch einige Elemente aus Windows-Azure-Plattform als auch deren frei verfügbaren Software Development der Infrastruktur-Schicht enthält. Windows Interaktionsmöglichkeiten zu sehen sind. Kits (SDKs) für .Net, Java, PHP und Node.js Azure ist zum einen eine Sammlung von Die Plattformdienste lassen sich grob drei entsprechende Klassenbibliotheken, in de- Cloud-Services, die für die Entwicklung, Schichten zuordnen: Datenschicht (Data nen die „RESTful“-Aufrufe gekapselt sind. Erstellung und den Betrieb eigener Cloud- Layer), Anwendungsschicht (Application Der Caching-Service ist ein verteilter In-Me- basierter Anwendungen genutzt werden Layer) und Integrationsschicht (Integrati- mory-Cache, den Anwendungskomponen- können und die in Microsofts weltweit ver- on Layer). Clients, die auf entsprechende ten zur temporären Zwischenspeicherung teilten Rechenzentren betrieben werden, Azure-basierte Dienste zugreifen, lassen von Daten nutzen können. Mit SQL Azure wobei der Ausführungsort eines jeden ge- sich einer Client-Schicht (Client Layer) zu- besitzt Windows Azure auch ein echtes re- nutzten Azure Service bestimmt werden ordnen. lationales Datenbanksystem (RDBMS) als

Abbildung 1: Windows-Azure-Referenz-Architektur

54 |

iii iii iiiiii www.ijug.eu

Cloud Service, das ein Subset von SQL Ser- ver abbildet und entsprechend schnittstel- lenkompatibel ist. Somit kann von Java aus über den JDBC-Treiber für SQL Server auf SQL Azure zugegriffen werden. Der Windows-Azure-Compute-Service auf der Anwendungsschicht ermöglicht die Ausführung eigener Anwendungen in der Cloud. Die Bereitstellung von virtuellen Maschinen (VMs) in der gewünschten An- zahl und Größe, deren Konfiguration, die Installation des Anwendungspakets, die Einstellung eines vorgeschalteten Load Ba- lancers etc. werden vollautomatisch durch den Compute-Service gesteuert. Der Ent- wickler muss sich demnach nicht mit dem Setup der virtuellen Maschinen auseinan- dersetzen. Diese werden aus einem Pool bereits vorkonfigurierter VMs bezogen. Für Java-Entwickler sind sogenannte „Worker Roles“ interessant. In deren VMs Abbildung 2: Screenshot der Service-Bus-Administrationsseite können eigene Webserver eingesetzt wer- den (beispielsweise Apache Webserver

package com.samples; oder Tomcat). Bei VM Roles kann der Ent- import java.io.BufferedReader; wickler das VM Image selbst erstellen und import java.io.InputStreamReader; in Azure betreiben. Auf alle VMs hat der import com.microsoft.windowsazure.services.serviceBus.*; Entwickler vollen Administrator-Zugang. import com.microsoft.windowsazure.services.serviceBus.models.*; Auch der Remote-Desktop-Zugang auf import com.microsoft.windowsazure.services.core.*; einzelne VM-Instanzen ist möglich. public class ServiceBusQueueSender { Oft werden Cloud-basierte Services aus public static void main(String[] args) { lokal betriebener Software heraus genutzt. String issuer = „[YOUR_ISSUER]“; Tatsächlich tragen Hybride-Szenarien, in String key = „[YOUR_KEY]“; denen Teile einer Anwendung lokal und String namespace = „demo-ns“; andere in der Cloud ausgeführt werden, String queueName = „testqueue“; dem Wunsch Rechnung, die Vorteile der Configuration config = Cloud (hohe Skalierbarkeit, flexible Verfüg- ServiceBusConfiguration.configureWithWrapAuthentication(namespace, issuer, key); barkeit, nutzungsabhängige Kosten etc.) ServiceBusContract service = ServiceBusService.create(config); mit den Stärken der lokalen IT (individuelle

Konfigurationen, Compliance-Anforderun- try { gen etc.) zu kombinieren. Auf der Integrati- QueueInfo queueInfo = new QueueInfo(queueName); onsschicht (siehe Abbildung 1) bietet Win- service.createQueue(queueInfo); dows Azure deshalb eine Reihe von Cloud BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Services, die Funktionen für Interaktion String messageText = br.readLine(); und Integration von lokaler mit Cloud-IT while(messageText.length()>0) { bereitstellen. Soll von einem Azure Service BrokeredMessage message = new BrokeredMessage(messageText); heraus eine Ressource in der lokalen IT an- service.sendQueueMessage(queueName, message); gesprochen werden, bietet Windows Azu- messageText = br.readLine(); re Möglichkeiten auf mehreren Ebenen: } Windows Azure Connect ermöglicht auf } catch (Exception e) { Netzwerk-Ebene den Aufbau einer „Ipsec“- System.out.printf(„Exception encountered: %s“, e.getMessage()); System.exit(-1); gesicherten Verbindung zwischen VMs in } Windows Azure und Rechnern in der lo- } kalen IT. Auf Daten-Ebene synchronisiert } der SQL-Azure-DataSync-Service die Da- ten zwischen lokalen und Azure-basierten Listing 1: Client zum Versenden von Nachrichten an eine Service-Bus-Queue SQL-Datenbanken.

Java aktuell 3-2012 | 55 Windows Azure

Integration verteilter Anwendungs- werden der über das Portal zuvor angeleg- angelegt, anschließend werden in einer komponenten über den Service Bus te Namespace sowie die über das Portal Endlosschleife Texteingaben von der Kon- Auf Anwendungsebene bietet der Win- verfügbaren Werte für den Issuer und den sole eingelesen und als Nachrichten in die dows Azure Service Bus die Möglichkeit, Zugriffsschlüssel benötigt. Mithilfe dieser Queue eingestellt. lokale Services untereinander beziehungs- Konfiguration entsteht ein ServiceBusCon- Listing 2 zeigt die Implementierung ei- weise auch mit auf Azure ausgeführten tract-Objekt. Über dieses werden dann die nes einfachen Empfängers, der Nachrich- Services zu vernetzen. Die Service-Bus-In- meisten weiteren Service-Bus-Operatio- ten aus einer Service-Bus-Queue ausliest frastruktur kann über entsprechende SDKs nen ausgeführt. Zunächst wird eine Queue und deren Inhalte auf der Konsole anzeigt. aus verschiedenen Technologien wie .NET, Java, PHP etc. heraus angesprochen wer- den. Bevor der Service Bus in eigenen An- package com.samples; wendungen genutzt werden kann, muss import [...] der Entwickler über das Windows-Azure- public class ServiceBusQueueReceiver { Portal einen Service-Namespace anlegen. public static void main(String[] args) { Dieser dient als Scoping-Container für die String issuer = „[YOUR_ISSUER]“; String key = „[YOUR_KEY]“; Adressierung von Service-Bus-Ressourcen String namespace = „demo-ns“; in eigenen Anwendungen. Die Administra- String queueName = „testqueue“; tionsseite zum Service Bus ist in Abbildung 2 zu sehen. Das Anklicken der Schaltfläche Configuration config = ServiceBusConfiguration „Neu“ öffnet ein Dialogfenster, über das .configureWithWrapAuthentication(namespace, issuer, key); ServiceBusContract service = ServiceBusService.create(config); ein neuer Namespace, also dessen Name, Ausführungsort der zugehörigen Ressour- try { cen etc., konfiguriert werden kann. ReceiveMessageOptions opts = ReceiveMessageOptions.DEFAULT; Abbildung 2 zeigt auch einen Name- opts.setReceiveMode(ReceiveMode.RECEIVE_AND_DELETE); space mit der Bezeichnung „demo-ns“. Alle while (true) { Ressourcen, die diesem Namespace zuge- ReceiveQueueMessageResult resultQM = service .receiveQueueMessage(queueName, opts); ordnet sind, werden in Nordeuropa aus- BrokeredMessage message = resultQM.getValue(); geführt. Jede Software-Komponente, die if (message != null && message.getMessageId() != null) { mit dem Service Bus interagieren möch- InputStream is = message.getBody(); te, muss sich mit einem Zugriffsschlüssel InputStreamReader isr = new InputStreamReader(is); authentifizieren. Dieser besteht aus einer BufferedReader br = new BufferedReader(isr);

44-stelligen Zeichenfolge und kann über System.out.println(„Body: „ + br.readLine()); das Portal ausgelesen werden. } else { Thread.sleep(1000); Service-Bus-Queues } Die unter [1] verfügbaren Windows-Azure- } } catch (Exception e) { Libraries für Java enthalten APIs zur Nut- System.out.printf(„Exception encountered: %s“, e.getMessage()); zung des Service Bus. Service-Bus-Queues System.exit(-1); können als Messaging Broker zur asyn- } chronen Kommunikation zweier Software- } Komponenten verwendet werden. Sender } stellen Nachrichten in eine Queue ein, wo sie ein Empfänger für einen definierbaren Listing 2: Empfänger zum Auslesen und Anzeigen von Nachrichten aus einer Service-Bus-Queue Zeitraum auslesen kann. Abbildung 3 skiz- ziert den Mechanismus. Sendende Software-Komponenten kön- nen Nachrichten in eine Queue einstellen. Diese sind dann innerhalb ihrer Lebensdau- er von einem Empfänger auslesbar. Listing 1 zeigt, wie eine einfache Konsolenanwen- dung zum Anlegen einer Queue und Ver- senden von Nachrichten aussehen kann. Zunächst werden die erforderlichen Bi- bliotheken aus dem Windows-Azure-SDK importiert. Zu Beginn der „main“-Methode wird eine Konfiguration erzeugt. Hierzu Abbildung 3: Service-Bus-Queue

56 |

iii iii iii iii iiiiii www.ijug.eu

weiterer Empfänger gesperrt. Hat der Emp- package com.samples; fänger die Nachricht erfolgreich verarbeitet, import [...] public class ServiceBusTopicSender { kann er sie aus der Queue löschen. Erfolgt public static void main(String[] args) { dies nicht innerhalb des Sperrzeitraums, String issuer = “[YOUR_ISSUER]”; wird die Nachricht wieder frei gegeben, so- String key = “[YOUR_KEY]”; dass sie erneut ausgelesen (bei Bedarf von String namespace = “demo-ns”; einem anderen Empfänger) und verarbeitet String topicName = “testtopic”; werden kann. Im Beispiel in Listing 2 kommt Configuration config = ReceiveAndDelete zum Einsatz. ServiceBusConfiguration.configureWithWrapAuthentication(namespace, issuer, key); ServiceBusContract service = ServiceBusService.create(config); Service Bus Topics und Subscriptions Queues eignen sich in Szenarien, in denen try { einzelne Nachrichten in der Regel nur von TopicInfo topicInfo = new TopicInfo(topicName); einem Empfänger ausgelesen und verar- service.createTopic(topicInfo); beitet werden sollen. Sollen Nachrichten SubscriptionInfo subAllInfo = new SubscriptionInfo(“AllMessages”); an mehrere Empfänger verteilt werden, service.createSubscription(topicName, subAllInfo); können Topics und Subscriptions verwen- SubscriptionInfo subErrInfo = new SubscriptionInfo(“ErrorMessages”); det werden. Dabei schicken Sender Nach- service.createSubscription(topicName, subErrInfo); RuleInfo ruleInfo = new RuleInfo(); richten an ein Topic. Für ein solches Topic ruleInfo = ruleInfo.withSqlExpressionFilter(“error = ‘1’”); können für einen oder mehrere Empfän- ruleInfo.setName(“Errors”); ger Subscriptions angelegt werden, hinter CreateRuleResult ruleResult = service.createRule(topicName, “ErrorMessages”, ruleInfo); denen Queues arbeiten. Empfänger lesen BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Nachrichten aus den ihnen zugeordne- String messageText = br.readLine(); ten Subscription-Queues aus. Für jede while(messageText.length()>0) Subscription können Filterregeln definiert { werden, die auf Basis von Meta-Informati- BrokeredMessage message = new BrokeredMessage(messageText); onen der Nachrichten bestimmen, in wel- che Subscription-Queues eine Nachricht, if((messageText.length()>4) && (messageText.startsWith(“ERR:”))) { die an das zugehörige Topic geschickt message.setProperty(“error”, “1”); wurde, eingestellt wird. Der Mechanismus } und die beteiligten Komponenten sind in else Abbildung 4 skizziert. In Listing 3 ist die { Implementierung eines Publishers zu se- message.setProperty(“error”, “0”); } hen, der Nachrichten an ein Topic sendet. service.sendQueueMessage(topicName, message); Auch hier werden zunächst erforderli- messageText = br.readLine(); che Bibliotheken importiert und mithilfe } einer Konfiguration ein ServiceBusCon- tract-Objekt erzeugt. Mit diesem werden service.deleteSubscription(topicName, “AllMessages”); zunächst ein Topic und dann darauf zwei service.deleteSubscription(topicName, “ErrorMessages”); service.deleteTopic(topicName); Subscriptions angelegt. Die erste erhält } catch (Exception e) { alle Nachrichten, die an das Topic geschickt System.out.printf(“Exception encountered: %s”, e.getMessage()); werden. Für die zweite wird über eine Re- System.exit(-1); gel definiert, dass nur solche Nachrichten } an die Subscription gehen, die über Meta- } } Informationen vom Absender als Fehler- Nachricht gekennzeichnet wurden. In einer Listing 3: Service Bus Topic Sender Endlosschleife werden dann Eingabetexte über die Konsole gelesen und als Nach- richten an das Topic geschickt. Beginnt ein Auch der Empfänger importiert die und PeekLock. Bei ReceiveAndDelete wird Eingabetext mit dem String „ERR:“, wird die benötigten Bibliotheken, erstellt eine eine ausgelesene Nachricht sofort aus der Nachricht als Fehlernachricht markiert. Lis- Service-Bus-Konfiguration und damit ein Queue entfernt. Bei PeekLock erhält der ting 4 zeigt einen entsprechenden Empfän- ServiceBusContract-Objekt, das dann Me- Empfänger eine Kopie der Nachricht. Das ger, der Nachrichten aus den im Publisher thoden zum Auslesen von Nachrichten aus Original der Nachricht verbleibt in der angelegten Subscriptions auslesen kann. Queues bereitstellt. Für das Auslesen gibt Queue, wird allerdings für einen vom An- Auch hier wird wieder mit den entspre- es zwei Möglichkeiten: ReceiveAndDelete wender festgelegten Zeitraum für Zugriffe chenden Schritten ein ServiceBusCon-

Java aktuell 3-2012 | 57 Windows Azure

tract-Objekt erzeugt. Grundsätzlich liest dieser Empfänger Nachrichten aus der package com.samples; allgemeinen Subscription, es sei denn, es import [...] wurde per Übergabeparameter bestimmt, public class ServiceBusSubscriptionReceiver { dass er Nachrichten aus der Fehlernach- public static void main(String[] args) { String issuer = „[YOUR_ISSUER]“; richten-Subscription lesen soll. Wie im String key = „[YOUR_KEY]“; Queue-Empfänger in Listing 2 wird auch String namespace = „demo-ns“; hier ReceiveAndDelete als Mechanismus String topicName = „testtopic“; zum Lesen der Nachrichten verwendet. String subscrName = „AllMessages“;

Fazit if((args.length>0) && (args[0].equals(„ERR“))) { Windows Azure stellt eine Vielzahl von subscrName = „ErrorMessages“; Cloud Services zur Verfügung, die in eige- } nen Anwendungen genutzt und über Test- Accounts kostenlos evaluiert werden kön- Configuration config = ServiceBusConfiguration .configureWithWrapAuthentication(namespace, issuer, key); nen (siehe [1]). Über den Windows Azure ServiceBusContract service = ServiceBusService.create(config); Service Bus können verteilte Software- Komponenten Nachrichten austauschen. try { Der Service Bus stellt hier eine leistungs- ReceiveMessageOptions opts = ReceiveMessageOptions.DEFAULT; fähige, hochskalierbare Messaging-Platt- opts.setReceiveMode(ReceiveMode.RECEIVE_AND_DELETE); form zur Verfügung, die über Java-APIs while (true) { recht einfach genutzt werden kann. Wenn- ReceiveSubscriptionMessageResult result = gleich für den Service Bus noch keine Im- service.receiveSubscriptionMessage(topicName, subscrName); plementierung des JMS-API zur Verfügung BrokeredMessage message = result.getValue(); steht, ist die Nutzung in eigenen (auch if (message != null && message.getMessageId() != null) { lokal betriebenen) Anwendungen leicht InputStream is = message.getBody(); InputStreamReader isr = new InputStreamReader(is); implementierbar. BufferedReader br = new BufferedReader(isr);

Weitere Informationen System.out.println(br.readLine()); } else { [1] Windows Azure Libraries für Java: http:// go.microsoft.com/fwlink/?LinkID=236226& Thread.sleep(1000); clcid=0x409 } [2] Kostenloser Test-Account für Windows Azure: } http://www.windowsazure.com/de-de/pric- ing/free-trial/ } catch (Exception e) { [3] Holger Sirtls Blog zur Windows Azure: System.out.printf(„Exception encountered: %s“, e.getMessage()); http://blogs.msdn.com/hsirtl System.exit(-1); } } Holger Sirtl } [email protected]

Listing 4: Service Bus Subscription Receiver

Holger Sirtl ist seit 2006 als Architecture Evangelist bei Microsoft in München tätig und berät in dieser Rolle Unternehmen im Auf- bau Cloud-basierter Anwendungsarchitekturen. Schwerpunkt- themen seiner Arbeit sind Cloud Computing und die Windows Azure Plattform. Vor seinem Einstieg bei Microsoft arbeitete Holger Sirtl sechs Jahre lang als Technologieberater für eine in- ternational führende Unternehmensberatung sowie zwei Jahre lang als Senior-IT-Projektmanager für einen großen deutschen Energieversorger. Abbildung 4: Service Bus Topic und Subscriptions

58 |

iii iii iiiiii www.ijug.eu

package com.samples; Jnect: Kinect goes Java import [...] public class ServiceBusSubscriptionReceiver { Jonas Helming und Maximilian Kögel, EclipseSource München GmbH public static void main(String[] args) { String issuer = „[YOUR_ISSUER]“; String key = „[YOUR_KEY]“; String namespace = „demo-ns“; Das Jnect-Framework stellt Interoperabilität zwischen dem Microsoft Kinect SDK und Java her. Jnect ist als String topicName = „testtopic“; Eclipse-Plug-in realisiert und erlaubt damit auch die Steuerung von Eclipse-basierten Applikationen wie String subscrName = „AllMessages“; beispielsweise der Java IDE Eclipse selbst. if((args.length>0) && (args[0].equals(„ERR“))) { subscrName = „ErrorMessages“; Kinect von Microsoft unterstützt die Er- sen erkennt die 3D-Kamera des Kinect di- andere Zwecke als das Spielen mit der } kennung von Bewegungen, Gesten und rekt den menschlichen Körper und kann Xbox verwendet wurde. So verleiht Kinect sogar Sprache. Es wurde ursprünglich für dessen Bewegungen zur Steuerung von Robotern die Fähigkeit zu sehen oder dient Configuration config = ServiceBusConfiguration die Microsoft Xbox entwickelt, dient zur Spielen interpretieren. Der Mensch wird als 3D-Scanner zum Digitalisieren von .configureWithWrapAuthentication(namespace, issuer, key); Steuerung von Spielen oder sogar als Er- damit selbst zum „Controller“. Springt man räumlichen Objekten. Microsoft reagierte ServiceBusContract service = ServiceBusService.create(config); satz für den persönlichen Fitnesstrainer. beispielsweise in die Luft, wird auch die schnell auf diesen Trend und erleichterte try { Microsoft veröffentlichte jedoch auch ein Spielfigur einen Sprung ausführen. In die- mit der Veröffentlichung des Kinect-SDK ReceiveMessageOptions opts = ReceiveMessageOptions.DEFAULT; SDK für Windows 7, mit dem es möglich sem Zusammenhang ist vor allem auch die die Interoperabilität mit Kinect. Mit diesem opts.setReceiveMode(ReceiveMode.RECEIVE_AND_DELETE); ist, unabhängig von der Xbox eigene An- geringe Latenz zwischen realer und virtu- SDK kann über ein API direkt auf die Funk- wendungen für Kinect zu programmieren. eller Bewegung von nur wenigen Millise- tionen des Kinect zugegriffen werden. So while (true) { ReceiveSubscriptionMessageResult result = Dazu wird bisher C++ oder C# verwendet. kunden faszinierend. lassen sich beispielsweise Desktop-Ap- service.receiveSubscriptionMessage(topicName, subscrName); Wie häufig bei der Einführung neuer Geräte aus der Spiele-Industrie haben plikationen über von Kinect erkannte Be- BrokeredMessage message = result.getValue(); Technologien ist der Spiele-Markt im Falle neben ihrer Innovation meist noch einen wegungen steuern – das Ganze allerdings if (message != null && message.getMessageId() != null) { von Bewegungs- und Gesten-Erkennung weiteren Vorteil: Sie sind für den Massen- bisher nicht in Java. InputStream is = message.getBody(); ein wesentlicher Innovationstreiber. Die markt konzipiert und damit günstig. Ein Das Jnect-Projekt schließt diese Lücke InputStreamReader isr = new InputStreamReader(is); Nintendo Wii wurde bekannt durch das Gerät wie Kinect, das in dieser Art als Spe- und stellt einen Java-Wrapper für das Mi- BufferedReader br = new BufferedReader(isr); neue Steuerungskonzept, bei dem man ziallösung mehrere Tausend Euro kosten crosoft Kinect SDK in Form eines Eclipse- System.out.println(br.readLine()); einen mit einem Bewegungs- und Infrarot- würde, ist plötzlich für etwa 100 Euro in je- Plug-ins zur Verfügung. Damit lassen sich } else { Sensoren ausgestatteten Controller frei dem Elektronikmarkt zu erwerben. Und als die von Kinect erkannten Daten direkt in Thread.sleep(1000); im Raum bewegt, um Spiele zu steuern. USB-Device ist Kinect prinzipiell mit allem der eigenen Eclipse-Anwendung verar- } Microsoft ging mit Kinect für die Xbox interoperabel, was USB kennt. beiten und nutzen. Die erste Version von } noch einen Schritt weiter und verzichtete Es dauerte nicht lange, bis Kinect von Jnect wurde im Rahmen eines Universi- } catch (Exception e) { gänzlich auf einen Controller. Stattdes- Tüftlern und Technikbegeisterten für ganz tätsprojekts als Open Source entwickelt. System.out.printf(„Exception encountered: %s“, e.getMessage()); Dieser Artikel zeigt, wie man mit Jnect die System.exit(-1); Körpererkennung (Body Tracking) und die } Spracherkennung des Kinect für die Steue- } } rung eigener Anwendungen nutzen kann. Alle beschriebenen Beispiele sowie das Framework selbst finden Sie unter [1]. Listing 4: Service Bus Subscription Receiver Mit dem Body Tracking ist es sehr ein- fach möglich, Teile der Anwendung durch Gesten zu steuern. Unter [1] finden sich Demonstrationen, in denen beispielswei- se der Debugger von Eclipse über Gesten kontrolliert wird. Um einen „Step Over“ auszuführen, drückt man dabei nicht mehr irgendeine Taste, sondern hebt ganz ein- fach seine rechte Hand. Derartige Formen der Steuerung sind insbesondere in Um- gebungen interessant, in denen der Be- nutzer nicht oder nur schwierig auf eine Tastatur zugreifen kann. Auch visuelle Darstellungsformen wie beispielsweise Abbildung 1: Die Positions-Informationen des Körpers können beispielsweise auf einem Diagramm Diagramme können gut durch das Body visualisiert werden Tracking gesteuert werden. Als Demonstra-

Java aktuell 3-2012 | 59 Eclipse

Body Tracking Body Tracking liefert genaue Daten darü- ber, wo sich die Körperteile eines von Ki- nect beobachteten Menschen befinden. Jnect liefert diese Positionen in Form von Java-Objekten, eines für jeden Teil des Kör- pers. Diese Java-Objekte stellen damit ein Modell des Körpers dar. Sie sind in Jnect unter Verwendung des Eclipse Modeling Frameworks (EMF) realisiert. Für genauere Informationen zu EMF siehe [2]. Von jedem Teil des Modells kann nun sowohl die X- als auch die Y-Position abge- fragt werden. Alle Teile des Körpers sind in Abbildung 2: Das Jnect-Framework stellt über JNI eine Verbindung zum Microsoft Kinect SDK her einem Container-Objekt (SkeletonModel) enthalten, das wiederum von einem Ki- nectManager abgefragt werden kann. Das tion zeigt Abbildung 1, wie sämtliche Teile Gleichzeitig soll die umfangreiche Funk- Codebeispiel in Listing 1 fragt die X-Positi- des Körpers in der aktuellen Position auf tionalität des Microsoft Kinect SDK verfüg- on der linken Hand ab. Dazu wird zunächst einem Diagramm visualisiert werden. Auf bar bleiben. Zu diesem Zweck greift Jnect die Verbindung zu Kinect aufgebaut sowie diese Weise lassen sich per Handbewegung per JNI direkt auf das Microsoft SDK zu. das Body Tracking gestartet. beispielsweise UML-Diagramme modifizie- Damit kann die bereits existierende Funk- In den meisten Anwendungsszenarios ren oder auf Scrum Task Boards Aufgaben tionalität des SDK direkt wiederverwendet ist jedoch mehr als die aktuelle Position verschieben. Es lassen sich jedoch nicht nur werden, das Jnect-Framework stellt ledig- die Veränderung einer Position, also eine existierende Anwendungen steuern, Kinect lich die Interoperabilität mit Java her. Bewegung des Körpers, interessant. Um erlaubt es auch, neue Anwendungsfelder Für das Microsoft SDK wird zur Laufzeit über Änderungen am Modell notifiziert zu erschließen. So könnte beispielsweise Windows als Plattform benötigt. Durch die zu werden, kann man in EMF-Listener Teile überwacht werden, ob sich eine Person im Verwendung von Jnect kann nun eine Ap- des Körpers registrieren. Um auf eine Än- beobachteten Bereich noch in aufrechter plikation, die auf die Daten des Kinect zu- derung zu reagieren, kann dann innerhalb Form befindet, oder, falls sie gestürzt sein greifen möchte, direkt in Java geschrieben des Listeners auf das Körperteil, dessen sollte, ein Alarm ausgelöst werden. werden. Jnect bildet dabei zwar nicht das Position sich verändert hat, aber auch auf Ähnlich umfangreich sind potenzielle komplette Microsoft Kinect SDK ab, stellt die Position jedes anderen Teiles zugegrif- Anwendungsfelder der Sprachsteuerung. aber mit Body Tracking und Speech Reco- fen werden. Das Codebeispiel in Listing 2 In einer Demonstration unter [1] lassen gnition wohl die beiden wichtigsten Fea- registriert einen Listener auf Änderungen sich der Eclipse Debugger und einige wei- tures bereit, für die in den folgenden Ab- der linken Hand und fragt im Falle einer tere Kommandos der Eclipse IDE per Spra- schnitten Beispiele beschrieben werden. Änderung die X-Position ab. che steuern. Diese IDE ist auch ein gutes Beispiel für eine Anwendung mit vielen für sich genommen einfachen Komman- dos, deren Menge jedoch die mögliche Anzahl an Tastenkombinationen teilweise KinectManager kinectManager = KinectManager.INSTANCE; kinectManager.startKinect(); überreizt. So ist es zum einen schwierig, kinectManager.startSkeletonTracking(); eine noch freie Tastenkombination für ei- float x = kinectManager.getSkeletonModel().getLeftHand().getX(); nen Befehl zu finden, zum anderen ist es fast unmöglich, sich alle verfügbaren Kom- mandos zu merken. Listing 1

Hinter den Kulissen kinectManager.getSkeletonModel().getLeftHand().eAdapters().add(new AdapterImpl(){ Das Microsoft SDK spricht Kinect über USB @Override an und verarbeitet die Daten vor. So liefert public void notifyChanged(Notification msg) { es fertig berechnete Körperpositionen, kinectManager.getSkeletonModel().getLeftHand().getX(); beispielsweise wo genau sich der Kopf ei- } nes von Kinect beobachteten Menschen }); befindet. Ziel von Jnect ist es, die Microsoft Kinect in Java, genauer gesagt in einer Eclipse-Anwendung, nutzbar zu machen. Listing 2

60 |

iii iii iii iii iiiiii www.ijug.eu

Die Phrasen werden dann von Jnect in das final KinectManager kinectManager = KinectManager.INSTANCE; Vokabular der Kinect-Spracherkennung kinectManager.startKinect(); GestureProxy.INSTANCE.addGestureDetector(new Gesture() { eingefügt. Wird eine Phrase erkannt, wer- @Override den die Methode „notifySpeech()“ aufge- protected boolean isGestureDetected(Notification notification) { rufen und die erkannten Phrasen als Pa- float head = kinectManager.getSkeletonModel().getHead().getY(); rameter übergeben. Das Codebeispiel in float rHand = kinectManager.getSkeletonModel().getRightHand().getY(); Listing 4 registriert einen SpeechListener return y gesture) { se das Vergrößern eines Fensters bequem //Do something GestureProxy.INSTANCE.removeGestureListener(this); starten und beenden: Der Benutzer streckt } die Hände aus und aktiviert den Resize- }); Modus mit einem Sprachkommando. kinectManager.startSkeletonTracking(); Durch das Verkleinern und Vergrößern des Abstands der Hände wird das Fenster Listing 3 entsprechend vergrößert und verkleinert. Durch das Stopp-Sprachkommando wird die Fenstergröße wieder eingefroren. final KinectManager kinectManager = KinectManager.INSTANCE; kinectManager.startKinect(); kinectManager.addSpeechListener(new SpeechListener() { Fazit @Override Jnect stellt die Interoperabilität zwischen public void notifySpeech(String speech) { dem Microsoft Kinect SDK und Java her. if (speech.equalsIgnoreCase(YOURWORD)) { Zu diesem Zweck verbindet es sich via JNI //Do something zum SDK und bietet für die Features Body kinectManager.stopSpeechRecognition(); } Tracking und Speech Recognition ein Java- } API in Form eines Eclipse-Plug-ins an. Auf @Override Basis dieses API kann eine Java-Anwen- public Set getWords() { dung an Kinect angebunden werden. return Collections.singleton(YOURWORD); Jnect ist ein Open-Source-Projekt, eine } erste Beta-Version wurde als Eclipse-Labs- }); kinectManager.startSpeechRecognition(); Projekt veröffentlicht. Geplante nächste Schritte sind die Anbindung des neuen Listing 4 Kinect für den PC sowie die Unterstützung weiterer Features des Microsoft Kinect Um das Erkennen von Gesten mit nur Spracherkennung SDK. In diesem jungen Projekt sind die Ent- einem Zustand zu erleichtern, bietet Jnect Das Spracherkennungs-Feature des Mi- wickler von Jnect über jede Art von Feed- zwei Interfaces an. GestureDetectors ent- crosoft Kinect SDK erlaubt es, gesproche- back dankbar. scheiden, ob im aktuellen Zustand eine ne Wörter aus einem vorher definierten Geste erkannt ist. Sie werden bei jeder Vokabular aus Phrasen zu erkennen. Dazu Links Änderung von Positionen beliebiger Kö- werden die Raum-Mikrofone von Kinect [1] jnect.org [2] eclipsesource.com/emftutorial perteile befragt. GestureListener werden genutzt. Die Spracherkennung funktio- aufgerufen, wenn eine registrierte Geste niert zwar nicht mit beliebigen Wörtern, erkannt wurde, und können daraufhin be- da diese vorher festgelegt werden müssen, Jonas Helming liebige Aktionen ausführen. dafür erreicht sie umgekehrt aufgrund des [email protected] Das Codebeispiel in Listing 3 registriert beschränkten Vokabulars sehr hohe Erken- Maximilian Kögel einen GestureListener, der überprüft, ob die nungsraten. Einsatzszenario ist also nicht mkoegel@ eclipsesource.com rechte Hand über den Kopf gehoben wird. das Diktieren von Texten, sondern die Aus- Im GestureDetector wird anschließend wahl von vorher bekannten Kommandos. Jonas Helming und Maximilian der GestureListener zunächst entfernt, da Jnect bildet dieses Feature über das In- Kögel sind Eclipse-EMF/RCP- sonst die Geste dauerhaft erkannt werden terface SpeechListener ab. In diesem wer- Trainer und Consultants sowie würde. In einem echten Szenario bräuchte den zwei Methoden implementiert. In der Geschäftsführer der Eclipse- man also eine zweite Geste, die der Listener Methode „getWords()“ gibt der SpeechLis- Source München GmbH. Sie lei- wieder registriert, sobald die Hand wieder tener an, auf welche Phrasen er reagieren ten die Eclipse-Projekte „EMFS- unter den Kopf bewegt wird. möchte, beispielsweise „Do something“. tore“ und „EMF Client Platform“.

Java aktuell 3-2012 | 61 Java SDK

Unbekannte Kostbarkeiten des SDK Heute: Double Brace Initialization und Instance Initializer

Bernd Müller, Ostfalia

Das Java SDK enthält eine Reihe von Features, die wenig bekannt sind. Wären sie bekannt und würden sie verwendet, könnten Entwickler viel Arbeit und manchmal sogar zusätzliche Frameworks einsparen. Wir wollen in dieser Reihe derartige Features des SDK vorstellen: die unbekannten Kostbarkeiten.

Wir haben in dieser Reihe bereits den String[] ziffern = Die Hintergründe, Teil 1: new String[] { „eins“, „zwei“, „drei“, „vier“, ...}; Service-Loader, das Dynamic Proxy und Anonyme innere Klassen die VisualVM vorgestellt. Während die Java 1.1 führte innere Klassen ein. Eine beiden erstgenannten Kostbarkeiten lokale innere Klasse kann innerhalb ei- Listing 1 über Klassen beziehungsweise Interfaces ner Methode definiert werden. Benö- des SDK realisiert werden, ist die Visu- tigt man nur eine einzige Instanz dieser List ziffern = new ArrayList<>(); alVM eine separate und eigenständige Klasse, kann auf eine Namensvergabe ziffern.add(“eins”); Java-Anwendung des SDK. Es gibt jedoch verzichtet werden, und Definition und ziffern.add(“zwei”); auch unbekannte Kostbarkeiten, die eine Instanziierung können zu einem einzigen ziffern.add(“drei”); Ebene tiefer angesiedelt sind: in der Spra- Konstrukt, einer sogenannten „anonymen ziffern.add(“vier”); che Java selbst. Die Double Brace Initiali- inneren Klasse“, zusammengefasst wer- ... zation erlaubt die elegante und einfache den. Anonyme innere Klassen können Listing 2 Initialisierung von Variablen komplexerer ein Interface implementieren oder von Datenstrukturen, etwa Collections, und einer Oberklasse erben. Listing 6 zeigt ein basiert auf dem Instance Initializer Block. Beispiel, das häufig verwendet wird, um List ziffern = Wir motivieren zunächst die Verwendung einem „JButton“ einen „ActionListener“ Arrays.asList(new String[] { „eins“, „zwei“, der Double Brace Initialization und gehen hinzuzufügen. „drei“, „vier“, ... }); dann, wenn wir deren innere Funktions- Hier ist anzumerken, dass die anonyme weise analysieren, auf Instance Initializer innere Klasse das Interface „ActionListe- Listing 3 ein. ner“ implementiert und damit die einzige List ziffern = new LinkedList() {{ Methode dieses Interface definieren muss. add(„eins“); Double Brace Initialization Bei der zweiten Verwendungsart wird von add(„zwei“); Die Initialisierung von Arrays kann mit einer Oberklasse abgeleitet, wie im Listing add(„drei“); dem sogenannten „Array Initializer“ rela- 7 gezeigt. add(„vier“); tiv einfach realisiert werden (siehe Listing Hier erbt die anonyme innere Klasse ... }}; 1). Anders sieht es etwa mit Klassen des von der Klasse „Thread“ und überschreibt Collection-Frameworks aus. Bei Listen, die geerbte Methode „run()“. Wir wiederho- Listing 4 Mengen oder Maps müssen die einzelnen len nun den Code unseres einführenden Listenelemente durch explizite Metho- Beispiels mit dem doppelten Klammer-

Map ziffern = new HashMap() {{ Listing 2). paar samt Inhalt (siehe Listing 8). put(“1”, “eins”); Ein wenig Erleichterung für Listen Was wir hier sehen, ist eine anony- put(“2”, “zwei”); bringt die „asList()“-Methode der Klasse me innere Klasse, die von „LinkedList“ put(“3”, “drei”); „Arrays“ (siehe Listing 3). Mit der „Double erbt, aber keine der geerbten Methoden put(“4”, “vier”); Brace Initialization“ kann dies wesentlich überschreibt und auch keine Methode ... }}; eleganter realisiert werden (siehe Listing zusätzlich definiert. Wir sind der Syntax 4). Dies funktioniert auch mit „Maps“ (siehe der Double Brace Initialization also auf Listing 5 Listing 5). der Spur.

62 |

iii iii iii iii iiiiii www.ijug.eu

Die Hintergründe, Teil 2: JButton button = new JButton(...); Instance Initializer Map ziffern = button.addActionListener(new ActionListener() { Ebenfalls mit Java 1.1 wurde der Instance new HashMap() { public void actionPerformed(ActionEvent e) { private static final long serialVersionU- Initializer eingeführt, dessen Definition in ... // some code ID = 1L; der Java Language Specification im Ab- } { }); schnitt 8.6 nachgelesen werden kann. Ein String fuenf = „5“; Instance Initializer ist ein einfacher Block, put(„1“, „eins“); der beliebige Anweisungen enthalten put(„2“, „zwei“); Listing 6 put(“3”, “drei”); kann und bei der Erzeugung eines Objekts put(“4”, “vier”); nach den Initialisierungen der Variablen- put(fuenf, “fünf”); definition und vor dem Konstruktor ausge- }}; Runtime.getRuntime().addShutdownHook(new Thread() { führt wird (siehe Listing 9). public void run() { ... // some code Beim Erzeugen einer Instanz über den Listing 11 } Konstruktor wird zunächst die Variable }); „a“ mit 5 initialisiert. Die beiden Instance Die Definition neuer Methoden im Initializer werden in der Reihenfolge ihrer äußeren Block ist ebenfalls möglich, aber Listing 7 Definition ausgeführt. Die Variable „a“ be- wenig sinnvoll: Da die Klasse anonym ist, kommt also zunächst den Wert 23, dann kann die Variable „ziffern“ nicht auf die den Wert 77 zugewiesen. Zuletzt werden Klasse gecastet werden, was die Vorausset- List ziffern = new LinkedList() { die Anweisungen des Konstruktor-Rumpfs zung für die Verwendung der Methode ist, }; ausgeführt, hier also der Variablen „a“ der wenn man einmal von Reflection absieht. Wert 117 zugewiesen. Da Instance Initiali- Listing 8 zer Blöcke sind, können verschiedene An- Fazit weisungen, nicht nur Werte-Zuweisungen Wir haben hier gezeigt, wie mit der Double verwendet werden. Insbesondere sind Brace Initialization komplexe Variablen ein- public class InstanceInitializerTest { private int a = 5; auch mehrere Anweisungen erlaubt. Man fach initialisiert werden können. Während { kann sich mit „System.out.println()“-Aufru- die Double Brace Initialization ein Java- a = 23; fen davon überzeugen, dass die Variable Idiom darstellt, das bei einer Google-Suche } „a“ tatsächlich nacheinander die entspre- zu 178.000 Treffern (April 2012) führt, ist die { chenden Werte zugewiesen bekommt. Grundlage des Idioms, der Instance Initia- a = 77; } Wenn wir nun unser einführendes Beispiel lizer, ein Bestandteil der Sprache Java und public InstanceInitializerTest() { nochmals betrachten, wird die Semantik wird in der Sprachbeschreibung explizit im a = 117; schnell klar (siehe Listing 10). Abschnitt 8.6 definiert. Sowohl die Double } Hier wird eine anonyme innere Klasse Brace Initialization als auch der Instance In- ... als Unterklasse von LinkedList erzeugt und itializer gehören zu den unbekannten Kost- } ein Instance Initializer definiert, der aus barkeiten des SDK, hier sogar zu den unbe- den „add()“-Methodenaufrufen besteht. kannten Kostbarkeiten der Sprache Java. Listing 9 Da „LinkedList“ serialisierbar ist, warnt der Compiler bei unserer anonymen inneren Bernd Müller Klasse vor einer fehlenden Versionsnum- [email protected] List ziffern = new LinkedList() {{ mer der Serialisierung. Wir definieren diese add(„eins“); add(„zwei“); im folgenden Beispiel, um den Instance In- add(„drei“); itializer noch einmal hervorzuheben (siehe Bernd Müller ist Professor für add(„vier“); ... Listing 11). Zusätzlich demonstrieren wir Software-Technik an der Ostfa- }}; eine Variablendefinition im Instance Initia- lia. Er ist Autor des Buches „Java- lizer, die im Beispiel zwar relativ sinnlos ist, Server Faces 2.0“ und Mitglied in aber die allgemeine Verwendbarkeit des der Expertengruppe des JSR 344 Instance Initializer beispielhaft darstellt. (JSF 2.2). Listing 10

Oracle gegen Google: Interne E-Mails Beim Prozessauftakt am 16. April 2012 zwischen Oracle und Google in San Francisco hat der Datenbankriese seine Position bekräftigt und in seiner Eröffnungserklärung Google vorge- worfen, bei der Entwicklung von dem Betriebssystem Android sich bewusst fremder Technologie bedient zu haben, um im Smartphone-Markt nicht hinter der Konkurrenz zurückzufallen. Der Anwalt von Oracle, Michael Jacobs, belegte die Aussage mit Zitaten aus internen E-Mails von Google. Im Mittelpunkt stand eine E-Mail des Entwicklers Tim Lindholm, in der der ehemalige Sun-Angestellte sich dafür ausgesprochen hatte, mit Sun eine Java-Lizenz auszuhandeln. Oracle beteuerte, es sei dem Suchmaschinenbetreiber durchaus bekannt gewesen, dass er eine Lizenz hätte erwerben müssen.

Java aktuell 3-2012 | 63 Android

Android: von Maps und Libraries

Andreas Flügge, Object Systems GmbH

Es ist relativ einfach, Geo-Koordinaten aus einem Android-Device auszulesen und in einer View textuell darzustellen. Richtig interessant sind Geo-Koordinaten aber erst, wenn man sie in einer Kartendarstellung verwenden kann. Der Artikel zeigt, wie die aktuelle Position auf einer Google-Maps-Karte verfolgt werden kann.

Für die komfortable Darstellung geografi- ten bleibt, dass bei einer produktiven Ap- Klasse MyMap scher Informationen liefert Google für An- plikation ein anderes Zertifikat verwendet Die Klasse „MyMap“ initialisiert zunächst droid eine zusätzliche Library aus, die nicht werden sollte und damit ein neuer API-Key die View für die Kartendarstellung mit den Bestandteil des SDK ist (siehe Abbildung generiert werden muss. Zoom-Elementen und in einem mittle- 1). Sie kann über den Android SDK Mana- ren Maßstab. Der „LocationListener“ wird ger aber jederzeit nachinstalliert werden. Map View durch die Klasse zusätzlich implementiert. Bereits beim Anlegen eines Projekts wird Zur Darstellung der Map benötigen wir Der Einfachheit halber wird dies hier ge- im Wizard angegeben, dass das Google- zunächst eine View. Dazu legen wir un- nauso durchgeführt wie in der Activity für Maps-API verwendet werden soll. Dieses terhalb des Verzeichnisses „res/layout“ die die textuelle Darstellung. In einer produk- ist frei verfügbar, jedoch sollte man sich Datei „mymapview.xml“ an. Der Inhalt ist tiven Applikation würde man diese Funk- intensiv mit den Nutzungsbedingungen in Listing 2 dargestellt. Hier wird der oben tionalität auslagern und wiederverwend- vertraut machen, sofern man eine Verwen- generierte API-Key eingetragen. Die View bar machen. dung in kommerziellen Applikationen in wird wie üblich von einer Activity verwen- Im Gegensatz zur Aktualisierung der Erwägung zieht. Für die folgenden Aus- det. Das Google-Maps-API sieht dafür die textuellen Geokoordinaten wird die Kar- führungen wird als Basis die Applikation so Klasse „MapActivity“ vor, von der wir unse- tenansicht über einen sogenannten „Map- verwendet, wie sie zum Ende des Artikels re neu zu erstellende Klasse „MyMap“ (sie- Controller“ gesteuert. Er wird direkt über der vorigen Ausgabe vorlag. he Listing 3) ableiten. Anschließend muss die View ermittelt und ist in der Lage, die das Manifest entsprechend angepasst wer- Karte über eine weiche Animation auf vor- API-Key den. Zum einen registrieren wir dort die gegebene Koordinaten zu bewegen. Dazu Das Google-Maps-API enthält Funktionen, neue Activity und die Benutzung des API, wird er bei geänderter Position über die die eine Verbindung mit Google-Diensten zum anderen benötigen wir eine zusätz- Methode „onLocationChanged“ veranlasst. über das Internet herstellen und mit die- liche Berechtigung, da das API Daten aus sen Daten austauschen. Damit dies rei- dem Internet nachlädt. Die neuen Einträge Overlays bungslos funktioniert, benötigt man einen sind im Android-Manifest (siehe Listing 4) Die Kartendarstellung in Form der Klasse sogenannten „API-Key“, den Google kos- kenntlich gemacht. „MapView“ kann beliebig viele Overlays tenlos zur Verfügung stellt [2]. Für die Erstellung eines solchen Schlüs- sels ist der MD5-Fingerprint des Zertifikats keytool -list -alias androiddebugkey erforderlich, mit dem eine Android-Ap- -keystore \.android\debug.keystore plikation signiert wird. Jede Anwendung, -storepass android -keypass android die mit dem gleichen Zertifikat signiert ist, Zertifikatsfingerabdruck (MD5): E4:9F:53:35:0D:39:64:C0:DC:17:73:B5:90:E3:63:CF kann den gleichen API-Key verwenden. Für unsere Zwecke (während der Entwicklung) reicht temporär das Debug-Zertifikat. Es Listing 1: Fingerprint befindet sich im Debug Keystore unter „./ android/debug.keystore“ im Installations- verzeichnis des SDK. Listing 1 zeigt, wie Der so generierte Key wird für die weitere Nutzung zunächst gespeichert. Zu beach- Listing 2: mymapview.xml

64 |

iii iii iii iii iiiiii www.ijug.eu

Unsere Inserenten

aformatik Training und Consulting GmbH & Co. KG www.aformatik.de Seite 35

CaptainCasa GmbH www.CaptainCasa.com Seite19

Neue Mediengesellschaft Ulm www.nmg.de Seite 3

ORACLE Deutschland B.V. & Co. KG www.oracle.com U 4

SHI Elektronische Medien GmbH www.shi-gmbh.com U 3 Abbildung 1: Google APIs im SDK Manager

verwalten. Overlays muss man sich als be- In der Methode „onCreate“ der Klasse ist, werden die Kartendaten entsprechend schreibbare, durchsichtige Folien vorstel- „MyMap“ wird ein Overlay-Objekt instanzi- nachgeladen. len, die über die eigentliche Karte gesta- iert und in die Liste der verwalteten Over- pelt werden. Man kann sie nach eigenen lays eingefügt. Jedes Overlay kann einzeln Sonstiges Vorstellungen frei gestalten und der View aktiviert beziehungsweise deaktiviert wer- Wie auch bei der textuellen Darstellung hinzufügen. Für bestimmte Zwecke bringt den. Außerdem benötigt es eine Aktion tragen wir in den Methoden „onResume“ das Google-Maps-API auch schon vor- (als „Runnable“-Instanz), die die Ansicht und „onPause“ den Energiespar-Aspekten gefertigte Overlays mit. Die Anzeige der beim ersten Fix des GPS-Device initialisiert Rechnung. Ein kleiner Unterschied exis- aktuellen Geoposition ist ein solcher Son- (siehe Listing 3). Der Test im Emulator lässt tiert jedoch bei der Kartendarstellung, die derfall, der über die Klasse „MyLocation- sich wie gewohnt durchführen. Sofern der durch einen Aufruf der Methode „invalida- Overlay“ implementiert wird. Host-Rechner mit dem Internet verbunden te()“ bei der Reaktivierung der Activity zu einem Neuzeichnen explizit gezwungen werden muss (siehe Listing 3, Seite 66). Zudem ist zu erwähnen, dass die Klasse „GeoPoint“ nicht auf den Fließkommawer- Umrechnung mit dem Faktor „1E6“ in der Methode „onLocationChanged“. Fazit Das Google-Maps-API bietet vielfältige Möglichkeiten der Kartendarstellung, die So lassen sich mit ihm beispielsweise Geo- daten referenzieren (Mapping-Koordina- Routen darstellen oder Satellitenansichten anzeigen. Das API ist leicht anzuwenden und gut dokumentiert. Für diejenigen, die nicht auf eine Google-Lösung bauen möchten oder (aus rechtlichen Gründen) können, sei darauf hingewiesen, dass mit osmdroid [5] eine nahezu vollständige und freie Implementierung als Ersatz für die Klasse „MapView“ basierend auf den Daten Listing 4: AndroidManifest.xml des OpenStreetMap-Projekts [6] existiert.

Java aktuell 3-2012 | 65 Android

public class MyMap extends MapActivity implements LocationListener { Impressum LocationManager locationManager; MapView myMapView; Herausgeber: MyLocationOverlay myLocationOverlay; Interessenverbund der Java User Groups e.V. (iJUG) @Override Tempelhofer Weg 64, 12347 Berlin public void onCreate(Bundle savedInstanceState) { Tel.: 0700 11 36 24 38 super.onCreate(savedInstanceState); www.ijug.eu setContentView(R.layout.mymapview); myMapView = (MapView)findViewById(R.id.mymapview); Verlag: myMapView.setBuiltInZoomControls(true); DOAG Dienstleistungen GmbH myMapView.getController().setZoom(13); Fried Saacke, Geschäftsführer myLocationOverlay = new MyLocationOverlay(this, myMapView); [email protected] myMapView.getOverlays().add(myLocationOverlay); myLocationOverlay.enableMyLocation(); myLocationOverlay.runOnFirstFix(new Runnable() { Chefredakteur (VisdP): @Override Wolfgang Taschner, public void run() { [email protected] myMapView.getController().animateTo (myLocationOverlay.getMyLocation()); Redaktionsbeirat: } Ronny Kröhne, IBM-Architekt; }); Daniel van Ross, NeptuneLabs; locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); Dr. Jens Trapp, Google } @Override protected boolean isRouteDisplayed() { Chefin von Dienst (CvD): return false; Carmen Al-Youssef, } [email protected] @Override protected void onPause() { Titel, Gestaltung und Satz: locationManager.removeUpdates(this); Claudia Wagner super.onPause(); DOAG Dienstleistungen GmbH } @Override Anzeigen: protected void onResume() { CrossMarkeTeam, Ralf Rutkat, locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); Doris Budwill myMapView.invalidate(); super.onResume(); [email protected] } @Override Mediadaten und Preise: public void onLocationChanged(Location location) { http://www.ijug.eu/images/ MapView myMapView = (MapView)findViewById(R.id.mymapview); vorlagen/2011-ijug-mediadaten_java_ MapController mapController = myMapView.getController(); aktuell.pdf int latitude = (int)(location.getLatitude() * 1E6); int longitude = (int)(location.getLongitude() * 1E6); Druck: GeoPoint geoPoint = new GeoPoint(latitude, longitude); adame Advertising and Media mapController.animateTo(geoPoint); GmbH Berlin } www.adame.de ...

}

Listing 3: MyMap.java

Links Andreas Flügge [1, 2 und 3] Verweis auf Java-Aktuell-Artikel [email protected] [4] Internetseite des Google Maps API-Key: aktuell http://code.google.com/intl/de-DE/android/add- Andreas Flügge ist seit 2002 Senior ons/google-apis/mapkey.html [5] Internetseite zur Erzeugung eines API-Key: Consultant bei der Object Systems http://code.google.com/android/maps-api- GmbH, eine Tochtergesellschaft der signup.html ORDIX AG. Seit 1999 ist er im Java- [6] Internetseite für osmdroid: http://code.google. Umfeld tätig. Seine Schwerpunkte com/p/osmdroid/

sind Java-Enterprise-Umgebungen Java Magazin der Java-Community [7] Internetseite von Open Street Map: http://www. openstreetmap.de/ und Softwarearchitekturen.

66 | SHI_Anz.SolR-Expert_A4_Layout 1 03.05.12 15:03 Seite 1

Nr. 03 | Herbst 2012 | www. ijug.eu www.ijug.eu

aktuell Jetzt JavaDas Magazin der Java-Community Java Abo in Höchstform aktuell bestellen Java EE 6: GlassFish, JBoss und Geronimo, Seite 11

Java Android: Wissenschaftliche Applikationen BECOME A EXPERT. der nächsten Generation entwickeln, Seite 38 ISSN 2191-6977 Jnect: Bewegungen in Java erkennen, Seite 59 Sichern Sie sich Benelux: 5,80 EUR

CH: 9,80 CHF 9,80 CH: 4 Ausgaben für 18 EUR EUR A: 5,60

– jetzt auch Online- EUR D: 4,90 NEU schulungen verfügbar! Für Oracle-Anwender und Interessierte gibt es das Java aktuell

Abonnement auch mit zusätzlich sechs Ausgaben im Jahr der

iii iii iiiiii Fachzeitschrift DOAG News und vier Ausgaben im Jahr Busi- iJUG ness News zusammen für 70 EUR. Weitere Informationen unter 4 191978 304903 03 Verbund www.doag.org/shop/

faxen Sie das ausgefüllte formular an 0700 11 36 24 39 oder bestellen Sie online go.ijug.eu/go/abo

Interessenverbund der Java User Groups e.V. Tempelhofer Weg 64 12347 Berlin

+ + + ausfüllen + + + ausschneiden + + + abschicken + + + ausfüllen + + + ausschneiden + + + abschicken + + + ausfüllen

 Ja, ich bestelle das Abo Java aktuell – das IJUG-Magazin: 4 Ausgaben zu 18 EUR/Jahr  Ja, ich bestelle den kostenfreien Newsletter: Java aktuell – der iJUG-Newsletter Nehmen Sie an einer praxiserprobten und von zertifizierten Experten ausgerichteten Schulung teil! Trainingsdauer: 3 Tage. Anschrift ggf. rechnungsanschrift Die Schulung wurde von Entwicklern von Solr und Lucene konzipiert

und bietet einen Mix aus theoretischem und praktischem Wissen. Name, Vorname Straße, Hausnummer Weitere Infos: www.shi-gmbh.com/services/solr-training Firma PLZ, Ort TERMINE 2012 27.06. - 29.06.2012 (Frankfurt a. M.) 20.11. - 22.11.2012 (München) Abteilung E-Mail 18.09. - 20.09.2012 (Wien)

Straße, Hausnummer Telefonnummer

Apache Solr, Solr and their logos are trademarks of the Apache Software Foundation. PLZ, Ort Die allgemeinen Geschäftsbedingungen* erkenne ich an, Datum, Unterschrift

SHI Elektronische Medien GmbH *Allgemeine Geschäftsbedingungen: Tel.: +49 (0) 8 21 / 7 48 26 33-0 Zum Preis von 18 Euro (inkl. MwSt.) pro Kalenderjahr erhalten Sie vier Ausgaben der Zeitschrift “Java aktuell - das iJUG-Magazin“ direkt nach Erscheinen per Post zugeschickt. Die Abonnementgebühr wird jeweils im Januar für ein Jahr fällig. Sie erhalten eine entsprechende Rechung. Abonnementverträge, die während eines Jahres beginnen, werden mit 4,90 Euro (inkl. MwSt.) je volles Quartal berechnet. Das Abonnement verlän- E-Mail: [email protected] | www.shi-gmbh.com gert sich automatisch um ein weiteres Jahr, wenn es nicht bis zum 31. Oktober eines Jahres schriftlich gekündigt wird. Die Wiederrufsfrist beträgt 14 Tage ab Vertragserklärung in Textform ohne Angabe von Gründen. 