03-2013 | Herbst | www. ijug.eu Technik allein
bringt Sie nicht weiter. aktuell JavaPraxis. Wissen. Networking. Das Magazin für Entwickler Man muss wissen, wie man sie richtig nutzt. Java trägt Früchte aktuell
Neue Technologie Java-API für Batch-Anwendungen, Seite 8
Java Entwicklungsstrategien Software modular aufbauen, Seite 19 Mehr selbst entwickeln, Seite 23
Web-Entwicklung Das Web als Social Network, Seite 32 Neu: Wicket 6, Seite 40
Java und Oracle ADF Essential Mobile, Seite 52 D: 4,90 EUR EUR 4,90 D: EUR A: 5,60 CHF 9,80 CH: Benelux: EUR 5,80 ISSN 2191-6977
Trivadis ist das führende Unternehmen für IT-Beratung, Systemintegration und IT-Services mit Fokussierung auf Oracle- und Microsoft-Technologien. Unsere Leistungen erbringen wir aus den strategischen Geschäftsfel- dern Application Development, Business Intelligence, Infrastructure Engineering und Training. Darüber hinaus
übernimmt die Trivadis Services den korrespondierenden Betrieb Ihrer IT Systeme. Sprechen Sie mit uns iii über Ihre IT-Lösungen und vor allem: welchen Nutzen wir Ihnen bringen. www.trivadis.com. iii iiiiii iJUG Trivadis Holding AG Europa-Strasse 5 CH-8152 Glattbrugg Telefon +41 4480870-20 www.trivadis.com [email protected] Verbund
03/2013 - 2013 05 08 - Java aktuell Titel - Druck.indd 1 15.05.13 15:58 DOAG 2013 Development 19. Juni 2013, Bonn
Eine Konferenz für den Erfahrungsaustausch von Software-Entwicklern
Themen: • DB Programmierung: PL/SQL, APEX, Spatial • BPM & Software-Architektur • Java & Open Source • Forms, Reports, ADF und BI Publisher
Aussteller:
Im Fokus: Agile and Beyond – Projektmanagement in der Oracle-Software-Entwicklung Wohin geht die Reise? (Part Two)
http://development.doag.org
2013_05_14_A4_Eigenanzeige_Development.indd 1 14.05.13 10:18
iii iii iiiiii www.ijug.eu
Wolfgang Taschner Chefredakteur Java aktuell
99 Flaschen Bier
Die Website „http://99-bottles-of-beer.net“ basiert auf einer Idee von Tim Robinson. Er begann in den 1990er Jahren, den Text des in Amerika beliebten Lieds „99 Bottles of Beer“ in der damals populären Programmiersprache BASIC umzusetzen. Frei übersetzt lautet der Text: „99 Flaschen Bier an der Wand, nimm´ eine herunter und reich´ sie herum, dann sind noch 98 Flaschen Bier an der Wand. 98 Flaschen Bier an der Wand, nimm´ eine herunter …“ Das geht so lange, bis alle Flaschen heruntergenommen sind. Bei null angekommen, lautet die Strophe: „Keine Flaschen Bier mehr an der Wand, geh´ in den Laden und kauf´ neue, dann sind 99 Flaschen Bier an der Wand.“ Dann beginnt wieder alles von vorn. Der relativ einfache Algorithmus hat im Lauf der Jahre zahlreiche Programmierer angespornt – mittlerweile ist das Lied in mehr als 1.500 verschiedenen Programmiersprachen codiert und auf der Website abgelegt worden. Das Spektrum beginnt bei „A+“ und endet bei „ZZT“. Schon das Schmökern unter den vielen Sprachen ist sehr kurzweilig, allein wenn man den Unterschied zwischen Uralt-Sprachen wie „Cobol“ oder dem „Assembler für 8080“ und den modernen Sprachen betrachtet. Jeder Besucher der Website kann jede Sprache bewerten und kommentieren. Im Top-Ranking der am besten bewerteten Sprachen sind auf den ersten 25 Plätzen immerhin „Clujure“ und „Ruby“ vertreten. „Java“ ist natürlich auch unter den 1.500 Sprachen dabei. Die zahlreichen Kommentare zum veröffentlichten Java-Code zeigen, wie sich die Sprache weiterentwickelt hat und wie man das Programm für das Lied unter den verschiedensten Aspekten angehen kann. Auch in dieser Ausgabe der Java aktuell möchte ich Ihnen eine große Bandbreite an Themen vorstellen, die alle mit Java zu tun haben. Ich hoffe, dass der eine oder andere Artikel Ihnen bei Ihren Projekten hilft, und freue mich wie immer auch über Ihr Feedback an redak- [email protected].
Ihr
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-2013 | 3 Inhalt
3 Editorial 55 Performance-Falle beim Logging: 63 Integration von Java via JNI in traditi- Die Zeitstempel-Formatierung onelle Cobol-Batch-Anwendungen Jürgen Lampe Marc Bauer und Martin Kiefer 5 Das Java-Tagebuch Andreas Badelt, Leiter der DOAG SIG Java 61 Unbekannte Kostbarkeiten des SDK 43 Unsere Inserenten Heute: Web-Services Bernd Müller 66 Impressum 8 Java-API für Batch-Anwendungen Peter Doschkinow
11 Skalierbare Cluster-Topologien mit dem JBoss AS 7 Heinz Wilming und Immanuel Sims
15 Lightweight AOP mit CDI und JPA Prof. Dr. Michael Helbig
19 Software modular bauen Ulf Fildebrandt
23 Software – weniger kaufen, mehr bauen Erik Dörnenburg
27 Diagramm-Bibliotheken für Android Falko Krische
32 WebID: Das Web als Social Network Angelo Veltens
37 Vermittlungsinstanzen sind gefragt Tobias Hartwig
40 Anspruchsvolle Web-Anwendungen Ein Lastverteiler sorgt dafür, dass Lastverteilung und Failover nur innerhalb eines Subclusters mit Wicket 6 stattfinden. Skalierbare Cluster-Topologien mit dem JBoss AS 7, Seite 11 Jochen Mader
44 „Java ist Grundlage für meine Software-Projekte …“ Interview mit Dirk Dittert
45 Nachgefragt … Uwe Sauerbrei
49 Den Rollladen steuern mit Pi René Jahn
52 ADF Essentials Mobile – Ein unlös bares Problem? Markus Klenke
Wer auf keine Funktion verzichten möchte und schon immer von einer eigenen Rollladensteuerung träumte, findet hier eine Anleitung für den Raspberry Pi, Seite 49
4 |
iii iii iiiiii www.ijug.eu
Das Java-Tagebuch
Andreas Badelt, Leiter der DOAG SIG Java
Das Java-Tagebuch gibt einen Überblick über die wichtigsten Geschehnisse rund um Java – in kompri- mierter Form und chronologisch geordnet. Der vorliegende Teil widmet sich den Ereignissen im ersten Quartal 2013. von Java EE 7 verpasst. Die Expertengrup- werden konnten, hatte Oracle bereits ange- 21. Januar 2013 pen der beiden Specification Requests ha- kündigt, schnell nachzubessern. Das ist nun ben das gemeinsam entschieden, da JCache geschehen, damit stehen wir bei SE 7 Up- Java-Frameworks beeinflussen laut CAST die zuletzt einige Termine verpasst habe und date 15 beziehungsweise SE 6 Update 41. Software-Qualität offensichtlich noch viel zu tun sei. Die Ar- CAST Research on Application Software beit soll jedoch zügig weitergehen, sodass Health (CAST) hat einen neuen „CRASH“- JCache dann bald als „drop-in“-API genutzt 22. Februar 2013 Report veröffentlicht, in dem der Einfluss werden kann und auf jeden Fall in Java EE von Frameworks auf die Qualität von Soft- 8 aufgenommen wird, siehe https://blogs. Der Name „Sun“ verschwindet Stück für Stück ware untersucht wurde. Begutachtet wur- oracle.com/theaquarium/entry/jcache_to_ Wer schon mal mit Legacy Code gearbei- den 496 Anwendungen mit 152 Millionen miss_java_ee tet hat, weiß, wie hartnäckig sich Namen Codezeilen von 88 Organisationen aus von Firmen darin halten, die längst nichts sechs verschiedenen Branchen; per Daten- mehr mit dem Code zu tun haben oder gar Analyse wurden unter anderem die Unter- 1. Februar 2013 nicht mehr existieren, etwa als Package- schiede zwischen der Nutzung von Struts, Namen. Ein gutes Beispiel ist der Name der Hibernate und Spring herausgeschält. Nicht Critical Patch Update für Java SE schon da Firma, die Java herausgebracht hat, richtig: überraschend wird festgestellt, dass das Das neue Critical Patch Update (SE 7 Up- „Sun“. Stück für Stück scheint er nun zu Mischen von Java beispielsweise mit C und date 13 beziehungsweise SE 6 Update 39) verschwinden − diesmal sind die Name- C++ die Qualität im Durchschnitt mindert − ist früher als geplant herausgekommen spaces in den Java-EE-7-APIs dran. Den eher überraschend steigt sie aber bei einem − offensichtlich unter dem Druck der Si- immer noch zahlreichen Sun-Fans lässt das Mix etwa mit COBOL oder .NET. Die Nut- cherheitslücken mit aktiven Exploits, die bestimmt das Herz bluten: https://blogs. zung von Struts wiederum führt laut Stu- viele Firmen und Benutzer dazu veranlasst oracle.com/theaquarium/entry/java_ee_ die eher zu geringerer, die von Hibernate haben, Java im Browser zu deaktivieren be- schema_namespace_moved eher zu höherer Qualität. Framework-Kom- ziehungsweise gleich ganz zu deinstallie- plexität in Kombination mit mangelndem ren. Der iJUG hatte über die Lücken berich- Training soll hier die Schuld tragen − für tet und versucht, die Diskussionen etwas zu 27. Februar 2013 diese Aussage allein hätte man aber sicher versachlichen: http://www.ijug.eu/index. keine große Studie benötigt. Das Highlight php?id=1399 „Adopt a JSR“-Organisation macht Fortschritte für alle alten, neuen und wiedergewonnen Im Januar gab es bereits ein erfolgreiches Fans von Java EE: Die Nutzung von purem Online-Meeting zu „Adopt a JSR“ mit JUG- Java EE ohne andere Sprachen und Frame- 19. Februar 2013 Repräsentanten. Dazu wurde jetzt ein works führt zu den höchsten Qualitätswer- Follow-up gehalten, in dem es speziell um ten. Für alle, die neugierig geworden sind Java EE 7 Maven Repository Coordinates Tipps für „Hackdays“ und ihre erfolgreiche − die Studie kann bezogen werden unter Wer mit Maven arbeitet und schon mal die Gestaltung zum Wohle eines JSR ging. Mit- http://www.castsoftware.com/news- neuen Java-EE-7-APIs benutzen möchte, te Februar 2013 gab es darüber hinaus ein events/press-release/press-releases/cast- wird sich sicher über den GlassFish-Wiki-Ein- Meeting für die JSR-Spec-Leads, um ihnen research-finds-java-frameworks-strongly- trag mit den aktuellen Maven-Koordinaten den Sinn des Programms zu erklären und influence-security-reliability dieser APIs freuen, auf den Oracle-Blogger wie sie die Zusammenarbeit mit den JUGs Reza Rahman dankenswerterweise verwie- gestalten und nutzen können. Insgesamt sen hat: http://wikis.oracle.com/display/ scheint das Programm mehr und mehr 31. Januar 2013 GlassFish/Java+EE+7+Maven+Coordinates Fahrt aufzunehmen und sich immer besser zu organisieren. Treffen verpasst oder gene- JCache nicht in Java EE 7 Schon wieder ein Critical Patch Update rell neugierig, was dort besprochen wurde? JCache, der inzwischen wieder aktive JSR Da das CPU vom 1. Februar 2013 immer Dann hilft das Multimedia-Archiv des JCP. 107 (gestartet vor mehr als zwölf Jahren!), noch bekannte kritische Lücken offengelas- Dort finden sich Tonaufnahmen und Folien: hat leider den Sprung unter den Schirm sen hatte, die nicht rechtzeitig geschlossen http://jcp.org/en/resources/multimedia
Java aktuell 3-2013 | 5 Tagebuch
Zum (fast) gleichen Thema gibt es am Bayerischen Landesamts für Steuern sagte kündigt, dass CloudStack den „Inkubator“ selben Tag einen Blog-Eintrag von Arun gegenüber Heise Online: „Die aktuelle Dis- verlässt und in Zukunft als Top-Level-Pro- Gupta, in dem aufgelistet wird, wie sich die kussion über Java hat die Steuerverwaltung jekt geführt wird. CloudStack, eine Soft- Java-EE-7-JSRs beim Thema „Transparenz“, veranlasst, nach Lösungen zu suchen, die ware zum Aufsetzen von „Infrastructure wie vom Java Community Process seit Ver- die Nutzung des ElsterOnline-Portals kurz- as a Service“-Lösungen, war vor knapp sion 2.8 gefordert, und bei der Beteiligung fristig auch ohne Java zulassen, ohne auf einem Jahr von Citrix an die Apache Soft- der Community schlagen. Laut Gupta sind die Nutzung von sicherer Zertifikatstechno- ware Foundation übergeben worden und die Transparenz-Vorgaben von allen JSRs logie verzichten zu müssen.“ Das klingt ein wird dort weiter von Citrix-Mitarbeitern, vollständig eingehalten. Darüber hinaus bisschen so, als ob nun schnell das Kind mit aber auch einem großen und wachsenden gibt es bei den meisten JSRs eine sehr star- dem Bade ausgeschüttet werden soll − wir Stamm von freien Unterstützern als Open- ke Beteiligung von Java User Groups bezie- warten gespannt auf die Alternativen. Source-Projekt weitergeführt, https://blogs. hungsweise generell aus der Community. apache.org/foundation/entry/the_apache_ Natürlich sind auch die JSRs beziehungs- software_foundation_announces40 weise ihre Spec Leads darauf angewiesen, 7. März 2013 dass ihr Thema auf möglichst viel Begeiste- rung stößt. Da hat sicher nicht jeder JSR die Red Hat übernimmt Projektleitung für das OpenJDK 6 4. April 2013 gleichen Voraussetzungen, aber natürlich Der offizielle Support für das OpenJDK 6 ist sollte ein Spec Lead auch in der Lage sein, ausgelaufen, Bugfixes soll es nur noch für Java EE 7 kurz vor dem Ziel und weitere JSR Updates Begeisterung zu wecken: https://blogs. kommerzielle Varianten geben. Jetzt springt Das gesammelte JSR-Update für Februar oracle.com/arungupta/entry/transpa- allerdings Red Hat in die Bresche und über- und März ist auf „blogs.oracle.com“ ver- rency_and_community_participation_in nimmt laut einer Presseerklärung eine füh- öffentlicht worden und zeigt jede Menge rende Rolle im OpenJDK-6-Projekt. Was das Bewegung. Der Java-EE-7-Umbrella-JSR so- im Detail bedeutet, wird nicht erklärt, aber wie viele der darauf referenzierten zu ak- 5. März 2013 es geht um „erweiterten Support für die tualisierenden JSRs wie JAX-RS 2.0 und JSF Technologie und ihre Nutzer“, was vor dem 2.2 sind in den vergangenen Tagen jeweils Weiterer Security Patch für Java mit mäßigem Erfolg Hintergrund der jüngst entdeckten Sicher- als „Proposed Final Draft“ veröffentlicht Oracle hat einen weiteren Security Patch heitslücken sehr wichtig ist. Red Hat nutzt worden. Über sie wird in den nächsten Wo- für Java SE herausgebracht. Wie Heise On- den sich bietenden Raum, um sich einen chen abgestimmt. Daneben gab es noch line meldet, hat der polnische Sicherheits- Namen als verlässlicher Partner im Java- eine Reihe von „Maintenance Reviews“, experte Adam Gowdiak, der Oracle bereits Ökosystem zu machen. SE-6-Nutzer, die etwa für JCA 1.6 und EJB 3.1, „Early Draft auf mehrere Lücken hingewiesen hat, wei- noch nicht auf SE 7 umstellen können oder Reviews“ für die zwei Java-SE-Spezifika- terhin Probleme in der neuesten Version wollen, haben damit weiterhin kostenlosen tionen „Lambda Expressions“ und „Anno- feststellen können, http://www.heise.de/ Support, wenn sie das OpenJDK verwenden. tations on Java Types“ sowie einen neu- open/meldung/Java-trotz-Notfall-Patch- en JSR „Portlet Specification 3.0“, https:// verwundbar-1815992.html blogs.oracle.com/jcp/entry/jsr_updates11 22. März 2013 7. März 2013 TomEE − der Retter von Java EE? 8. April 2013 In einem InfoWorld-Artikel wird Apache Tom Von Elstern und gestohlenen Schlüsseln EE als Retter des „in der Zeit eingefrorenen“ Oracle by Example: Neue Trainings unter anderem zu Im Zusammenhang mit den Security Pat- Java EE beschrieben, mit Zitaten von David Java SE 8 Lambda Expressions ches für Java SE passen zwei weitere Mel- Blevins, dem Gründer des Projekts. Dieser Es gibt inzwischen jede Menge freie Trai- dungen von Heise Online: Erstens, dass bei antwortet in seinem Blog prompt, dass Java nings zu Java auf der Oracle-Webseite, Java die Prüfung auf zurückgezogene Zerti- EE keine Rettung benötige, sondern sich mit etwa zu Lambda Expressions. Das volle Pro- fikate nicht standardmäßig aktiviert ist. Da- EE 6 und der ersten öffentlich entwickelten gramm lässt sich abrufen unter http://www. für mag es Gründe geben, denn die Prüfung Spezifikation EE 7 ausgesprochen gut ent- oracle.com/goto/oll erfordert einen Netz-Zugriff. Aber wenn ein wickle. Die Hauptmotivation für TomEE liege Zertifikat etwa aufgrund eines gestohlenen darin, die alte Frage „Tomcat oder Java EE?“ privaten Schlüssels zurückgezogen wird, überflüssig zu machen, http://blog.dblevins. 9. April 2013 sollte das JRE damit signierte Applets nicht com/2013/03/saving-java-ee.html mehr akzeptieren und zwar bei allen Nut- Apache Struts 1 ist „End of Life“ zern, nicht nur bei denjenigen, die die Prü- Apache Struts 1 ist von Apache offiziell be- fung manuell aktivieren. Zweitens haben 25. März 2013 endet worden. Immerhin war es dreizehn die ganzen Diskussionen um die Sicherheit lange Jahre aktiv und eines der ältesten inzwischen sogar die Steuerverwaltung Apache CloudStack wird Top-Level-Projekt Projekte der Apache Software Foundati- geweckt: Ein Sprecher des zuständigen Die Apache Software Foundation hat ange- on. Allerdings liegt das letzte Release auch
6 |
iii iii iiiiii www.ijug.eu
schon fünf Jahre zurück. Der Nachfolger light/entry/java_spotlight_episode_125_ gute Idee sei. Weihnachten in Deutschland Struts 2 ist jedoch weiterhin aktiv, https:// terrence ist in der Regel kürzer, aber vielleicht ist es blogs.apache.org/foundation/entry/me- ja auch nur ein willkommener Grund, noch dia_alert_the_apache_struts ein paar Wochen extra herauszuholen. 17. April 2013 Wenn es denn der Qualität dient … http:// mreinhold.org/blog/secure-the-train 10. April 2013 Oracle stopft weitere Sicherheitslücken Mit dem Update 21 für Java SE 7 (und Up- Maven-Archetyp für Java EE 7 date 25 für SE 6) werden nicht nur Fehler 26. April 2013 Eine weitere Erleichterung für Maven-Nut- im Code behoben, sondern auch einige zer, die schon mit der Java-EE-7-Spezifikati- Dinge generell geändert: Im Java Control Java EE 8 verzögert on arbeiten möchten, ist ein Archetyp, mit Panel gibt es die Sicherheitsstufen „nied- Wie erwartet kündigt Mark Reinhold eine dem neue EE-7-Projekte in der richtigen rig“ und „benutzerdefiniert“ nicht mehr. gute Woche nach seinem Vorschlag zur Ver- Struktur automatisch angelegt werden In Abhängigkeit von der gewählten Stufe schiebung des Java SE 8 Release an, dass können, https://blogs.oracle.com/theaqua- und der Aktualität des JRE laufen Applets diese Variante angenommen wurde. Das rium/entry/java_ee_7_maven_archetypes gegebenenfalls gar nicht mehr. Betroffen neue Release-Datum ist also der 18. März sind diese, die unsigniert beziehungswei- 2014, http://mreinhold.org/blog/hold-the- se mit einem Zertifikat signiert sind, das train 12. April 2013 nicht von einer akzeptierten „Certificate Authority“ bestätigt ist. Die Sicherheitsdia- OpenJDK: Freie Mitglieder des Governing Board loge wurden überarbeitet und die Risiken 30. April 2013 wiedergewählt besser herausgestellt. Der Nutzer muss bei Andrew Haley (Red Hat) und Prof. Doug Lea steigendem Risiko auch mehr tun, um dies JSR Updates (State University of New York) sind beide als zu akzeptieren. Außerdem gibt es jetzt ein Noch ein Update vom JCP: Insgesamt 14 freie („at-large“) Mitglieder des OpenJDK Server-JRE, das kein Java-Plug-in, kein Au- Java-EE-7-JSRs haben in den letzten Wo- Governing Board wiedergewählt worden. to-Update und keinen Installer beinhaltet, chen den „EC Final Approval Ballot“ be- Sie ergänzen damit weiterhin die anderen http://www.ijug.eu/home-ijug/aktuelle- standen und werden nun als finalisierte von Oracle („Chair“ George Saab, „Lead“ news/article/java-7-update-21-foerdert- Releases (Spezifikation, Referenz-Imple- Mark Reinhold) und IBM („Vice-Chair“ John signierte-applets.html mentierung, Test Compatibility Kit) auf jcp. Duimovich) nominierten Board-Mitglieder org veröffentlichen. Hier scheint es also als Vertreter der Community. Wahlberech- keine weiteren Verzögerungen zu geben, tigt waren alle zu Beginn der Wahlperiode 18. April 2013 https://blogs.oracle.com/jcp/entry/jsr_up- im OpenJDK-Projekt vertretenen Mitglieder. dates_april_15 Das sind allerdings nur wenig mehr als hun- Java EE 8: Vorschlag zur Verschiebung dert, hier kann sich die Java-Community Nicht zum ersten Mal muss Mark Reinhold sicher noch aktiver einbringen. Gegenkan- die unangenehme Nachricht verkünden, didaten gab es nicht, beide wurden einstim- dass dem „release train“ eine Verspätung mig bei jeweils drei Enthaltungen und 35 droht, diesmal für Java SE 8. Er begründet beziehungsweise 36 Ja-Stimmen gewählt. dies hauptsächlich mit der vermehrten Arbeit an Security Fixes und der generell gestiegenen Aufmerksamkeit für „siche- Andreas Badelt 15. April 2013 ren Code“, die auch zu Umstellungen im Leiter der DOAG SIG Java Entwicklungsprozess geführt hat. Damit Java ME 3.3 für ARM Cortex freigegeben hätten einige Features den Meilenstein 6 Für den Raspberry Pi steht die Java ME „feature complete“ Ende Januar 2014 nicht 3.3 Runtime erst als „early access“ zur Ver- einhalten können. Die Alternativen seien fügung. Für den weit verbreiteten ARM- nun, entweder den Zug ohne den promi- Cortex-M3-Prozessor hat Oracle jetzt die nentesten Passagier „Lambda Expressions“ Runtime-Version offiziell freigegeben („ge- weiterfahren zu lassen oder den Fahrplan neral availability“). Terrence Barr von Oracle anzupassen. Reinhold hält die Anpassung schreibt in seinem Blog, dass inoffiziell auch für die bessere Alternative. Sein Vorschlag, die M4-Version unterstützt wird. Für Em- den er an die offene Mailingliste des Open- bedded-Entwickler öffnet sich damit eine JDK schickt, sieht eine Verzögerung von Andreas Badelt ist Technology Architect bei Infosys Limited. Da- große Welt von Mikro-Prozessoren ohne einem halben Jahr vor − statt Anfang Sep- neben organisiert er seit 2001 ehrenamtlich die Special Interest Cross Compilation und ähnlich lästige tember 2013 dann Mitte März 2014, da Group (SIG) Development sowie die SIG Java der DOAG Deutsche Dinge, https://blogs.oracle.com/javaspot- ein Release um Weihnachten herum keine ORACLE-Anwendergruppe e.V.
Java aktuell 3-2013 | 7 Update
UPDATE An dieser Stelle erhalten Sie in jeder Ausgabe ein Update über das Geschehen in der Java-Community Java-API für Batch-Anwendungen
Peter Doschkinow, ORACLE Deutschland B.V. & Co. KG
Eines der neuen und lang ersehnten Features von Java EE 7 ist die Unterstützung von Batch- Anwendungen. Im Rahmen der neuen Teilspezifikation JSR-352 werden die Entwicklung und der Betrieb von klassischen Batch-Applikationen auf der Java-Plattform vereinfacht und standardisiert. Der Artikel führt in die Konzepte und Möglichkeiten dieser neuen Technologie ein, die der Java-Entwickler bei der Implementierung von Batch-Prozessen nutzen kann.
Batch-Anwendungen gehören zu den ers- gestellt, etwa die Möglichkeit, den Lebens- tiert das Auslesen von Input-Daten, der ten Computer-Anwendungen, bei denen zyklus von Batch-Instanzen zu steuern, „ItemProcessor“ kapselt die Geschäftslogik Programme – auch „Jobs“ genannt – auto- zu stoppen und neu zu starten. JSR-352 zur Verarbeitung der Datensätze und der matisch und weitgehend ohne menschliche definiert eine Job Specification Language „ItemWriter“ repräsentiert die Ausgabe Intervention im Hintergrund ausgeführt als Domänen-spezifische Sprache, ein Java- der Ergebnisse. Ein „JobOperator“ ist die werden. Typischerweise werden dabei Programmiermodell und eine Laufzeitum- Schnittstelle zur Verwaltung aller Aspekte große Datenmengen mit oft hohen Anfor- gebung für Batch-Anwendungen für Java der Job-Verarbeitung mit Kommandos wie derungen an Computer-Ressourcen ver- SE und Java EE, die solchen Anforderungen „start“, „stop“ und „restart“ sowie zu „Job- arbeitet, wie automatisierte Transaktions- gerecht werden. Das Ziel ist, ähnlich wie bei Repository“, um Informationen über lau- Verarbeitung, Datenanalyse- oder „Extract anderen Java-Standards wie JPA und CDI, fende Jobs und Steps zu bekommen. Transform Load“-Data-Warehouse-Anwen- existierende Best-Practices für Batch-An- In JSR-352 gibt es zwei Arten von Steps: dungen (ETL). Batch-Anwendungen können wendungen zu konsolidieren und zu stan- „Chunk-Steps“ und „Batchlet-Steps“. Chunk- sequenziell, parallel, zeitgesteuert oder bei dardisieren. Nachfolgend sind die Hauptbe- Steps sind eine Variation des Step von Ab- Bedarf ausgeführt werden. Neben Online- standteile von JRS-352 kurz vorgestellt. bildung 1 und dienen zur effizienten Mas- Applikationen tragen sie durch unterschied- sen-Datenverarbeitung mit Unterstützung liche Priorisierung dazu bei, verfügbare Grundkonzepte und die Job-Sprache von Checkpoints. Sie implementieren das Rechenkapazitäten optimal auszunutzen. In den vergangenen Jahrzehnten hat sich am häufigsten genutzte Muster der Verar- Historisch bedingt ist der Löwen-Anteil von eine Referenz-Architektur für Batch-An- beitung in Datenblöcken: Datensätze wer- Batch-Anwendungen noch in Cobol ge- wendungen durchgesetzt, die sich in zahl- den einzeln ausgelesen und verarbeitet, in schrieben. Angesichts der Mächtigkeit der reichen Implementierungen auf verschie- Datenblöcken akkumuliert und in dersel- Java-Plattform, der vergleichbar günstigen denen Plattformen wie COBOL/Mainframe, ben Transaktion ausgegeben (siehe Abbil- Verfügbarkeit von Java-Know-how auf dem C++/Unix und in letzter Zeit Java/every- dung 2). Arbeitsmarkt und der häufigen Notwendig- where bewährt hat. Abbildung 1 zeigt eine Batchlet-Steps sind für Task-orientierte, keit zur Konsolidierung und Migration auf vereinfachte Darstellung. problemspezifische Steps gedacht, für die eine Plattform ist der Bedarf an Unterstüt- Ein Job wird durch die Job-Sprache eine Verarbeitung in Datenblöcken/Chunks zung von Batch-Verarbeitung in Java be- definiert und kapselt die gesamte Batch- nicht geeignet ist. Sie werden einmal aus- trächtlich. In der Java-Welt gibt es bisher nur Verarbeitung ein. Er besteht aus mehreren geführt, geben einen Exit-Status zurück proprietäre Lösungen dafür, etwa Spring Schritten („Steps“). Jeder Step kapselt eine und müssen einen Stop-Callback imple- Batch [2] oder WebSphere Batch [3]. Andere sequenzielle, unabhängige Verarbeitungs- mentieren, um gegebenenfalls vom Job- Alternativen wie BPMN-/BPEL-basierte Ab- einheit, die nach dem einfachen Muster Operator storniert zu werden. laufsteuerung haben einen anderen Fokus „Read Process Write“ ausgeführt wird und Die Job-Sprache, die in JSR-352 defi- und scheinen ein Overkill für das zentrale, als wiederverwendbare Einheit betrachtet niert wird, spezifiziert eine Batch-Anwen- aber einfache Read-Process-Write-Muster werden kann. Der „ItemReader“ repräsen- dung in der Form eines Jobs, seine Steps von Batch-Anwendungen zu sein, die auf die schnelle und effiziente Verarbeitung von Riesen-Datenmengen spezialisiert sind. Batch-Anwendungen haben gemeinsa- me Anforderungen wie die Unterstützung von Logging, Checkpoints und Parallelisie- rung. An ihre Laufzeitumgebung werden ebenfalls gemeinsame Anforderungen Abbildung 1: Vereinfachte Architektur für Batch-Anwendungen
8 |
iii iii iiiiii www.ijug.eu
narien der Job-Verarbeitung und der entsprechenden Koordination von Java- EE-Transaktionen, gewähltem Parallelisie- rungs-Modell und Checkpoint-Behand- lung in Chunk-Steps.
Programmiermodell Das Batch-Programmiermodell ist durch Interfaces und Java-Annotations be- schrieben, die den Kontrakt zwischen der Batch-Anwendung und der Batch-Runtime festlegen. Im Job „XML“ werden Artefakte referenziert, die einen Teil dieser Interfaces Abbildung 2: Ausführung eines Chunk-Step implementieren und zu Laufzeit von der Batch-Runtime instanziiert und genutzt und die Reihenfolge ihrer Ausführung. Sie 1 referenzieren die entsprechenden Java- werden. Bezogen auf das Job-XML-Beispiel ist in XML implementiert, hat ein zugrunde Implementierungsklassen. in Listing 1 bedeutet das, dass der Java- liegendes XML-Schema und wurde unter Alternativ zur Parallelisierung über Splits Entwickler jeweils eine Implementierung anderem von Spring Batch [2] inspiriert. Im unterstützt Job XML das gängige Partition- von „ItemReader“, „ItemProcessor“ und folgenden Job-XML-Beispiel werden neben Map-Reduce-Muster, das auch zu extremen „ItemWriter“ sowie drei Implementierun- den schon erwähnten Chunk- und Batchlet- Performance-Verbesserungen auf Multi- gen von „Batchlet“ liefern muss. Steps auch „Flows“ und „Splits“ demonst- Core-Systemen führen kann. Dabei werden Um die Verbindung zwischen referen- riert (siehe Listing 1). derselbe Step mehrfach instanziiert und zierten Namen und Implementierungs- Ein Flow definiert eine Reihenfolge von die einzelnen Step-Instanzen in separaten klassen herzustellen, kann entweder die Steps, die zusammen als eine Einheit aus- Threads gleichzeitig ausgeführt (Partition- CDI-Annotation „@Named“ oder die „batch. geführt werden, während ein Split eine Phase). Zu jeder Step-Instanz gibt es einen xml“-Konfigurationsdatei genutzt werden. Menge von Flows definiert, die gleichzei- „Collector“ und einen „Analyzer“, die bei Eine Implementierung des referenzierten tig ausgeführt werden. Jeder Flow läuft in ihrer Ausführung ihre Zwischen- und End- „MyItemProcessor“ könnte wie in Listing 2 einem separaten „Thread“. Ein Split endet, Ergebnisse sammeln (Map-Phase). aussehen und vom Eintrag in „batch.xml“ wenn alle enthaltenen Flows abgeschlos- Nach dem Ablauf aller Step-Instanzen begleitet werden (siehe Listing 3). Eine sen sind. Die Attribute „reader“, „writer“ aggregiert der Reducer die Einzel-Ergeb- konsequente Nutzung von CDI- und Java- und „processor“ im „Chunk“-Element von nisse zu einem Gesamt-Ergebnis (Redu- Annotations würde auch eine reine POJO- Chunk-Step „step1“ sowie das Attribut „ref“ cer-Phase). In [1], Abschnitt 11.3, gibt es Implementierung ohne Einträge in „batch. in den „Batchlet“-Elementen der Batchlet- eine sehr übersichtliche algorithmische xml“ ermöglichen (siehe Listing 4). Steps „step2“, „step3“ und „step4“ in Listing Beschreibung der unterschiedlichen Sze- Das Batch-Programmiermodell sieht mehrere Listener-Interfaces vor, die in der Batch-Anwendung als Interceptoren für die einzelnen Phasen ihrer Ausführung dienen können, wie „JobListener“, „StepLis- und „@JobContext“ sind CDI-Qualifier, die bei Verwendung mit „@Inject“ den Zugriff der Anwendung auf die Job- und Runtime- Informationen ermöglichen. Batch-Anwendungen benötigen kein spezielles Packaging-Format. Sie können im Standard-„jar“-Format oder in jedem ande- ren Archiv-Format gepackt werden, das von der Ziel-Plattform unterstützt wird, etwa als Web- oder EJB-Modul. Das Konfigurations- file „batch.xml“, das zur Auflösung der im Job XML referenzierten Artefakte dient, soll unter dem Standard-Verzeichnis „META-INF“ bei „jar“-Archiven und unter „WEB-INF/clas- Listing 1: Job-XML-Beispiel mit Split, Flows, Chunk- und Batchlet-Steps ses/META-INF“ bei Web-Archiven abgelegt
Java aktuell 3-2013 | 9 Update
public class MyProcessor implements ItemProcessor{ Die Spezifikation des Java-API für Batch- … Anwendungen ist momentan im Status @Override „Proposed Final Draft“, sodass noch mit ge- public MyOutputRecord processItem(MyInputRecord item){ //process item and return MyOutputRecord wissen API-Änderungen zu rechnen ist [1]. … Das Projekt ist unter „jbatch.java.net“ behei- } matet. Im Unterschied zu anderen JSRs fin- } det man dort noch kein separates Javadoc- Listing 2 Archiv – es kann jedoch vom RI-Archiv [4] extrahiert werden. Die JSR-352-Referenz- Implementierung ist bereits in aktuelle [ Builds von GlassFish 4.0 integriert. Java-EE- ... Evangelist Arun Gupta hat in seinem Blog ] bereits ein Batch-Anwendungsbeispiel Listing 3 veröffentlicht, das auf GlassFish 4.0 b78 läuft [5]. @Named(„MyItemProcessor“) @ItemProcessor Fazit public class MyProcessor { Die JSR-352-Spezifikation geht weit über … @ProcessItem die hier zusammengefassten Features hi- public MyOutputRecord processItem(MyInputRecord item){ naus und beschäftigt sich auch mit der //process item and return MyOutputRecord Vererbung von Jobs-, Steps- und Flow- … Elementen für ihre bessere Wiederverwen- } dung und mit einer ausführlichen Fehlerbe- } handlung. Sie ist ein wichtiger Meilenstein Listing 4 auf dem Weg zur Adaption und Migration von Batch-Anwendungen und zur standar- JobOperator jobOp = BatchRuntime.getJobOperator(); disierten Unterstützung ihrer spezifischen jobOp.start(„myJob“, myJobParameters); Anforderungen in der Java-Welt. Listing 5: Bootstrapping einer Batch-Anwendung Referenzen sein. Analog ist für Job-XML-Files das Ver- Die Batch-Runtime definiert auch Inter- [1] JSR-352, Batch Applications for the Java Platform: http://java.net/projects/jbatch/downloads/down- zeichnis „META-INF/batch-jobs“ vorgesehen. faces, über die sie ihre Zustands-Informatio- load/JSR 352 Proposed Final Draft v1.7.pdf nen und Statistiken in verschiedenen Metri- [2] Spring Batch: http://static.springsource.org/ Laufzeit-Umgebung ken wie Read-/Write-Count, Commit-Count spring-batch/reference/html/index.html [3] WebSphere Batch: http://www.ibm.com/de- Die Batch-Runtime ist für das Laden des Job etc. zur Verfügung stellt. Sie kann direkt auf veloperworks/websphere/techjournal/1203_ XML, der dort referenzierten Batch-Artefak- Java SE oder eingebettet in einem Java EE narain/1203_narain.html te und für seine Ausführung zuständig. Re- Application Server laufen. Im letzteren Fall [4] JSR-352 RI: http://java.net/projects/jbatch/ downloads/download/jsr352-SE-RI-1.0.zip ferenzierte Batch-Artefakte können imple- klinkt sie sich über SPI in den Transaktions- [5] Arun Gupta Blog: https://blogs.oracle.com/ mentierungsabhängig, beispielsweise über Manager des Application-Servers ein, so- arungupta/entry/chunked_step_using_batch_ CDI, oder mit dem Standard-Archiv- oder dass Chunk-Steps in einem transaktionalen applications ThreadContext-Classloader geladen und Kontext ausgeführt und gegebenenfalls zu- Peter Doschkinow instanziiert werden. Das Laden und Starten rückgerollt werden können. [email protected] von Job XML erfolgt über das Interface „Job Operator“. Dieser ist die zentrale Schnitt- Status und Referenz-Implementierung stelle für eine interaktive oder automatische Die Experten-Gruppe für JSR-352 wird von Verwaltung aller laufenden Batch-Anwen- Chris Vignola von IBM, früher Chef-Archi- dungen. Die Klasse „BatchRuntime“ reprä- tekt der WebSphere-Batch-Technologie, sentiert die JSR-352-Laufzeitumgebung angeführt und durch die Teilnahme von und dient als Factory für den Zugriff auf das Oracle, Red Hat, VMware und Credit Suisse „JobOperator“-Interface. Die beiden Zeilen verstärkt. Ihre Arbeit erfolgt entsprechend in Listing 5 zeigen das Bootstrapping einer den Richtlinien von JCP 2.8 und ist deshalb Batch-Anwendung, das beispielsweise in ei- von Anfang an öffentlich einsehbar. Die Peter Doschkinow arbeitet als Senior Java Architekt bei Oracle ner asynchronen EJB-Methode oder durch Java-Community kann über die öffentliche Deutschland. Er beschäftigt sich mit serverseitigen Java-Technolo- die Nutzung des ManagedExecutorService- E-Mail-Adresse „[email protected]“ gien und Frameworks, Web Services und Business Integration, die er in verschiedenen Kundenprojekten erfolgreich eingesetzt hat. API (JSR-236, Concurrency Utilities for Java Feedback geben und sich an der Arbeit Vor seiner Tätigkeit bei Oracle hat er wertvolle Erfahrungen als Java EE) ausgeführt werden kann. beteiligen. Architect and Consultant bei Sun Microsystems gesammelt.
10 |
iii iii iiiiii www.ijug.eu
Skalierbare Cluster-Topologien mit dem JBoss AS 7
Heinz Wilming und Immanuel Sims, akquinet AG
Hohe Verfügbarkeit und hohe Skalierbarkeit sind für viele Anwendungen im Unternehmensumfeld eine unabdingbare Anforderung. Der Einsatz von Clustertechnologien verspricht hier Lösungen, gestaltet sich in der Praxis aber herausfordernder als angenommen. Neben der technischen Komplexität ist auch das Spannungsfeld zwischen Skalierbarkeit und Hochverfügbarkeit aufzulösen.
In der letzten Ausgabe der Java aktuell wur- Die Schwierigkeit bei der Konzeption AS 7 verwendet und entspricht dem, was den die grundlegenden Clustering-Kon- eines Clusters ist, sowohl eine hohe Verfüg- wir als vollständige Replikation bezeichnet zepte des JBoss Application Server in der barkeit als auch eine ausreichende Skalier- haben (siehe Abbildung 1). Im Distribu- Version 7 dargestellt. Dieser Artikel stellt barkeit zu erreichen. Die Skalierbarkeit ei- tions-Modus kann im Gegensatz zur Repli- unterschiedliche Cluster-Topologien vor, nes Clusters bezeichnet dabei die Fähigkeit kation festgelegt werden, wie häufig ein die auch den Anforderungen an die Skalier- der Bewältigung wachsender Last durch Datum redundant vorgehalten wird (siehe barkeit und die Verfügbarkeit genügen und Hinzufügen zusätzlicher Ressourcen. Eine Abbildung 2). dabei die Restriktionen der Netzwerk-Infra- gute Skalierung ist beispielsweise beim Be- Bei dieser Art der Verteilung wird eine struktur und die Besonderheiten größerer trieb mehrerer voneinander unabhängiger bessere Skalierung erreicht, da die Anzahl Cluster-Umgebungen berücksichtigen. Server gegeben, die keinerlei Kenntnis da- der Redundanz unabhängig von der An- von haben, dass sie gemeinsam in einem zahl der Konten in einem Cluster ist. Da- Einführung Cluster arbeiten. Ein Lastverteiler sorgt durch wird es möglich, den Cluster durch Eine hohe Verfügbarkeit eines Clusters be- dafür, dass jeder Knoten gleichmäßig mit das dynamische Hinzufügen beziehungs- zeichnet die Fähigkeit einer Cluster-Topo- Anfragen versorgt wird. Dieses Konzept weise Entfernen von Knoten in den Dimen- logie, bei einem Ausfall einzelner Knoten skaliert sehr gut, aber wenn ein Knoten sionen „Speicher“ und „Rechenleistung“ zu die Aufgaben nahtlos an andere Knoten ausfällt, gehen die transienten Sitzungs- skalieren. Falls ein Knoten ausfällt, reorga- der Cluster-Topologie zu übertragen. daten verloren – Pech für den Nutzer, der nisiert sich der Cache, sodass die vorge- Hierzu ist es erforderlich, dass sowohl Sys- gerade seinen virtuellen Einkaufswagen schriebene Anzahl von Redundanzen wie- temkomponenten als auch transiente Sit- randvoll geladen hat. der erreicht wird. zungsdaten redundant vorgehalten wer- Eine vollständige Replikation und der Ein Nachteil ist jedoch, dass bei Dis- den. Die Verfügbarkeit wird dabei durch Betrieb unabhängiger Server sind zwei tribution ein Datum nicht unbedingt auf Hinzufügen weiterer Knoten erhöht. Dies extreme Konzepte. Es gibt auch Topologi- dem Knoten vorgehalten wird, auf dem geht jedoch zulasten der Skalierbarkeit, da en, die sowohl eine gute Skalierbarkeit als es angefragt wurde. Der jeweilige Knoten die Replikation von Daten mit anderen Kno- auch eine gute Verfügbarkeit aufweisen. wird mithilfe einer konsistenten Hash-Funk- ten der Topologie den Kommunikations- tion [2] ermittelt. Es entsteht eine höhere aufwand und Ressourcenbedarf erhöht. Replikation und Distribution Netzwerk-Kommunikation. Um diese zu Bei einem Cluster mit beispielsweise vier Im JBoss AS 7 dient der verteilte Cache verringern, kann bei Distribution ein First- Knoten und jeweils einem Gigabyte Spei- Infinispan [1] der Replikation transienter Level-Cache vor dem eigentlichen Cache cher stehen bei einer Replikation auf allen Sitzungsdaten. Beispielsweise werden die eingerichtet sein. Hierbei ist jedoch der Knoten nicht insgesamt vier, sondern nur Sitzungsdaten einer HTTP-Session oder zusätzliche Koordinationsaufwand für die ein Gigabyte Speicher für transiente Daten die Daten einer zustandsbehafteten EJB- Invalidierung von nicht mehr gültigen Da- zur Verfügung, da jedes Datum vierfach Komponente in sogenannten „Cache-Con- ten zu berücksichtigen. Ein solcher Cache vorgehalten wird. tainern“ in unterschiedlichen Regionen kann sich somit auch negativ auf die Ska- Durch das Hinzufügen weiterer Knoten verwaltet. Bei einem Ausfall kann somit lierbarkeit auswirken. wird der verfügbare Speicher also nicht der Klient transparent auf einen anderen erhöht, da alle anderen Knoten die Daten Server ausweichen und mit den redundant Synchrone und asynchrone Verteilung des neuen Knotens vorhalten und der vorgehaltenen Sitzungsdaten weiterarbei- Sowohl im Replikations- als auch im Dis- neue Knoten die Daten der bereits vorhan- ten. Ein Infinispan-Cache-Container kann tributions-Modus können die Daten syn- denen. Darüber hinaus ist auch ein erhöh- dabei in verschiedenen Modi betrieben chron oder asynchron verteilt sein. Bei ei- ter Aufwand für die Verteilung der Daten werden. Für Hochverfügbarkeit sind die ner synchronen Verteilung wird der Aufruf zu berücksichtigen. Allerdings wird eine zwei Varianten „Replikation“ und „Distribu- bis zur vollständigen Verteilung blockiert. höhere Verfügbarkeit durch die Erhöhung tion“ interessant. Replikation wird in den Im Fehlerfall erfolgt ein Rollback der Trans- der Redundanz erreicht. Standard-HA-Konfigurationen des JBoss aktion. Bei einer asynchronen Verteilung
Java aktuell 3-2013 | 11 JBoss
Abbildung 1: Infinispan-Replikation Abbildung 2: Infinispan-Distribution werden hingegen die jeweiligen Knoten den vorkonfigurierten Distribution Cache ticast). Dabei abstrahiert JGroups von der benachrichtigt und der Aufruf nicht blo- referenzieren. jeweiligen Netzwerk-Topologie auf Basis ckiert. Kommt es zu einem Fehler während eines Transportprotokolls und eines kon- der Verteilung, erfolgt kein Rollback der Effiziente Kommunikation mit JGroups figurierbaren Protokollstapels. JBoss AS 7 Transaktion. Fehler werden lediglich proto- Infinispan nutzt für die Cluster-Kommu- verwendet standardmäßig UDP als Trans- kolliert. Diese Verteilungsart erfordert auf- nikation JGroups [4]. Es ist ebenfalls als portprotokoll. Neben UDP können auch TCP grund der Asynchronität zudem eine As- eigenständiges Subsystem im JBoss AS 7 und TUNNEL als Transportprotokoll zum Ein- soziation der jeweiligen Session mit dem eingebunden und unterstützt sowohl satz kommen. TUNNEL ist, wie der Name aktuellen Knoten, da Änderungen gegebe- Punkt-zu-Punkt-Kommunikation (Unicast) suggeriert, zur Vereinfachung der Penetra- nenfalls noch in einer internen Queue auf als auch Gruppen-Kommunikation (Mul- tion von Firewalls gedacht, indem die Ver- ihre Verarbeitung warten und somit noch nicht auf anderen Knoten verfügbar sind. Cache-Konfiguration ... Der JBoss AS 7 ist bereits für den Betrieb eines Clusters vorkonfiguriert und bietet ... entsprechende Konfigurationsprofile an. Die Profile „HA“ und „Full-HA“ enthalten im Infinispan-Subsystem unter anderem ... die Cache-Container „web“, „ejb“ und ... „hibernate“ (siehe Listing 1). Der letztge- nannte agiert als Second-Level-Cache für Hibernate. Hierfür wird der spezielle Mo- dus „Invalidierung“ [2] genutzt. ... Der Container „web“ speichert die HTTP-Sitzungsdaten. Im Container „ejb“ ... werden die transienten Daten von zu- standsbehafteten EJB-Komponenten ab- ... gelegt. Für „web“ und „ejb“ ist sowohl eine Variante für Replikation („repl“) als auch eine Variante für Distribution („dist“) ... vorkonfiguriert. Um anstelle des Repli- ... kations-Modus den Distributions-Modus zu verwenden, kann das „default cache“- Attribut des jeweiligen Cache-Containers Listing 1
12 |
iii iii iiiiii www.ijug.eu
teilung an die Empfänger über einen Rou- ter erfolgt. UDP verwendet IP-Multicasts, TCP versendet an jeden Empfänger einen ... TCP-Unicast. Bei UDP und TUNNEL muss jeder Multicast vom Server nur einmal versendet werden, während bei TCP jeder ... Multicast an jeden Clusterknoten geson- dert zugestellt wird. Aufbauend auf dem jeweiligen Trans- portprotokoll liegen diverse zusätzliche Listing 3 Protokolle im Stapel. Beim Senden durch- läuft eine Nachricht den Stapel von oben lerdings steigt mit der Größe des Clusters die sowohl Hochverfügbarkeit als auch nach unten, sie passiert also zuletzt das die Netzwerklast. Skalierbarkeit bietet und mit JGroups eine Transportprotokoll. Beim Empfangen wird Im JGroups-Subsystem des JBoss AS 7 effiziente Kommunikation auch in größe- der Stapel genau umgekehrt durchlaufen. ist bereits ein kompletter, auf TCP basie- ren Umgebungen ermöglicht. Eine weitere Neben Protokollen zur Cluster-Formierung render Protokollstapel bereitgestellt. Der Möglichkeit ist die Unterteilung größerer und dem Auffinden fehlerhafter Knoten TCP-Protokollstapel wird durch Ändern des Cluster-Topologien in mehrere Subcluster. befinden sich in der Standard-Konfigu- „default-stack“-Attributs in Benutzung ge- Innerhalb eines jeden Subclusters werden ration von JGroups die Protokolle UFC nommen (siehe Listing 3). die transienten Sitzungsdaten redundant (Unicast-Flow-Control) und MFC (Multi- Damit ist die Sache aber leider noch vorgehalten, aber nicht über die Grenzen cast-Flow-Control). Diese stellen sicher, nicht erledigt, denn in diesem Protokoll- eines Subclusters hinweg (siehe Abbil- dass Pakete in einer Frequenz versendet stapel wird zum Auffinden anderer Clus- dung 3). Somit kann der Cluster gut ska- werden, in der die Empfänger diese auch terknoten IP-Multicast über das Protokoll lieren, indem Subcluster hinzufügt bezie- empfangen und verarbeiten können. Ist MPING verwendet. Daher muss ein ande- hungsweise entfernt werden. die Bandbreite des Netzwerks durch hohes res Protokoll als Alternative zum Auffinden Die Größe eines Subclusters kann das Kommunikationsvolumen ausgereizt, aber anderer Clusterknoten her. JGroups bietet Maß an Verfügbarkeit bestimmen. Auf ei- noch Prozessorkapazität vorhanden, dann eine große Auswahl an PING-Protokollen nem so aufgebauten Cluster kann auch ein kann JGroups den Netzwerkverkehr kom- an, angefangen bei FILE_PING, das ein ge- sogenanntes „Rollendes Update“ durch- primieren. Hierzu wird der Protokollstapel meinsames Dateisystem nutzt, über Proto- geführt werden, indem jeweils ein kom- um das Protokoll COMPRESS erweitert, wie kolle wie S3_PING und RACKSPACE_PING, pletter Subcluster aktualisiert wird. Im Ge- Listing 2 zeigt. die Cloud Storages verwenden, bis hin zu gensatz zu Distribution besteht auch nicht TCPPING. Bei dem Protokoll TCPPING wer- das Problem, dass der Abruf eines Datums den die Clusterknoten jeweils Anhand ei- häufig über das Netzwerk erfolgen muss, ner statischen Liste initialer Clusterknoten da jeder Subcluster-Knoten alle replizier- konfiguriert. Über diese Liste versucht je- ten Daten vorhält. der Clusterknoten, eine Verbindung zu den konfigurierten Knoten aufzubauen. Sobald Subcluster konfigurieren eine Verbindung zu einer initialen Min- Um das Subcluster-Konzept umzusetzen, Listing 2 destanzahl an Knoten vorhanden ist, wird sind im Wesentlichen zwei Konfigurationen der Cluster formiert. Im folgenden Listing erforderlich. Zu einem muss die Replika- Angepasst an das Netzwerk mit JGroups ist eine Beispielkonfiguration für TCPPING tion auf bestimmte Knoten begrenzt und In manchen Netzwerken, insbesondere in gezeigt (siehe Listing 4). zum anderen der jeweilige Lastverteiler so Netzwerken aus verteilten Sub-Netzen, ist anpasst werden, dass ein Failover nur über IP-Multicast nicht verfügbar. Damit schei- Das Subcluster-Konzept die Grenzen eines Subclusters hinweg er- det UDP als Transportprotokoll aus. Eine Wie bereits angerissen, ist die Infinispan- folgt, wenn keine Server des Subclusters Alternative ist das TCP-Transportprotokoll. Konfigurations-Distribution eine Lösung, mehr verfügbar sind. Die Größe eines Da JGroups für Gruppennachrichten mit TCP die Kommunikation durch einzelne Ver- bindungen zu jedem Gruppenmitglied rea- lisiert, wird die Kommunikation in diesem Fall mit steigender Clustergröße immer 1.2.3.4[7600],1.2.3.5[7600] ineffizienter. In der Praxis sind jedoch vie- 2 le Switches und Router für TCP optimiert. 2000 Deshalb kann TCP trotzdem sowohl eine höhere Nachrichtenrate als auch einen hö- heren Nachrichtendurchsatz liefern [5]. Al- Listing 4
Java aktuell 3-2013 | 13 JBoss
Quell-offen und basiert auf dem JBoss AS 7 der Community.
Links [1] http://www.jboss.org/infinispan [2] http://en.wikipedia.org/wiki/Consistent_hashing [3] https://docs.jboss.org/author/display/ISPN/ Clustering+modes#Clusteringmodes-Invalida- tionMode [4] http://www.jgroups.org/manual-3.x/html/in- dex.html [5] http://www.jgroups.org/perf/perf2006/Report. html
Heinz Wilming [email protected]
Abbildung 3: Innerhalb eines Subclusters wird Infinispan-Replikation betrieben. Ein Lastverteiler sorgt dafür, dass Lastverteilung und Failover nur innerhalb eines Subclusters stattfinden
Subclusters lässt sich mit der Standard-HA- Fazit Konfiguration beschränken. Dazu wird für Mit den grundlegenden Technologien jeden Subcluster eine gesonderte Multi- „JGroups“ und „Infinispan“ für die Cluster- cast-Adresse verwendet. Diese kann so- Kommunikation und für die Verteilung Heinz Wilming ist Leiter des JBoss Competence Centers der akqui- wohl bei der „domain.sh“ als auch bei der transienter Daten sind mit einer etwas net AG. Er beschäftigt sich dort mit Technologien und Architek- „standalone.sh“ über den Parameter „-u“ angepassten Konfiguration auch größere turen für verteilte Anwendungen. Sein Fokus liegt dabei auf der angegeben werden. Ein Aufruf sieht dann Cluster-Topologien realisierbar. Die Teilung Java-EE-Plattform und auf Open-Source-Technologien. beispielsweise so aus: „./standalone.sh -c einer großen Cluster-Topologie in Subclus- standalone-ha.xml -u 230.0.1.4“. ter ermöglicht neben einer guten Skalie- Die Lastverteilung lässt sich bei Verwen- rung auch die Aktualisierung einzelner dung von mod_cluster über sogenannte Komponenten des Clusters ohne Ausfall- „Lastverteilungsgruppen“ realisieren. Last- zeiten der gesamten Umgebung. Hierbei Immanuel Sims verteilungsgruppen arbeiten so, dass Last- müssen jedoch weitere Restriktionen, wie [email protected] verteilung und Failover nur innerhalb ei- zum Beispiel ein gemeinsames Datenbank- ner solchen Gruppe erfolgen, es sei denn, Schema, berücksichtigt werden. Die Bei- es existieren keine Server mehr in dieser spiele aus diesem Artikel beruhen auf der Gruppe. Dafür muss jeder Subcluster eine aktuellen Version des JBoss AS 7. Für den eigene Lastverteilungsgruppe haben. Die- Einsatz in Produktiv-Umgebungen ist je- se werden auf Seiten des JBoss AS 7 im doch die gesondert qualitätsgesicherte mod_cluster-Subsystem konfiguriert (sie- Enterprise Application Platform (EAP 6) he Listing 5). von Red Hat empfohlen. Diese ist ebenfalls
... Immanuel Sims ist als Werkstudent bei der akquinet AG tätig. Er studiert Informatik an der Humboldt Universität Berlin und hat sich intensiv mit dem Thema „Clustering“ im Kontext des JBoss AS 7 beschäftigt. Listing 5
14 |
iii iii iiiiii www.ijug.eu
Lightweight AOP mit CDI und JPA
Prof. Dr. Michael Helbig, Hochschule Rosenheim
Ab Java EE 6 kann man mithilfe von „Contexts and Dependency Injection“ (CDI, JSR 299) sogenannte „Cross-Cutting-Concerns“ (wie Logging, Transaktionen, Security etc.) elegant von der eigentlichen Business- Logik abspalten, also aspektorientiert programmieren (AOP). Auch das „Java Persistence API“ (JPA, JSR 220) bietet mit dem EntityListener eine solche Eigenschaft auf Datensatz-Ebene, etwa relevant für Auditierung.
Der Artikel zeigt an konkreten Code-Bei- ting 1). Neben Performance-Logging (a) Account-Datensatz ein Zeitstempel sowie spielen CCCs, AOP, CDI sowie JPA wie man und Transaktionshandling (b) werden dem ein User hinzugefügt (c). Darüber hinaus die Struktur bestehender Anwendungen verbessert. Als Erstes werden die ver- @RequestScoped wendeten Begrifflichkeiten erklärt: Cross- public class AccountService { Cutting-Concerns (CCC) sind sogenannte @Inject Logger log; „querschnittliche Belange“ einer Software. @Inject EntityManager em; ... Die zugehörigen Code-Fragmente sind normalerweise quer über den gesamten public void saveAccount(Account account) throws Exception { Code verstreut, da sie durch herkömmli- // (a) Performance Logging che Programmierung nicht so einfach mo- long time = System.nanoTime(); dularisiert werden können [1]. Beispiele, log.debug(“[saveAccount] params=[account=“+account+“]“); die fast in jeder Software vorkommen, sind // (b) JPA Transaction Handling meist nicht-funktionale Anforderungen, EntityTransaction tx = em.getTransaction(); die nicht zur eigentlichen Geschäftslogik try { gehören: if (!tx.isActive()) { tx.begin(); }
// (c) Audit • Logging account.setAcc_last_edit_usr(... .getRemoteUser()); • Security-Anforderungen account.setAcc_last_edit_ts(new Date(System.currentTimeMillis())); • Fehlerbehandlung • Datenbankzugriff // BUSINESS LOGIC: save to db • Transaktionsverwaltung if (account.getId() == null) { em.persist(account); } else { account = em.merge(account); } • Audit-Fähigkeit // (d) Write Audit-Log Weitere Informationen dazu stehen unter AccountAudit accountAudit = new AccountAudit(); [2]. Um diesen Code an einer Stelle zen- accountAudit.setAcc_balance(account.getAcc_balance()); tral zu formulieren und an den richtigen ... Stellen automatisch anzuwenden, steht em.persist(accountAudit); das allgemeine Konzept der aspektorien- // (b) JPA Transaction Handling tierten Programmierung (AOP) zur Verfü- if (tx != null && tx.isActive()){ tx.commit(); } gung [3]. Hier sind diese CCCs von der Ge- } catch (Exception e) { schäftslogik getrennt, was in einem besser if (tx != null && tx.isActive()){ tx.rollback(); } lesbaren Code resultiert. Zur konkreten throw e; } Umsetzung stehen neben dem mächtigen, aber schwergewichtigen AspectJ im Java- // (a) Performance Logging EE-6-Standard sowie in Java SE „CDI“ und log.debug(“[saveAccount] return - “ + „JPA“ zur Verfügung. Zuvor werden CCCs TimeUnit.MILLISECONDS.convert(System.nanoTime()-time,TimeUnit.NANOSECONDS) + an einem Beispiel vorgestellt. “ ms“); }
Kontoverwaltung als Beispiel public void deleteAccount(Account account) throws Exception { ... } Es sind die Konten einer Bank zu verwal- } ten. Man denke an einen Service, der den aktuellen Kontostand speichert (siehe Lis- Listing 1: Service ohne AOP
Java aktuell 3-2013 | 15 Aspektorientiert programmieren
@InterceptorBinding @Interceptor @Target({TYPE, METHOD}) @PerformanceLogging @Retention(RUNTIME) public class PerformanceLoggingInterceptor { public @interface PerformanceLogging { } @AroundInvoke Listing 2: Annotation für das InterceptorBinding public Object performanceLogging(InvocationContext ic) throws Exception { // logic before method call // (a) Performance Logging wird ein Audit-Log (d) geschrieben. Es wird Logger log = LoggerFactory.getLogger(ic.getMethod().getDeclaringClass().getName()); also eine separate Datenbank-Tabelle mit long time = System.nanoTime(); den für die Auditierungen notwendigen String methodName = “[“ + ic.getMethod().getName() + “]“; Daten über die durchgeführte Aktion ge- log.debug( methodName + “ starting... params=“ + füllt. Technisch befinden wir uns in einer LogUtil.toLogString(ic.getParameters()) }); try { CDI-Managed-Bean – der Autor hat be- // method call wusst auf eine EJB verzichtet, die viel Funk- Object result = ic.proceed(); tionalität bereits bietet (siehe Listing 1). Es ist viel technischer Code vorhanden, // logic after method call der eigentlich nichts mit der Geschäftslo- // (a) Performance Logging log.debug( methodName + “ return result=“ + result + gik zu tun hat und den Entwickler behin- “ - “ + TimeUnit.MILLISECONDS.convert(System.nanoTime()-time,TimeUnit.NANOSEC- dert. Wir werden diesen jetzt mithilfe von ONDS) + AOP entschlacken. Konkret realisiert wird “ ms“); dies mit CDI und JPA. return result; } catch (Exception e) { log.error( methodName + “ ERROR params={}“ + Part 1: AOP mit CDI LogUtil.toLogString(ic.getParameters()),e}); CDI ist viel mehr als ein Dependency-Injec- throw e; tion-Framework. Prominente Implemen- } tierungen sind JBoss Weld (Referenz-Im- } plementierung), Apache Open WebBeans } und Resin CanDI. In CDI interessieren uns wegen AOP neben „Producers“ (realisiert Listing 3: Interceptor-Implementierung das Factory-Method-Pattern) und „Events“ (realisiert das Observer-Pattern, etwa für Bei der Interceptor-Implementierung Jetzt folgt der angenehme Teil: „Code lokales Messaging) hauptsächlich „Inter- markiert man die Methode, die den eigent- Deletion, Teil 1“. Unseren Service aus Lis- ceptors“ und „Decorators“. Letztere setzen lichen Methodenaufruf abfängt, mit der ting 1 können wir jetzt vereinfachen (siehe das Decorator-Pattern um und machen do- Annotation „@AroundInvoke“. Über den Listing 5). Die Code-Fragmente (a) und (b) mainnahes AOP möglich − es können also „InvocationContext“ können wir uns alle löschen wir einfach und stellen an deren Domain-Objekte mit Zusatzfunktionalität Informationen über die eigentlich aufge- Stelle die beiden Annotationen „@Per- angereichert werden. Dazu im Fazit mehr. rufene Methode besorgen. An diese wird formanceLogging“ und „@Transactional“. Für unser Beispiel verwenden wir ledig- durch „context.proceed()“ übergeben. Jetzt können wir diese generische Funktio- lich Interceptors. Diese stehen schon seit In Listing 4 ist beim Eintrag in der Da- nalität auch auf jede weitere Methode wie Längerem EJBs zur Verfügung − mit CDI tei „beans.xml“ die Reihenfolge der Inter- etwa „deleteAccount(Account account)“ jetzt auch „normalen“ Klassen, was wichtig ceptors zu beachten, da diese so wie dort anwenden. ist, falls wir keinen EJB-Container haben angegeben ausgeführt werden. Außerdem Man könnte jetzt natürlich einwenden: (in Tomcat, Jetty etc.). Wir werden jetzt könnte man einfach einen Interceptor Warum lagern wir den Code nicht einfach Performance-Logging (a) und Transaktions- durch Löschen des Eintrags quasi ausschal- in Hilfs-Klassen/-Methoden aus? Man könn- handling (b) mit je einem Interceptor her- ten, ohne die Anwendung neu bauen zu te ja beispielsweise die Hilfs-Methoden auslösen (siehe Listings 2 bis 5). Einen In- müssen. Den Interceptor „Transactional“ für „beginPerformanceLog(…)“ und „endPer- terceptor erstellt man in drei Schritten (hier Transaktionshandling (b) kann man auf die formanceLog(…)“ definieren. Aber: Diese beispielhaft für den „PerformanceLogging“- gleiche Weise implementieren. müsste der Entwickler in jeder Methode Interceptor): 1. Annotation für das InterceptorBinding (siehe Listing 2) de.bigdev.aop.PerformanceLoggingInterceptor de.bigdev.aop.TransactionalInterceptor 2. Interceptor-Implementierung (siehe Listing 3) 3. Aktivierung in META-INF/beans.xml (siehe Listing 4) Listing 4: Aktivierung in META-INF/beans.xml (Reihenfolge beachten!)
16 |
iii iii iiiiii www.ijug.eu
• Pre-, PostPersist public class AccountListener { • „Before/After Insert Trigger“ @PrePersist @PreUpdate • Pre-, PostUpdate public void setUserAndTs(Object entity) { • „Before/After Update Trigger“ (hier: Dir- Account account = (Account) entity; ty Check. Eintreten nur, falls Entity ge- // (c) Audit ändert) account.setAcc_last_edit_usr(... .getRemoteUser()); • Pre-, PostRemove account.setAcc_last_edit_ts(new Date(System.currentTimeMillis())); } • „Before/After Delete Trigger“
@PostPersist @PostUpdate Man kann bei Eintreten eines dieser Events public void writeAuditLog(Object entity){ auf die Entities zugreifen und zusätzliche Account account = (Account) entity; Logik hinzufügen. Bei uns ist dies Logik (c) // (d) Write Audit-Log AccountAudit accountAudit = new AccountAudit(); und (d) aus Listing 5. Um sie querschnitt- accountAudit.setAcc_balance(account.getAcc_balance()); lich verfügbar auszulagern, müssen wir ... jetzt konkret folgende Schritte tun: // obtain EntityManager via JNDI (in JPA 2.1 use injection) EntityManager em = (EntityManager) BeanManagerJNDI.getBeanByName(“em“); 1. Implementierung einer EntityListener- em.persist(accountAudit); Klasse (siehe Listing 6) } } 2. Den EntityListener an der Entity regist- rieren (siehe Listing 7) Listing 5: Service mit AOP mittels CDI Die EntityListener-Implementierung ist zu Beginn und am Ende aufrufen. Er müss- schluss, auf einen anderen Mechanismus eine ganz gewöhnliche Klasse. Lediglich te auch geeignete Parameter übergeben zurückzugreifen. die Methoden sind durch Annotationen (Name der Methode etc.) − also mehr über den Events zugeordnet. Diese werden diese Hilfsmethoden wissen. Mithilfe von Part 2: AOP mit JPA dann bei Auftreten des Events ausgeführt. CDI passiert dies alles deklarativ (Annotati- JPA ist mittlerweile der Standard für das Ar- Hier kann man dann auf die Entity zugrei- on à la „Mach es“, fertig) anstelle von impera- beiten mit relationalen Datenbanken. Der fen, die als Parameter der Methode dekla- tiv (schreibe jetzt den Anfangs-Log-Eintrag, Datenbankzugriff ist mithilfe des EntityMa- riert ist. Noch eines ist zu bemerken: Leider schreibe am Ende den zweiten etc.). Dies nager schon perfekt gekapselt. Will man kann man in einen EntityListener in JPA 2.0 wäre also nur eine Kompromisslösung. JPA für AOP nutzen, steht der EntityListe- noch nicht injizieren. Hier muss man sich Jetzt müssen wir nur noch den Ac- ner mit folgenden Events zur Verfügung: den EntityManager manuell, etwa via JNDI count-Datensatz anreichern (c) und das besorgen. Diese mangelnde Zusammen- Audit-Log (d) schreiben. Da dies auf Da- • PostLoad arbeit von JPA mit CDI ist aber in JPA 2.1 tensatz-Ebene abläuft und von jedem Teil • „After Select Trigger“ wie das Filtern von behoben. der Anwendung erfolgen soll, fiel der Ent- Daten Alternativ könnte man die Methoden der Entity-Klasse direkt in die Entity ste- @PrePersist @PreUpdate cken. Dies ist eine Geschmacksfrage des public void setUserAndTs(Object entity) { zuständigen Architekten. Die hier vorge- Account account = (Account) entity; stellte Vorgehensweise bringt den Vorteil, // (c) Audit dass man den EntityListener an mehreren account.setAcc_last_edit_usr(... .getRemoteUser()); Entities registrieren kann. account.setAcc_last_edit_ts(new Date(System.currentTimeMillis())); } Jetzt folgt wieder ein schöner Schritt: „Code Deletion, Teil 2“. Wir können unseren @PostPersist @PostUpdate Service aus Listing 5 noch weiter vereinfa- public void writeAuditLog(Object entity){ chen und die Code-Fragmente (c) und (d) Account account = (Account) entity; einfach löschen (siehe Listing 8). Es bleibt // (d) Write Audit-Log nur noch die eigentliche Business-Logik AccountAudit accountAudit = new AccountAudit(); accountAudit.setAcc_balance(account.getAcc_balance()); übrig. Der Entwickler der Service-Methode ... // obtain EntityManager via JNDI (in JPA 2.1 use injection) @Entity EntityManager em = (EntityManager) BeanManagerJNDI.getBeanByName(„em“); @EntityListeners(AccountListener.class) em.persist(accountAudit); public class Account { ... } } } Listing 7: Registrierung des EntityListener an Listing 6: EntityListener-Implementierung der Entity
Java aktuell 3-2013 | 17 Aspektorientiert programmieren
Referenzen und weitere Informationen @RequestScoped [1] http://de.wikipedia.org/wiki/Cross-Cutting_ public class AccountService { Concern ... [2] http://architects.dzone.com/articles/example- @PerformanceLogging @Transactional cross-cutting-concerns public void saveAccount(Account account) throws Exception { [3] http://de.wikipedia.org/wiki/Aspektorientierte_ // BUSINESS LOGIC: save to db Programmierung if (account.getId() == null) { em.persist(account); } [4] http://www.bigdev.de else { account = em.merge(account); } } ... } Prof. Dr. Michael Helbig [email protected] Listing 8: Service mit AOP mittels CDI und JPA
„saveAccount(…)“ muss überhaupt nichts Als Best Practice rät der Autor, AOP mehr über das Audit-Log wissen. Dies pas- mit Bedacht einzusetzen, um nicht in der siert jetzt automatisch an anderer Stelle. „Wartungshölle“ zu landen. Für technische Wir haben gesehen, dass AOP ein sehr nicht-funktionale Anforderungen, wie elegantes Mittel ist, um sich auf die eigent- hier beschrieben, sei AOP fast ausnahms- liche Business-Logik zu konzentrieren. Sie los empfohlen, da dies die Lesbarkeit des birgt auf der anderen Seite aber auch die wichtigen Codes stark erhöht; dagegen Gefahr, dass der Entwickler nicht mehr wird für fachliche funktionale Anforde- weiß, was eigentlich alles passiert, da dies rungen (Business-Logik) von AOP (reali- nicht wie in Listing 1 im Code steht. Es ste- sierbar etwa durch CDI Decorators) eher Michael Helbig ist Professor für Mathematik und Informatik an hen an der Service-Methode nur noch eine abgeraten, da man hier besser den se- der Hochschule Rosenheim. Als Freelancer ist er passionierter oder mehrere Annotationen beziehungs- quenziellen Ablauf ohne Seiteneffekte Java-EE-Entwickler, Berater und Trainer. Privat betreibt er einen weise im Falle von JPA gar nichts. erkennen soll. Blog unter http://www.bigdev.de/blog.
Java Forum Stuttgart
Die Java User Group Stuttgart e.V. veranstaltet am 4. Juli 2013 im Kultur- & Kongresszentrum Liederhalle (KKL) in Stuttgart wieder das Java Forum Stuttgart. Es werden rund 1.500 Teilnehmer erwartet. Geplant sind 49 Vorträge in sieben parallelen Tracks. Diese sind eingeteilt in „Non-Sponsored“-Talks und „Sponsored“-Talks und auch als solche im Vortragsprogramm gekennzeichnet. Zu- dem werden bis zu 40 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 Gele- genheit, 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 (3. Juli 2013) 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 5. Juli 2013 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 unter www.java-forum-stuttgart.de
18 |
iii iii iiiiii www.ijug.eu
Software modular bauen
Ulf Fildebrandt, SAP AG
Modularität wird in der Zukunft eine immer größere Bedeutung bei der Software-Entwicklung spielen. Moderne Systeme verwenden Frameworks wie OSGi und Spring, um die Java-Anteile zusammenzusetzen. Aber Frameworks reichen nicht aus, denn sie gewährleisten allein noch keine gute Architektur. Design Pattern und Regeln sind notwendig, um Systeme zu erstellen, die auch über Jahre weiterentwickelt werden können.
Zu Beginn der Software-Entwicklung ent- deren verbunden. Damit soll angedeutet genommen werden und Module mit ihren stehen die meisten Programme durch werden, dass dieses Modul die Schnittstel- klar definierten Schnittstellen sind eine Lö- einzelne Entwickler, manchmal arbeiteten len der anderen verwendet und auf diese sung für dieses Problem. auch einige wenige Entwickler zusammen. Weise mit ihnen interagiert. Der Zugriff auf Modularität zieht sich durch die verschie- Im Laufe der Zeit werden die Teams immer die interne Implementierung ist nicht ge- denen Abstraktions-Ebenen eines Systems größer und auch die Systeme, die erstellt stattet. hindurch. Entscheidend ist die Entkopp- wurden, wachsen. Genau wie bei den Teams lung der Teile auf den Ebenen der Architek- Strukturen geschaffen werden, bilden die tur. Auf der untersten Ebene, Coding, muss Entwickler innerhalb der Software Abgren- der Sourcecode so gestaltet sein, dass kei- zungen, um die Komplexität beherrschen ne direkten Abhängigkeiten zwischen den zu können. Im schlechten Fall entspricht die Klassen erzeugt werden, zumindest keine Struktur der Software der organisatorischen unerwünschten. Eine Ebene darüber müs- Struktur, im guten Fall werden fachlich defi- sen die Module geeignet definiert sein, nierte Module erstellt. um den Anforderungen der Ersetzbarkeit Abbildung 2: Ersetzbarkeit und Erweiterbarkeit zu genügen. Auf der Definition der Module höchsten Ebene muss das gesamte System Mit der Modul-Definition ist bereits das Das zweite Ziel der Software-Entwick- die Module zusammenbauen, ohne Zyklen Zauberwort gefallen. Ein Modul ist eine lung besteht darin, Teile der Software wie und damit Kopplung zu erlauben. abgeschlossene, funktionale Einheit einer in Abbildung 2 zu ersetzen, weil das Pro- Software, bestehend aus einer Folge von gramm an neue Anforderungen angepasst Modulare Laufzeitumgebung Verarbeitungsschritten und Datenstruk- werden muss und die alte Implementie- Nach der Definition eines Moduls stellt sich turen. Entscheidend für ein Modul ist die rung nicht mehr umgestellt werden kann. die Frage, wo es ausgeführt wird. Eine nor- Trennung von Schnittstelle und Implemen- male Laufzeit führt Anweisungen aus, aber tierung. um Modularität zu erreichen, bietet es sich Die Schnittstelle eines Moduls defi- an, eine modulare Laufzeitumgebung zu niert die Daten-Elemente, die das Modul verwenden. Da Module in eine Schnittstelle als Eingabe benötigt und als Ergebnis der und eine Implementierung aufgeteilt sind, Verarbeitung liefert. Die Implementierung muss die modulare Laufzeitumgebung die- enthält den tatsächlichen Programmcode. se Aufteilung unterstützen. Die Implemen- Module dienen in der Software-Entwick- tierung ist komplett gekapselt und nicht lung zwei Zielen: Erweiterbarkeit und Er- Abbildung 3: Weiterentwicklung eines Systems außerhalb des Moduls erreichbar. Nur die setzbarkeit. Schnittstelle ist verfügbar. Genau diese Abbildung 1 zeigt verschiedene Modu- Wenn die Teile eines Systems diese Eigenschaften müssen durch die Laufzeit- le. Eines davon ist nicht direkt mit den an- Kriterien erfüllen, kann es über die Zeit umgebung unterstützt werden. verändert werden, sodass es niemals kom- Im Laufe der letzten Jahre hat sich auf plett neu geschrieben werden muss (siehe der Java-Seite OSGi als Standard für eine Abbildung 3). Gerade in der heutigen Zeit modulare Laufzeitumgebung durchge- mit den häufig und sich schnell ändernden setzt. Innerhalb einer OSGi-Laufzeitum- Anforderungen ist dieses Verhalten sehr gebung werden Bundles ausgeführt. Ein erstrebenswert, denn meistens werden Bundle exportiert Java-Packages, um sie Systeme über viele Jahre gewartet, ohne zur Verwendung freizugeben. Abhängig- dass sie neu geschrieben werden können. keiten werden durch importierte Packages Abbildung 1: Erweiterbarkeit Die Änderungen müssen in Schritten vor- definiert. Die gesamte Implementierung
Java aktuell 3-2013 | 19 Modularität
ist nach außen nicht erreichbar. Listing 1 Manifest-Version: 1.0 zeigt, wie die Beschreibung eines Bundles Bundle-ManifestVersion: 2 in OSGi aussehen könnte. Bundle-Name: Basic Dabei ist vor allen Dingen auf die bei- Bundle-SymbolicName: Basic den Anweisungen für Packages zu achten, Bundle-Version: 1.0.0.build20120412 denn über die exportierten Packages wird Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Export-Package: arch.test bekannt gegeben, was nach außen sicht- Import-Package: org.osgi.framework bar ist, also die Schnittstelle. Die importier- ten Packages müssen von anderen Bund- les exportiert werden und definieren, was Listing 1 das Bundle verwenden darf. OSGi in Java benutzt Classloading für die Entkopplung. Jedes Bundle besitzt einen eigenen Class- public interface IDataAggregator { public List get(); loader, sodass nur Klassen geladen und ver- public void addDataSource(IDataSource inf); wendet werden können, die in der Beschrei- public void addDataSource(List infs); bung des Bundles spezifiziert wurden. } Für alle weiteren Betrachtungen ist es notwendig, dass eine solche Strukturie- Listing 2 rung in Modulen vorausgesetzt wird. Die Software, in Java geschrieben, besitzt nicht ziierenden Objekte nicht näher festgelegt diese Schnittstelle. Die beiden Objekte ha- nur eine Struktur durch die Packages und werden. Durch diese Abstraktion entkop- ben also eine Schnittstelle ausgehandelt. die damit verbundenen Namenskonven- pelt eine Factory die Verwendung eines Ein Framework sorgt dafür, dass eine tionen, sondern jedes Bundle gruppiert Objekts von der Erzeugung. Im Rahmen der Instanz des zu verwendenden Objekts er- zusammengehörende Code-Teile als Im- Modularität sind diese beiden Funktionen zeugt und in das andere Objekt injiziert plementierung und eine Schnittstelle für nach der Einführung einer Factory vonein- wird. Durch die Schnittstelle sind die bei- Verwender. ander getrennt. Die Anweisung in Listing 3 den Implementierungen nicht mehr eng zeigt die Verwendung einer Factory. miteinander gekoppelt. Sie können aus- Design Pattern für Modularität Beide Design Pattern bieten eine getauscht werden, solange sie sich an die Design Pattern sind jedem Software-Ent- Schnittstelle an. Sowohl die Erzeugung von Schnittstelle halten. wickler durch das Standardwerk der Soft- Objekten als auch der Zugriff auf Objekt- Dependency Injection hat sich in den ware-Entwicklung bekannt (Gamma, Helm, Instanzen wird somit im Coding bereits von letzten Jahren durchgesetzt und wird von Johnson, Vlissides: Design Pattern). Dabei Schnittstellen strukturiert. vielen Frameworks angeboten. Spring war handelt es sich um Implementierungsvor- sicher eines der ersten Frameworks, die gaben, mit denen immer wiederkehrende SOLID Dependency Injection zum Prinzip erho- Probleme einheitlich gelöst werden können. Sind die Design Pattern im Prinzip auf Co- ben. JEE 5 hat diese Art der Pflege von Ab- Genau wie ein Rad nicht immer wieder er- ding festgelegt, gibt es eine Gruppe von hängigkeiten übernommen. funden werden muss, können Design Pat- Prinzipien, die Robert Martin definiert hat: Um das Prinzip von Dependency In- tern für verschiedene Systeme und in ver- SOLID. Jeder Anfangsbuchstabe steht für jection zu verdeutlichen, wird an dieser schiedenen Kontexten angewendet werden. ein Prinzip: Single Responsibility, Open- Stelle kurz eine solche Deklaration ge- Eine Menge von Design Pattern dient auch Closed, Liskov, Interface Segregation und zeigt. Zunächst einmal geht es darum, das dazu, klare Grenzen zwischen den Teilen Dependency Injection. Genau wie die De- verwendende Objekt zu definieren, im eines Software-Systems zu ziehen. An die- sign Pattern sind diese Prinzipien für Co- vorliegenden Fall eine Instanz der Klasse ser Stelle sollen nur zwei genannt werden, ding sehr sinnvoll, sie lassen sich aber auch „DisplayServlet“. Diese Klasse besitzt eine die sehr gut geeignet sind, Modularität auf eine Ebene höher auf Module anwenden. Property „dataAggregrate“. Der entschei- Coding-Ebene zu erreichen. Eine „Façade“ Zunächst einmal sollen jedoch diese Prin- dende Punkt ist, dass durch diese Dekla- ist eine einheitliche und meist vereinfach- zipien erklärt werden. ration das Framework die Aufgabe über- te Schnittstelle zu einem Teil der Software. Dependency Injection ist ein Prinzip, nimmt, die Property mit einer Instanz zu Die Ähnlichkeit zur Definition eines Mo- bei dem die direkte Abhängigkeit zwi- belegen (siehe Listing 4). Die Instanz mit duls ist sehr offensichtlich. Die Schnittstel- schen zwei Objekten aufgehoben wird. Bei der Referenz „DataAggregate“ wurde auf len-Definition in Listing 2 beschreibt die schlechtem Coding würde ein Objekt ein genau dieselbe Weise deklarativ erzeugt Façade eines Daten-Aggregators. Zugriffe anderes unmittelbar verwenden. Die bei- (siehe Listing 5). darauf erfolgen nur noch über die Schnitt- den Objekte wären auf alle Zeiten mitein- An dieser Stelle soll nur kurz angemerkt stelle. ander gekoppelt. Wenn man Dependency sein, dass Spring und OSGi sich voneinander Eine „Factory“ definiert eine Schnittstelle Injection anwendet, dann wird eine Schnitt- unterscheiden. Spring kann als Framework zur Erzeugung einer Familie von Objekten, stelle im verwendenden Objekt definiert. innerhalb einer bestehenden Lösung ver- wobei die konkreten Klassen der zu instan- Das zu verwendende Objekt implementiert wendet werden, OSGi legt den Grundstein
20 |
iii iii iiiiii www.ijug.eu
pieren und geeignet anzuordnen. Das IDataAggregator aggregator = gruppierende Element ist ein Subsystem. DataAggregatorFactory.getInstance(tableObject.getType()); Ein Subsystem bündelt eine Menge von se- Listing 3 mantisch zusammengehörenden Modulen in dem zu entwickelnden System. Sollte ein neues System entwickelt werden, kann die Zusammenstellung der Module selbstver- ständlich auch wieder neu definiert werden. Die Subsysteme werden jetzt verschie- Listing 4 denen Schichten innerhalb der Architektur eines Systems zugewiesen. Ein Subsystem darf nur Subsysteme tieferer Schichten ver- wenden. Auf diesem Weg soll eine zu große Kopplung der Module und damit der Sub- systeme vermieden werden. Listing 5 Je tiefer ein Modul in einer Schicht an- geordnet wird, desto größer ist normaler- für die Implementierung. OSGi ist demnach sich Gedanken zu machen. Die Definition weise der Grad der Wiederverwendung. invasiver und bietet auch noch andere Ei- von Modulen ist ein notwendiger Schritt Daraus ergibt sich umgekehrt, dass ein Sub- genschaft wie die Versionierung von Mo- für die modulare Software-Entwicklung, system so hoch wie möglich angeordnet dulen. Im Beispiel eines Bundle-Deskriptors die besten Module nützen allerdings sein sollte, um ungewünschte Abhängig- war die Versionsnummer enthalten, wäh- nichts, wenn sie beliebig miteinander in- keiten zu vermeiden. Je tiefer ein Subsys- rend Spring die Beans nicht versioniert. teragieren können. tem angeordnet ist, desto mehr Subsyste- Es ist möglich, beide Frameworks gleich- Um diesen Gedanken zu verdeutlichen, me dürfen es verwenden. zeitig zu verwenden. Hier wurde Spring stelle man sich einfach eine Menge von Mo- Abbildung 4 verdeutlicht dieses Prinzip. gewählt und darauf verwiesen, weil es sich dulen vor, bei der jedes Modul wieder mit In diesem Beispiel existieren fünf Schichten. dabei um das bekannteste Dependency-In- den anderen verbunden ist. Durch die klar Die unterste Schicht bietet eine Schnitt- jection-Framework handelt. In OSGi gibt es definierten Schnittstellen wäre es möglich, stelle an, um Datenquellen allgemein zu ähnliche Frameworks zur Deklaration von jedes Modul auszutauschen, in der Realität definieren. Auf der Schicht darüber sind die Abhängigkeiten. „Blueprint“ ist die Einbet- jedoch gestaltet sich ein solches Vorgehen zwei Datenquellen angesiedelt. Nochmal tung der Spring-Konzepte in OSGi, davor als sehr schwierig, da eine größere Anzahl eine Schicht oberhalb existiert eine Anwen- wurden „Declarative Services“ verwendet. von Abhängigkeiten dazu führt, dass die dung zur Darstellung der Daten. Entscheidend ist aber die Verwaltung der Module nicht mehr einzeln betrachtet wer- Abhängigkeiten durch das Framework, den können. Sie erscheinen in ihrem Verhal- Zyklen nicht mehr durch das Coding selbst. Die ten wie ein einzelnes Modul. Ein spezieller Aspekt von Schichten in der Objekte werden voneinander entkoppelt. Daher ist man in komplexen Systemen Architektur besteht darin, dass Zyklen ver- Der zweite Grundsatz, der einen nähe- dazu übergegangen, die Module zu grup- boten sind. Abhängigkeiten von Subsyste- ren Blick wert ist, ist das Liskov-Prinzip. Da- runter versteht man, dass ein Objekt einer Klasse durch ein Objekt einer Subklasse ersetzt werden kann. Durch die Beziehung der Klasse zu ihrer Subklasse wird festge- legt, dass jede Instanz der Klasse durch eine Instanz der Subklasse ersetzt werden kann. Vereinfacht gesagt, definiert die Klasse wieder einen Vertrag, der von den abgeleiteten Klassen eingehalten werden muss. Ersetzbarkeit ist zum Prinzip erho- ben worden, zunächst auf Klassen-, aber auch auf Modulebene.
Schichten Nachdem durch die Design Pattern und SOLID hauptsächlich Prinzipien für das Co- ding und Module angesprochen wurden, ist es an der Zeit, sich über das System an Abbildung 4: Einfaches Beispiel für Schichten
Java aktuell 3-2013 | 21 Modularität
men aus einer tieferen in höhere Schich- ten sind nicht erlaubt, um die Kopplung zwischen den Subsystemen minimal zu halten. Jede weitere Abhängigkeit eines Subsystems führt dazu, dass es schwieriger wird, es auszutauschen oder zu erweitern. Dieses Prinzip gilt nicht nur für die Ebene der Subsysteme, sondern genauso für Coding. Java-Klassen, die sich gegen- seitig referenzieren, führen dazu, dass die Klassen schwerer weiterzuentwickeln sind, weil eine Änderung zu unerwarteten Fol- gen in den anderen Klassen führen kann. Wenn man Software modular entwi- Abbildung 5: Verfahren zur modularen Software-Entwicklung ckeln will, sollte man Zyklen auf allen Ebe- nen der Architektur vermeiden. Durch Zy- eines Moduls direkt erkennbar werden. Es hängigkeiten von Modulen statt. Uner- klen werden die entsprechenden Teile der existieren weitere Metriken, um Module wünschte Abhängigkeiten können durch Software gekoppelt und können danach und Coding zu vermessen. Anmerkung: Dependency Injection vermieden werden. als ein Modul gelten, auch wenn sie formal Die beiden beschriebenen Metriken die- Am Ende wird das System vermessen. in zwei Modulen oder Klassen abgelegt nen nur als Beispiel. Man ermittelt die Metriken für die Module sind. Sie sind nicht mehr unabhängig von- und analysiert, ob Kopplung und Kapse- einander zu entwickeln. Es handelt sich Anwendung der Verfahren lung der Vorgabe entsprechen. Die Über- nicht mehr um modulare Software. Nach der Vorstellung der Konzepte und prüfung dieser Metriken lässt sich in einen Prinzipien stellt sich die Frage, wie man automatischen Build integrieren, sodass Metriken diese anwenden muss, um ein System die Architektur eines Systems automatisch Obwohl man es anders vermuten könnte, modular aufzubauen (siehe Abbildung 5). getestet und jeder Verstoß gemeldet wird. ist Modularität nicht nur durch Prinzipien Als Grundbedingung wird eine modulare Die Weiterentwicklung eines Systems läuft zu erreichen, sondern sie kann auch direkt Laufzeitumgebung angenommen. Für das jetzt auf die iterative Anwendung dieses im Coding geprüft werden. Wie bei allen System wird ein Framework ausgewählt, Verfahrens hinaus. anderen Tatsachen, die geprüft werden um Module auszuführen. Danach besteht sollen, muss man Messbarkeit erreichen – der erste Schritt darin, die Module passend dafür existieren Metriken. An dieser Stelle zu den Anforderungen zu definieren. Der sollen nur ein paar beschrieben werden, Zweck eines Moduls muss klar festge- um das Prinzip zu verdeutlichen. legt sein und dementsprechend auch die Die Kopplung („coupling“) eines Mo- Schnittstelle dieses Moduls. Für die Defini- duls wird durch die Abhängigkeiten zu tion der Schnittstelle sind Design Pattern anderen Modulen bestimmt. Dabei sind wie „Factory“ und „Façade“ notwendig. Ulf Fildebrandt die ausgehenden („efferent coupling“ = Für das Modul selbst müssen Depen- [email protected] Ce) und eingehenden („afferent coupling“ dency Injection und auch das Liskov-Prin- = Ca) Abhängigkeiten zu unterscheiden. zip beachtet werden. Ein Modul und das Die Instabilität berechnet sich über „I = Ce Coding darin sollten nie direkte Abhän- / (Ca + Ce)“. Je mehr Module das betrachte- gigkeiten aufbauen, das Zusammenspiel te Modul verwenden, desto instabiler wird der Module sollte vielmehr über Depen- das Modul selbst. Als zweite Metrik soll die dency Injection gewährleistet sein. In der Kapselung vorgestellt werden. Sie gibt das weiteren Implementierung muss darauf Verhältnis aller Typen (T) im Vergleich zu geachtet werden, dass das Liskov-Prinzip den privaten Typen (pt) an. Damit berech- eingehalten wird. Die Schnittstelle sollte net sich die Kapselung über „ep = pt / T“. aussagekräftig genug sein, um die Ersetz- Je mehr sich die Zahl der privaten Ty- barkeit des Moduls zu garantieren. pen der Zahl aller Typen annähert, desto Wenn das implementierte Modul diese mehr nähert sich die Kapselung dem Wert Konzepte erfüllt, dann kann man an die 1. Wenn die Kapselung falsch verstanden Zusammenstellung des Systems gehen. Ulf Fildebrandt arbeitet für SAP seit 1998 in verschiedenen Be- wird und einfach die gesamte Implemen- Die Module werden zu Subsystemen zu- reichen als Development Architect. Dort hat er Java in vielen Be- tierung offengelegt wird, dann geht pt sammengefügt und diese werden den reichen wie Eclipse und auf dem Server verwendet. Während der gegen 0 und somit auch ep. Daraus folgt Schichten zugewiesen. An dieser Stelle letzten Jahre war er verantwortlich für verschiedene Produkte im unmittelbar, dass schmale Schnittstellen findet eine weitere Überprüfung der Ab- SOA-Umfeld auf Basis von Java und OSGi.
22 |
iii iii iiiiii www.ijug.eu
Software – weniger kaufen, mehr bauen
Erik Dörnenburg, ThoughtWorks Deutschland GmbH
Wenn ein Unternehmen eine neue IT-Lösung braucht, möglicherweise, weil sich die Geschäftsbedin- gungen ändern oder weil ein existierender manueller Prozess automatisiert werden soll, so fragen sich die Umsetzungsverantwortlichen üblicherweise schnell: „Sollen wir die Lösung selbst bauen oder sollen wir sie kaufen?“ Lange Zeit war die gängige Auffassung, dass es grundsätzlich besser sei, eine Lösung zu kaufen. Selbst zu entwickeln kam nur dann in Frage, wenn es keine passende Lösung auf dem Markt gab.
In diesem Artikel werden die Gründe für Eigenentwicklung die eigentlich logische zusätzlich üblicherweise so, dass diese be- die Präferenz von Kauf-Lösungen unter- Antwort und als machten es Probleme reits fertiggestellt ist, bevor der Kauf getä- sucht. Vor allem will der Autor die vor- damit unausweichlich, den Kaufansatz zu tigt wird. In dem Fall besteht nicht einmal herrschende Meinung hinterfragen und wählen. Daher stellt sich die Frage, wel- das Risiko, dass die Software zum benötig- dabei erklären, warum er glaubt, dass die che Probleme diejenigen sind, die die Ent- ten Zeitpunkt nicht fertig ist. Veränderungen der letzten zehn Jahre in scheider dazu bringen, lieber eine fertige Die offensichtliche Frage ist, ob Soft- der Software-Entwicklung dafür sorgen, Lösung zu kaufen. ware-Entwicklung wirklich so grundle- dass sich die Antwort auf die „Kaufen oder gend risikobehaftet ist, dass viele Projekte Bauen“-Frage weg vom Kaufen und mehr Software-Entwicklung ist riskant scheitern mussten. Auf der einen Seite ist in Richtung „Bauen“ bewegt. Dabei geht Das am meisten genannte Argument ge- die Software-Entwicklung natürlich eine der Autor nicht so weit zu behaupten, dass gen die Eigenentwicklung ist die Annah- junge Disziplin, zum Bespiel im Vergleich Bauen die neue Standard-Antwort sein me, dass Software-Entwicklung risikoreich zur Architektur oder zur industriellen Pro- sollte, aber er meint, Software selbst zu sei. Es gibt beliebig viele Geschichten von duktion von Gütern. Aus diesem Grund entwickeln sollte öfter in Erwägung gezo- gescheiterten Software-Projekten, von Pro- gibt es weniger Erfahrung und viele Ideen gen werden, sogar dann, wenn passende jekten, die den Zieltermin nicht einhalten, und Konzepte sind noch nicht in wieder- Lösungen auf dem Markt existieren. oder von solchen, die das Budget nicht nur holbaren Prozessen umgesetzt. Auf der Seiner Erfahrung nach wird die Ent- um ein paar Prozentpunkte überschreiten, anderen Seite jedoch ist Software flexibel scheidung zum Kauf selten auf Basis von sondern um ein Vielfaches der ursprünglich und unendlich formbar. Mit den richtigen Argumenten getroffen, die zeigen, warum veranschlagten Kosten. Eine Möglichkeit, Techniken sollte es möglich sein, nicht nur der Kauf eine gute Idee ist. Üblicherweise diese Risiken zu vermeiden, ist, die Software exakt das zu produzieren, was benötigt geht die Analyse eher dahin zu belegen, zu einem vorher festgelegten Preis von ei- wird, sondern es sollte genauso möglich warum selbst zu entwickeln eine schlechte nem Anbieter zu kaufen. Das verlagert das sein, Teile der Software bereits vor der Idee ist. Diese Tatsache spricht in gewisser Risiko von Budgetüberschreitungen direkt Fertigstellung des Gesamten zu nutzen. Weise für sich selbst. Es klingt, als wäre die zum Anbieter. Bei Standard-Software ist es Zusätzlich sollte es möglich sein, die Soft-
Java aktuell 3-2013 | 23 Software-Entwicklung
ware veränderten Geschäftsbedingungen Wenn nun also der Fachabteilung mit Eigen-Entwicklungen ist, dass die Imple- anzupassen. All das würde das Risiko ho- einer Eigenentwicklung besser geholfen mentierung eine Menge Zeit und Aufwand her Investitionsaufwendungen verringern. werden kann, ist es dann möglich, der IT- erfordert. Eine Geschäftsfunktion, die auf Aus Unternehmensperspektive ist die Abteilung das Umsetzungsrisiko abzuneh- wenigen Seiten beschrieben werden kann, Fragestellung noch eine andere: Wessen men? Zunächst einmal haben im letzten erfordert mehrere Hundert Zeilen Code. Um Risiko wird durch den Software-Kauf ei- Jahrzehnt bedeutende Durchbrüche in diese zu schreiben und zu testen, braucht gentlich reduziert? In vielen Unternehmen den Entwicklungsmethoden dafür gesorgt, ein Entwickler Wochen und es dauert so- gibt es eine IT-Abteilung, die für den Kauf dass Software-Entwicklung viel vorhersag- gar noch länger, um sie in eine Produkti- von Software und für Eigenentwicklungen barer geworden ist. Prozesse, die um das onsumgebung auszurollen. verantwortlich ist. Sie ist jedoch in aller Re- agile Wertesystem gebaut wurden, liefern Komplexe Systeme, die nur auf mehre- gel nicht die Abteilung, die die Software funktionierende Software in kurzen Iterati- ren Hundert Seiten beschrieben werden nutzt. Gemessen wird die IT-Abteilung oft onen. Sie liefern dabei nicht nur inkremen- können, erfordern sogar Jahre, um sie zu eher an der pünktlichen Lieferung und tell Funktionalität, sondern bieten sowohl entwickeln. Eine offensichtliche Antwort der Einhaltung gegebener Budgets als an dem Business die Chance, zeitnahes Feed- wäre, mit der Ineffizienz zu leben, aber der Gesamtlösung oder dem realisierten back zu geben, als auch den Entwicklern zumindest die Umsetzungszeit zu reduzie- Potenzial. Es gibt für sie also wenig bis gar die Möglichkeit, die Software bei Bedarf ren, indem ein größeres Team an die Auf- keinen Anreiz, Software selbst zu entwi- anzupassen. Das verringert das Risiko im- gabe gesetzt wird. Unglücklicherweise ist ckeln, denn ein Kauf verlagert das gesam- mens, dem Business eine Software zu lie- es inzwischen sehr klar, dass die Geschwin- te für die IT-Abteilung relevante Risiko zum fern, die nicht seinen eigentlichen Bedürf- digkeit bei der Software-Entwicklung nicht externen Software-Anbieter. nissen entspricht. Die Fähigkeit, iterativ zu mit der Menge der Entwickler im Team ska- Für das Business hingegen sieht die Si- entwickeln und auf Veränderungen schnell liert. Ab einem bestimmten Punkt über- tuation etwas anders aus. So besteht nicht zu reagieren, wird den Software-Entwick- steigt der wachsende Kommunikations- nur die Möglichkeit, dass eine Eigenent- lungsteams mit Techniken und Praktiken und Koordinations-Aufwand jede weitere wicklung kostengünstiger wäre und da- wie zum Beispiel Extreme Programming Brainpower. durch früher den ROI erreicht hätte, es ist und Continuous Delivery gegeben. Genauso, wie der Kauf von Standard- genauso möglich und nicht unüblich, dass Software das Risiko auf den Anbieter verla- die gekaufte Standard-Software nicht exakt Risiko-Minimierung gert, verlagert er auch das Problem effizien- das bietet, was die Fachabteilung braucht. Noch interessanter ist die Möglichkeit der ter Lieferung auf den Anbieter. Der Käufer Das wiederum führt zu verringerter Produk- Risiko-Minimierung durch Verlagerung muss nur noch einen Ausschreibungs- und tivität und ungenutzten Chancen. Selbst- der Ziele. Was, wenn das Hauptziel nicht Beschaffungsprozess durchlaufen und verständlich sollten diese Punkte mit in den mehr darin besteht, eine große Menge an die Installation der Software überwachen. Entscheidungsprozess einfließen. Unglück- Function Points in vorgegebener Zeit und Noch viel besser: Kaufen mehrere Parteien licherweise wird dieser jedoch normaler- mit festgesetztem Budget zu liefern? Was, dieselbe Software, kann der Anbieter die weise von der IT-Abteilung durchgeführt wenn das Kernziel wäre, die zum jeweili- Entwicklungskosten über alle Käufer ver- und diese ist mehr an der Minimierung ihrer gen Zeitpunkt am dringendsten benötigte teilen. Er verteilt damit auch die Auswir- eigenen Risiken interessiert. Entsprechend Funktionalität so effizient und effektiv wie kungen von Ineffizienz auf alle Käufer. Auf ist es nicht unwahrscheinlich, dass der Aus- möglich zu liefern? Auch hier würden agile die Installation selbst kommen wir später wahl- und Entscheidungsprozess zwar das Praktiken ganz klar helfen, aber wie welt- zu sprechen. Risiko der IT-Abteilung minimiert, jedoch fremd wäre das denn? 1982 eröffnete Tom Aber ist Software-Entwicklung wirklich nicht die beste Lösung für das Unterneh- DeMarco sein einflussreiches Buch zum so langwierig und ineffizient, wie die Be- men als Ganzes findet. Thema „Software-Entwicklung“ mit dem fürworter von Kauflösungen behaupten? Ein gutes Beispiel für diesen Konflikt Satz: „Was man nicht messen kann, … kann Was kann getan werden, um sie effizienter ist die Einführung einer CRM-Lösung bei man nicht kontrollieren.“ Interessanterwei- zu machen? Fred Brooks erklärte in seinem Australiens größtem Telekommunikations- se schreibt er im Jahr 2009 in einer IEEE- Paper aus dem Jahre 1987, warum keine anbieter. Hier kaufte man ein System von Veröffentlichung [2], dass wir uns in den einzige Entwicklung in Technologie oder einem der Marktführer, was eindeutig das vergangenen vierzig Jahren mit unserer in Management-Techniken eine Produkti- Risiko der IT-Abteilung minimierte. Wie je- Unfähigkeit, ein Software-Projekt pünkt- vitätssteigerung welcher Größenordnung doch eine Zeitung berichtete, meinen die lich und innerhalb des vorgegebenen Bud- auch immer verspricht [3]. Er fügte jedoch Händler an der Vertriebsfront des Unter- gets zu beenden, gequält hätten, dass das hinzu, dass viele ermutigende Innovatio- nehmens, dass die unpraktische Kunden- aber nie das primäre Ziel hätte sein sollen. nen in Gange seien und dass die diszipli- und Abrechnungsplattform im Zentrum Viel wichtiger sei Transformation; Software nierte, fortlaufende Anstrengung, diese der mehrere Milliarden schweren IT-Trans- zu kreieren, die die Welt oder Unterneh- Innovationen zu entwickeln, zu verbreiten formation sie einiges an Geschäftspotenzi- men verändert oder die verändert, wie ein und zu nutzen, am Ende tatsächlich zu ei- al kostet [1]. Für die IT-Abteilung minimier- Unternehmen sein Geschäft betreibt. Das ner messbaren Verbesserung führen wür- tes Risiko bedeutete in dem Fall nicht die hätte ich nicht besser ausdrücken können. de. Der Autor glaubt, dass er Recht hatte optimale Lösung für das Unternehmen. Ein anderes gängiges Argument gegen und dass in den fünfundzwanzig Jahren,
24 |
iii iii iiiiii www.ijug.eu
nachdem er dieses Paper geschrieben hat, Code geschrieben wird, zu steigern, son- durch etwas noch Besseres ersetzt worden: substanzielle Verbesserungen in der Ent- dern auch die Entwicklungsgeschwindig- Open-Source-Frameworks. Viele Entwick- wicklerproduktivität erzielt wurden. keit bei wachsender Größe der Code-Basis ler und Unternehmen haben festgestellt, Brooks macht eine wichtige Unter- aufrechtzuerhalten. dass es dem eigenen Unternehmen nicht scheidung zwischen essenzieller und ne- Entwickler-Workstations sind wesent- schadet, Quell-Code öffentlich verfüg- bensächlicher Komplexität. Essenzielle lich schneller geworden und erlauben bar zu machen, sondern dass es vielmehr Komplexität ist die Komplexität des Ge- damit den Einsatz komplexerer IDEs und nutzt. Unternehmen profitieren von der schäftsproblems, das implementiert wird. anderer Werkzeuge. Verbesserte Compiler frei verfügbaren Entwicklungskapazität Es mag so aussehen, als könnte das IT-Team zum Beispiel erzeugen besser optimierten anderer Mitstreiter. Ein weiterer Vorteil von nichts tun, um diese essenzielle Komplexi- Code, ohne dass die Entwickler sich über direkt von und für Anwendungsentwickler tät zu verringern. Das Team kann und soll- Details wie Register-Zuteilungen Gedan- geschriebenen Frameworks ist die Tatsa- te Business-Anforderungen nicht ändern. ken machen müssen. Der entscheidende che, dass ihr Funktionsumfang von echten Interessanterweise gibt es in Projekten mit Produktivitätsschub wird aber mit einer Anforderungen bestimmt ist und nicht von langer Laufzeit (Jahre) jedoch die Tendenz schnellen Internetverbindung erreicht. Funktionschecklisten. Die Innovation fin- der Fachbereiche, sehr spekulativ zu sein Statt zu experimentieren oder Probleme det auch auf den öffentlichen Portalen, auf und von vornherein jede nur erdenkliche in Mailing-Listen oder Newsgroups disku- denen die Frameworks bearbeitet werden, Funktionalität zu fordern. Dies geschieht tieren zu müssen, können Entwickler jetzt statt. Es entstehen immer flexiblere und ef- aus lauter Angst, auf die Entwicklung neu- auf Online-Communities zugreifen, die die fektivere Wege, Code zu teilen. er Anforderungen ansonsten sehr lange Antwort auf die meisten Fragen innerhalb warten zu müssen. Mit einem priorisierten, von Minuten verfügbar machen, sei es, weil Software-Entwicklung ist nicht unsere iterativen Entwicklungsansatz kann das frühere Diskussionen zum Problem durch- Kernkompetenz Business hingegen ein Projekt stoppen, suchbar sind, oder, weil Kollegen in Echtzeit In den letzten dreißig bis vierzig Jahren ha- wenn alle wirklich benötigten Features via Internet Relay Chat (IRC) antworten. ben Software-Lösungen mehr und mehr fertiggestellt sind. Das reduziert natürlich Die Hardware-Verbesserungen wirken Geschäftsbereiche erobert. Es ist jedoch nicht die essenzielle Komplexität, aber es sich nicht nur auf Entwickler-Workstations wichtig, sich daran zu erinnern, dass sie reduziert die Menge der implementierten aus, sondern haben natürlich auch große ursprünglich als Werkzeuge für operative Funktionalität meiner Erfahrung nach er- Auswirkungen auf Produktionsumgebun- Effizienz eingesetzt wurden. Vermutlich heblich. gen. In vielen Fällen können Entwickler glauben aus genau diesem Grund viele Zurück zu Brooks´ Unterscheidung. jetzt etwas mehr Großzügigkeit beim Unternehmen, dass Software-Entwicklung Nebensächliche Komplexität ist diejeni- Ressourcen-Verbrauch zur Laufzeit gegen nicht zu ihren Kernkompetenzen gehört. ge, die durch die bei der Entwicklung ver- eine erhöhte Produktivität während der Einige beziehen sich hier auf Beispiele aus wendeten Tools und Techniken erzeugt Entwicklung eintauschen. So ist es zum dem frühen zwanzigsten Jahrhundert, als wird. Diese Komplexität würde ohne die Beispiel möglich, statt viel Aufwand in das Fabriken noch ihre eigenen Elektrizitäts- Implementierung nicht existieren. Wie von Schreiben von Code zur Speicherverwal- werke hatten. Die Analogie ist klar: Die Brooks vorhergesagt, hat es keine Reduzie- tung zu stecken, mit dem Einsatz eines Fabriken wechselten sofort zu Strom aus rung von nebensächlicher Komplexität im automatischen Garbage Collectors die dem Netz, als er verfügbar war, denn selbst Bereich von Größenordnungen gegeben. nebensächliche Komplexität, die mit ma- Elektrizität herzustellen, gehörte nicht zu Endnutzer-Entwicklung oder automatische nueller Speicherverwaltung verbunden ist, ihrem Kerngeschäft. Ihre Kernkompetenz Programmierung, wie Brooks sie nann- zu verringern. Es wird sogar argumentiert, lag woanders, zum Beispiel in der Produk- te, ist nicht sehr verbreitet. Die einzige dass automatische Speicherverwaltung tion von Autos. Warum sollte also heute Ausnahme bisher sind Excel-Tabellenkal- die Effizienz auf moderner Hardware stei- zum Beispiel ein Unternehmen, das sich kulationen. In Zukunft allerdings haben gert, da sie lokalere Referenzen und damit auf das Verwalten von Versicherungen Domain-spezifische Sprachen (DSLs) das verbesserte Cache-Nutzung bietet. Aber spezialisiert hat, auch Kompetenzen in der Potenzial, hier doch noch einen Durch- selbst wenn die automatische Speicher- Software-Entwicklung haben? Tatsächlich bruch zu schaffen. verwaltung langsamer ist, lohnt sich mit stellt sich im Zusammenhang mit Cloud Etwas, das Brooks unterschätzt hat, sind Ausnahme von ganz speziellen Einzelfäl- Computing sogar die Frage, ob Unterneh- integrierte Entwicklungsumgebungen len der Einsatz eines Garbage Collectors. men überhaupt IT-Kompetenzen haben (IDEs). Die Möglichkeiten, die sie im Hin- Brooks und viele andere haben in den oder ob sie nicht stattdessen alles in die blick auf Code Navigation und automati- frühen Neunzigern einen wachsenden Cloud auslagern sollten. Genau wie die Fa- sches Code Refactoring bieten, resultieren Markt für Komponenten-Lösungen vor- briken ihr Strom-Problem in das Netz aus- in beeindruckenden Produktivitätsgewin- hergesagt. Diese sollten einen Mittelweg gelagert haben. nen. Automatisches Refactoring in Verbin- zwischen dem Kauf kompletter Software- Dieser Punkt unterscheidet sich von dung mit Test Driven Development ermög- Pakete und der Eigenentwicklung dar- den beiden oben diskutierten. Die Beur- licht es Entwicklern, mit weniger Aufwand stellen. Das hat sich allerdings im Großen teilung von Risiko und Effizienz ändert sich hohe Software-Qualität zu erzeugen und und Ganzen nicht bewahrheitet. Es gibt aufgrund der Vorteile in der Art und Weise, dadurch nicht nur die Effizienz, mit der Ausnahmen, aber allgemein ist die Idee wie Software entwickelt und geliefert wird.
Java aktuell 3-2013 | 25 Software-Entwicklung
Die Kompetenzfrage wird stark davon be- die IT-Abteilung gut funktionierende Ent- einflusst, wie sich die Unternehmen än- wicklungskapazität hat, die auf agile Me- dern. Software-Lösungen sind nicht länger thoden und Continuous Delivery setzt. mehr nur Werkzeuge, die es ermöglichen, Es scheint, dass, selbst wenn Software- bestimmte Geschäftsprozesse effizienter Entwicklung in den meisten Unternehmen zu machen. Software-Lösungen ermög- keine Kernkompetenz ist, es doch strate- lichen überhaupt völlig neue Wege, Ge- gisch immer wichtiger wird, sie zu einer NetBeans IDE 7.3 ist verfügbar schäfte abzuwickeln. solchen zu machen. Das mag schmerzvolle Vor etwa fünfundzwanzig Jahren profi- Veränderungen und einen Wandel in der Die NetBeans Integrated Develop- tierten Zeitungen von der Einführung des Unternehmenskultur erfordern, aber neue ment Environment (IDE) ist nun in der elektronischen Desktop Publishing. Das Realitäten zu ignorieren, hat noch nie ge- Version 7.3 allgemein verfügbar und war jedoch nur ein Weg, das Layouting von holfen. bringt eine bessere Unterstützung Seiten effizienter zu machen. Es gab kaum von HTML5, JavaScript und CSS, um einen Grund, dafür eigene Software zu Quellen die Entwicklung von Rich-Web-Appli- schreiben. Heutzutage, da sich ein Groß- [1] Mitchell Bingemann, Dealers still fuming at cations und mobilen Anwendungen ‘clumsy’ Telstra system. The Australian, 2 June teil der Geschäftsgrundlage ins Internet 2009, http://www.theaustralian.com.au/news/ zu vereinfachen. verlagert hat, ist die Software hinter einer dealers-still-fuming-at-clumsy-telstra-system/ Netbeans bietet nun eine bessere Zeitungs-Website strategisch entschei- story-e6frgal6- 1225719947511 Unterstützung der Java-Plattform. So [2] Tom DeMarco, Software Engineering: An dend für den Geschäftserfolg der Zeitung. Idea Whose Time Has Come and Gone? IEEE enthält der Editor neue Hints und Re- So zählt zum Beispiel nicht mehr nur der Software, July/August 2009, http://www.com- factorings. Verbessert wurde auch die loyale Zeitungsleser zum Publikum. Ge- puter.org/portal/web/computingnow/0709/ Unterstützung der FXML-Layout-Da- whatsnew/software-r nauso wichtig ist der Nutzer, der über eine teien in JavaFX-Projekten. Was HTML5 [3] Frederick Brooks, No Silver Bullet: Essence and Suchmaschine zum Artikel gelangt. Bietet Accidents of Software Engineering. Computer, angeht, so unterstützt NetBeans nun die Site nun leichten Zugriff auf verwandte April 1987, http://www.cs.nott.ac.uk/~cah/ die jüngsten HTML5-Elemente. Bei Inhalte, so bleibt der Nutzer länger, sieht G51ISS/Documents/NoSilverBullet.html einem neuen HTML5-Projekt können mehr Anzeigen und erhöht damit den Um- sich Developer die Arbeit erleichtern satz der Zeitung. Die richtigen Inhalte zu Übersetzung aus dem Englischen: und direkt aus einer Liste von be- finden, ist immer noch eine Angelegenheit Elke Bethke, liebten Online-Templates ein Projekt von Editoren und Autoren. Sie zum richti- ThoughtWorks Deutschland GmbH erzeugen. Diese definieren in diesem gen Zeitpunkt im richtigen Zusammen- Fall die Dateien, Bibliotheken und hang verfügbar zu machen, ist allerdings Struktur des Projekts. eine Funktion der Software. Auch die Einbindung vom Frame- Das Zeitungsbeispiel ist nur eines von Erik Dörnenburg work jQuery wurde auf Vordermann vielen. Der Trend, dass Software zum stra- [email protected] gebracht. Zudem gibt es jetzt für Java tegischen Erfolgsfaktor für die Geschäfts- Script im Übrigen auch einen neuen entwicklung wird, ist in vielen Bereichen Editor und Debugger, der auf dem und Vertikalen zu finden. Wenn nun also Nashorn-Projekt basiert. Auch neue ein Stück Software strategisch wichtig für CSS-Regeln werden nun von NetBeans das Geschäft ist, sollte klar sein, was es be- berücksichtigt. Developer können üb- deutet, dieselbe Standard-Software wie rigens jetzt in Real Time sehen, wie sich die Konkurrenz zu kaufen: Man hat wenig ihre Änderungen im CSS-Style-Fenster bis gar keinen Wettbewerbsvorteil. Wie auf das Aussehen der Webseite auswir- vorhin diskutiert, mag es weniger risiko- ken. Darüber hinaus ermöglicht eine reich für die IT-Abteilung sein, Standard- bidirektionale Integration von Google Software zu kaufen, aber es macht es für Chrome und dem internen WebKit- das Unternehmen definitiv schwieriger, basierten Browser eine vereinfachte einen Vorteil gegenüber den Mitbewer- Live-Code- und Web-Page-Synchroni- bern zu erlangen. Diese können schließlich Erik Dörnenburg ist Software-Entwickler, Berater und Head of sierung. aus denselben Standard-Lösungen wählen. Technology bei ThoughtWorks. In Projekten hilft er Kunden bei Ende März 2013 ist bereits der erste Schlimmer noch, es dauert viel länger, auf der Entwicklung von Enterprise Software sowie der Optimierung Patch für NetBeans 7.3 veröffentlicht Marktveränderungen zu reagieren oder agiler Praktiken. Häufig mit übermäßig komplexer Software worden. Um diesen einzuspielen, muss konfrontiert, entwickelte er ein starkes Interesse an einfachen Ar- eine brillante neue Idee umzusetzen, wenn zuvor NetBeans 7.3 installiert sein. chitekturen und an Möglichkeiten, Software zu visualisieren, um ein externes Produkt mit externem Liefe- sie dadurch verständlicher zu machen. In den letzten zehn Jahren ranten involviert ist. Die Cycle-Time – also Weitere Informationen unter: hat er auf vielen internationalen Konferenzen Vorträge gehalten, die Zeit von der Idee bis zur Live-Stellung Kapitel zu verschiedenen Buchprojekten beigetragen und einige https://netbeans.org – kann erheblich reduziert werden, wenn Open-Source-Projekte geleitet.
26 |
iii iii iiiiii www.ijug.eu
Diagramm-Bibliotheken für Android
Falko Krische, buschmais GbR
Die visuelle Aufbereitung geschäftlicher Daten auf mobilen Endgeräten stellt häufig eine große Herausfor- derung dar. Der Artikel befasst sich mit fünf Bibliotheken für Android, die dieser Aufgabe begegnen.
Internet, Kommunikation, Unterhaltung Anpassbarkeit der erzeugten Diagramme Tutorials oder kommentierte Beispiele – das, wofür man bis vor ein paar Jah- untersucht. Dazu werden folgende Punkte auf der projekteigenen beziehungswei- ren noch einen Desktop-PC oder Laptop betrachtet: se auf der Google-Code-Seite vorhanden benötigte, kann man heute in der einen sind. Die JavaDoc ist in den meisten Fällen Hand halten und mit der anderen bedie- • Titel ausreichend. Glücklicherweise gibt es ein nen. E-Mails lesen auf dem Smartphone, Lässt sich der Diagrammtitel anpassen? Beispiel-Projekt, dessen Quellen man ein- Surfen im Internet und Chatten auf dem • Achsen sehen kann. Diese hilft die Bibliothek zu Tablet gehört heute zum Alltag. Eine Viel- Lassen sich die Diagrammachsen an- verstehen und zu benutzen. zahl von Apps steht dafür bereit. passen, die Farben ändern, die Achsen- Im Issue-Tracker der Google-Code-Seite Anders als im Consumer-Bereich sind skalierungen ändern, die Skalierungs- gibt es sporadische Anfragen, die von den professionelle Anwendungen noch rar ge- beschriftungen (Labels) anpassen? Entwicklern auch beantwortet werden. sät. Warum überwachen Administratoren • Achsentitel Falls man auf Probleme mit der Bibliothek nicht mobil ihre Server-Landschaft, prüfen Lassen sich diese anpassen? oder Bugs in ihr stoßen sollte, kann man Sales-Manager nicht die Verkaufszahlen • Datenbereich hier auf Unterstützung hoffen. der letzten Tage oder sehen Fußballtrainer Kann man den Hintergrund ändern? nicht den aktuellen Trainingsstand ein? Ist eine Zoom- beziehungsweise Scroll- AndroidPlot Damit diese Anwendungsfälle realisiert Funktion bereits in der Bibliothek im- Die aktuelle Version von AndroidPlot ist werden können, sind Bibliotheken zur visu- plementiert? Kann das Gitternetz geän- 0.5.2. Diese Bibliothek ist ebenfalls ein ellen Aufbereitung von Daten erforderlich. dert werden? Open-Source-Projekt. Sie bietet nur die Diese Bibliotheken werden nachfolgend • Datenbeschriftung vier verschiedenen Diagramm-Typen (Li- für Android unter die Lupe genommen. Kann man einzelne Messpunkte be- nien-, Balken-, Streuungs- und Schritt- schriften und wenn ja, kann diese Be- Diagramme). AndroidPlot ist ebenfalls ab Ausgepackt, angeschaut, ausprobiert schriftung angepasst werden? Android-Version 1.6 einsetzbar und steht Die Untersuchung der Bibliotheken ge- • Datendarstellung auch unter der Apache License 2.0 (siehe schieht unter rein pragmatischen Gesichts- Lassen sich Linien, Balken, Punkte etc. Abbildungen 5 und 6). punkten. Dabei geht es weitestgehend um in Größe und Aussehen ändern? Auf der projekteigenen Webseite gibt Fragen wie: „Ist das API umgänglich?“, „Ist • Legende es einen Quickstart-Guide, der den Einstieg die JavaDoc verständlich?“, „Kann ich die Lässt sich die Legende anpassen? in diese Bibliothek vereinfacht. Auf dieser gezeichneten Diagramme relativ einfach • Implementierungsspezifika Seite stehen noch weitere Tutorials, die die auf meine Bedürfnisse anpassen?“ oder Wie lassen sich die Diagramme darstel- grundlegenden Funktionen veranschau- „Wo finde ich schnelle Hilfe?“ len und wie werden sie deklariert? lichen. Die JavaDoc ist leider sehr mangel- Als Szenario für die Demo-Applikation haft. Viele der Klassen beziehungsweise dient folgendes Bild: Ein Wartungsingeni- Tabelle 1 zeigt das Ergebnis der Untersu- Methoden sind gar nicht oder nur rudimen- eur läuft durch eine Halle mit Maschinen chung. tär dokumentiert. Es gibt jedoch auf der Bit- und lässt sich die Ausfälle (also Fehler) ei- bucket-Seite des Projekts weitere Beispiele ner jeden Maschine in einem bestimmten AChartEngine mit Quellcode, um tiefer in die Materie vor- Zeitraum anzeigen. Alle Demo-Applikatio- AChartEngine ist eine Open-Source-Bib- zustoßen. Glaubt man der Projekt-Webseite, nen basieren auf der gleichen Datenbasis, liothek, deren Quelltext bei Google-Code so wird AndroidPlot schon in mehr als fünf- um die Vergleichbarkeit zu gewährleisten. gehostet ist. Die Bibliothek unterstützt alle hundert Apps eingesetzt. Es gibt auf der Die Demo-Applikationen sind als Down- gängigen Diagramm-Typen wie Linien-, Seite auch ein Forum mit reger Beteiligung. load verfügbar (siehe Absatz „Beispiele Balken- und Torten-Diagramme (siehe Abbil- zum Herunterladen“ am Ende des Artikels). dungen 2 bis 4). Sie steht unter der Apache Li- AFreeChart cense 2.0, als minimale Android-Version wird AFreeChart ist ebenfalls ein Open-Source- Übersicht 1.6 gefordert. Die aktuelle Version ist 1.0.0. Projekt. Die aktuelle Version ist 0.0.4. Ein- Nachdem die prinzipielle Verwendungs- Der Start mit dieser Bibliothek geht setzbar ist es ab Android-Version 2.1. Die weise der Bibliotheken klar ist, wird die relativ schnell vonstatten, obwohl keine Bibliothek wird unter der GNU-Lesser-GPL
Java aktuell 3-2013 | 27 Android
AChartEngine AndroidPlot AFreeChart aiCharts TeeChart Titel ändern Größe x - x - - Farbe - - - x x Position - - - - - einblenden/ausschalten x - (1) x x x Achsen Skalierung ändern x - - - - Skalierung umbenennen (statt 1, 2 ... a, b) x x x x x Farbe anpassen x x - x x beschriften x x (1) x x x Label-Größe anpassen x - x - - Label-Farbe anpassen x - - x x Labels rotieren (90°) x - x x - Achsentitel Größe anpassen x - x - - Farbe anpassen - - - x - Position ändern (Abstand von Achse) - - x - - Datenbereich Hintergrundfarbe ändern x (2) x - - x Hintergrundbild hinzufügen - - - - - hinein-/herauszoomen x - x (3) x x Bei Start Teilbereich darstellen x - x (3) x Datenbereich verschieben (rechts/links oder x - x (3) x x hoch/runter) Gitternetz hinzufügen/ausblenden x x x x x Gitternetzfarbe anpassen x x x x - Gitternetzstil anpassen - - x x - Datenbeschriftung verfügbar - x - x x Größe anpassen - - - - - Farbe anpassen - x - x - Datendarstellung Farbe anpassen x x x x x Linienbreite etc. anpassen x x x x x Linienstil etc. anpassen x x x x x Legende verfügbar x x x x x Größe anpassen x - x - - Farbe anpassen - - x - - Position ändern - - - - x Implementierungsspezifika Vollbild (kompletter Bereich) x x x x x eingebettet (neben anderen View-Elementen) x x x x x Deklaration per XML (in Layout-XMLs) - x - x - Deklaration per Java-Code x x x (4) x x
Tabelle 1: Die Anmerkungen dazu stehen im Kasten auf Seite 29
28 |
iii iii iiiiii www.ijug.eu
Anmerkungen zur Tabelle: (1) Wenn nichts angegeben, wird De- fault-Text angezeigt (2) Funktionsaufrufe sind da, zeigen aber keine Wirkung (3) Durch Anpassungen des sichtbaren Bereichs und durch Überschreiben der on-TouchEvent(MotionEvent ev) -Funktionen der View, die das Dia- gramm zeichnet (4) Überschreiben der onDraw()-Me- thode einer View
ausgeliefert. Die Entwickler haben es sich zur Aufgabe gemacht, JFreeChart auf die Android-Plattform zu portieren. Dabei ha- Abbildung 2: AChartEngine – Torten-Diagramm ben sie eine Vielzahl der Funktionen von JFreeChart übernommen, jedoch nicht alle. AFreeChart unterstützt unter ande- rem Balken-, Linien-, Kuchen- und Streu- ungs-Diagramme (siehe Abbildungen 7 bis 9). Die Bibliothek wird bei Google-Code gehostet. Der Einstieg in die Bibliothek von AFree Chart gestaltet sich im Vergleich zu den anderen Bibliotheken relativ schwierig. Es existiert weder ein Quickstart-Guide noch ein Tutorial. Die Beispiel-Applikation, die sich auf der Google-Code-Seite herunter- laden lässt, zeigt eine Vielzahl möglicher Diagramme. Jedoch ist der Beispiel-Quell- code, der sich ebenfalls auf dieser Seite einsehen lässt, nicht der, der zu der Appli- kation gehört. Dessen Umfang ist um eini- ges geringer. Das verwirrt noch mehr. Abbildung 3: AChartEngine – Linien-Diagramm Eine Brücke lässt sich bei dieser Biblio- thek zu JFreeChart schlagen. Da die meisten Klassen, die von dort portiert wurden, ihre Namen behalten haben, kann man auf der JFreeChart-Seite nach Verwendung und Hilfe suchen. Andererseits ist aber die Java- Doc sehr gut und hilft auch beim Vertiefen der Bibliothek. Leider gibt es offensichtlich keinerlei Feedback der Entwickler auf Pro- bleme der Nutzer. Im Issue-Tracker auf der Google-Code-Seite sind noch Beiträge von Anfang 2011 offen und unkommentiert. aiCharts aiCharts der Firma ArtfulBits ist eine Biblio- thek, deren Quellcode nicht offen ist und für die man zur Nutzung einen Entwickler- Account und eine einjährige Subscription benötigt. Es besteht jedoch die Möglich- Abbildung 4: AChartEngine – Balken-Diagramm
Java aktuell 3-2013 | 29 Android
Abbildung 5: AndroidPlot – Linien-Diagramm Abbildung 6: AndroidPlot – Balken-Diagramm
Abbildung 7: AFreeChart – Torten-Diagramm Abbildung 8: AFreeChart – Linien-Diagramm
TeeChart TeeChart ist eine Diagramm-Bibliothek der Firma Steema Software. Auch hier benö- tigt man eine Entwickler-Lizenz und eine jährliche Subscription. Die Bibliothek un- terstützt alle gängigen Diagrammtypen wie Linien-, Balken-, Häufigkeiten- und Schnittmengen-Diagramme. Die aktuel- le Version ist 2012, TeeChart lässt sich ab Android-Version 2.1 einsetzen. Das Download-Paket umfasst – wie auch schon bei aiCharts – eine Menge an Abbildung 9: AFreeChart – Balken-Diagramm Tutorials und Beispiel-Anwendungen nebst Quellcode, sodass der Einstieg in die Biblio- thek relativ leicht fällt und schnell vonstat- keit, einen Trial der Versionen 1.7 (stable) gestaltet sich dadurch relativ einfach. Die tengeht. Leider ist die JavaDoc nicht ganz beziehungsweise 2.0 (beta) herunterzula- JavaDoc ist sehr gut. Es finden sich sogar in so hilfreich wie gehofft. Die Klassen-Be- den. Die Bibliothek ist ab Android-Version wichtigen Klassenbeschreibungen Bilder schreibungen bestehen nur aus Copyright- 1.5 einsetzbar. Die Palette der Bibliothek ist und Beispiele, wie man etwas implemen- Informationen und viele Beschreibungen weit gefächert. tieren sollte. So kennt man es auch von der der Funktionen scheinen generiert. Durch den im Download-Paket mitgelie- JavaDoc des Android-API. ArtfulBits bietet Neben dem Support, den Subscription- ferten Quick-Start-Guide und die ausführ- neben dem Support, den man sich mit der User von Steema bekommen, gibt es auf lichen Quellcode-Beispiele ist der Einstieg Subscription sichert, noch ein Forum, in der Webseite auch ein Forum, in dem ge- in diese Bibliothek schnell gemacht. Auch dem die Entwickler der Bibliothek detail- stellte Fragen recht schnell beantwortet das weitere Arbeiten mit der Bibliothek liert auf Fragen der Benutzer eingehen. werden. Als einzige der untersuchten Bib-
30 |
iii iii iiiiii www.ijug.eu
liotheken kann TeeChart Diagramme auch chen es dem Benutzer da schon einfacher: in 3D darstellen. Sie bieten Views an, die in manchen Fällen Die erste Java-EE-7-Spezifikationen sogar per Layout-XML deklariert werden sind final Weitere Bibliotheken können. Es gibt natürlich noch weitere Bibliotheken, Die nächste Version der Java-EE-Spe- mit denen sich Diagramme zeichnen las- Beispiele zum Herunterladen zifikation biegt auf die Zielgrade ein. sen. Dazu gehören unter anderem RChart, • achartengine-demo-debug.apk und Quel- Die ersten vier Spezifikationen sind DroidCharts, Android Chart und Snowdon. len: http://www.buschmais.de/wp-con- bereits Ende März 2013 erfolgreich Diese wurden jedoch aus der Betrachtung tent/uploads/2013/02/achartengine-de- durch den „Final Approval Ballot“ des herausgenommen, da deren letzte Aktivi- mo-debug.apk und http://www.buschmais. Java Community Process (JCP) gegan- tät (hinsichtlich Quellcode-Commits oder de/wp-content/uploads/2013/02/achar- gen und damit inhaltlich final. Die Vor- Foren-/Wiki-Einträgen) mehr als zwei Jahre tengine-demo-src.zip reiter sind: zurückliegt. • androidplot-demo-debug.apk und ChartDroid, dessen letzte Aktivität auch Quellen: http://www.buschmais.de/ • Java Message Service 2.0 (JSR 343, im November 2011 zu verzeichnen ist, bietet wp-content/uploads/2013/02/andro- http://www.jcp.org/en/jsr/detail noch einen weiteren Ansatz der Diagramm- idplot-demo-debug.apk und http:// ?id=343) Erstellung. Statt die Bibliothek in die zu www.buschmais.de/wp-content/up- • Bean Validation 1.1 (JSR 349, http:// erstellende Applikation einzubinden, wird loads/2013/02/androidplot-demo-src.zip www.jcp.org/en/jsr/detail?id=349) von der Applikation vorausgesetzt, dass • afreechart-demo-debug.apk und Quel- • Batch Applications for the Java eine weitere Applikation – in diesem Fall len: http://www.buschmais.de/wp-con- Platform (JSR 352, http://www.jcp. ChartDroid – auf dem Zielgerät vorhanden tent/uploads/2013/02/afreechart-demo- org/en/jsr/detail?id=352) ist. ChartDroid wird dann per Intent gerufen debug.apk und http://www.buschmais. • Java API for JSON Processing (JSR und stellt das Diagramm anschließend be- de/wp-content/uploads/2013/02/af- 353, http://www.jcp.org/en/jsr/detail reit. Dieser Ansatz scheint jedoch nicht prak- reechart-demo-src.zip ?id=353) tikabel genug, um ihn weiter zu verfolgen. Links Mit Ausnahme des Batch JSR 352 Fazit • AchartEngine: http://code.google.com/p/ wurden alle Einstimmig befürwortet. Alle Bibliotheken tun genau das, wozu achartengine und http://www.acharten- Werner Keil, als einziges persönliches sie entwickelt wurden. Und das nicht mal gine.org Mitglied im Executive Committee (EC), schlecht. Abgesehen von AndroidPlot • AndroidPlot: http://androidplot.com äußerte Bedenken im Hinblick auf die decken alle eine weite Palette an Dia- • AfreeChart: http://code.google.com/p/ nicht einheitliche Lizensierung der di- gramm-Typen ab. Benötigt man einen sehr afreechart versen Ergebnisse des JSRs. So finden speziellen Typ, so muss man sich die Be- • aiCharts: http://www.artfulbits.com/pro- sich im JavaDoc Hinweise wie „Co- schreibungen der Bibliotheken ansehen, ducts/android/aicharts.aspx pyright © 2012. All Rights Reserved“, um zu erkennen, ob diese Bibliothek den • TeeChart: http://www.steema.com/ obwohl Technology Compatibility Kit gewünschten Typ unterstützt. Um zu ent- teechart/mobile (TCK) und Referenzimplementierung scheiden, welche Bibliothek man einsetzen (RI) laut original JSR eigentlich einheit- möchte, stellt sich hier nur die Frage, inwie- lich Apache 2.0 lizensiert sein sollten. weit man die aufgelisteten Bibliotheken be- Falko Krische Die Interpretation mag valide sein ziehungsweise deren erstellte Diagramme [email protected] und formell ist dies sicherlich nicht in an die eigenen Wünsche anpassen kann. Ordnung. Bleibt abzuwarten, ob für Ein anderes Entscheidungskriterium die kommenden Versionen hier Abhil- könnte die Art und Weise sein, wie die Dia- fe entsteht. gramme zur Anzeige gebracht werden. So Die aktuell noch in Entwicklung be- bietet zum Beispiel AFreeChart keine Views findliche Version der Java EE 7 konfor- für die verschiedenen Diagramm-Typen, men Referenz-Implementierung ist der sondern der Entwickler muss die „onDraw()“- GlassFish 4.0. Die verfügbaren promo- Methode einer Kind-View überschreiben. ted builds (http://dlc.sun.com.edgesui- In dieser wird dann das Diagramm auf den te.net/glassfish/4.0/promoted/) ent- View-Bereich gezeichnet. Diese Art der halten die vier Spezifikationen bereits. View-Darstellung passt eigentlich nicht in Jeder Interessierte ist eingeladen, die- das Android-Umfeld und ist sicher dem se bereits heute auszuprobieren und Umstand geschuldet, dass diese Bibliothek Falko Krische ist Berater bei der buschmais GbR. Sein Schwer- eventuelle Fehler über den GlassFish von einer Swing-Bibliothek portiert wur- punkt liegt auf der Entwicklung von Unternehmensanwendun- Bugtracker (http://java.net/jira/brow- de. Andere Bibliotheken (AChartEngine, gen im eCommerce- und Enterprise-Bereich. Die Entwicklung von se/GLASSFISH) zu melden. AndroidPlot, aiCharts und TeeChart) ma- Android-Anwendungen ist sein großes Steckenpferd.
Java aktuell 3-2013 | 31 Inhalt
WebID: Das Web als Social Network
Angelo Veltens, http://datenwissen.de
Mit Linked Data lassen sich Daten im Web verbinden. Weitet man das Konzept auf Personen und deren Interaktion aus, entsteht ein „Social Web of Data“. Anstelle Dutzender Accounts bei unzähligen Diensten tritt eine globale Identität, die WebID. Sie dient Angeboten im WWW als Quelle von Profil-Informationen und zur Authentifizierung. Auch als Single Sign-on im Unternehmens-Intranet kann WebID eine Option sein.
Wer heute im Web aktiv ist, muss eine Viel- Sicht. Statt unzähliger Accounts erhalten tare und viele andere Inhalte. Linked Data zahl von Nutzer-Accounts bei unterschied- die Nutzer eine Identität im Web, die sie ist wie dafür geschaffen, diese Beziehun- lichen Diensten anlegen und verwalten. bei Bedarf selbst hosten können und über gen abzubilden. Im Grunde genommen Dutzende Profile wollen ausgefüllt und die sie den genutzten Diensten beliebige erzeugt jeder Klick auf einen „Gefällt mir“- gepflegt werden, verlangen Nutzernamen Profil-Informationen bereitstellen können. Button ein RDF-Tripel. Dessen „Subjekt“ ist und Passwörter. Dies alles scheint im Soci- Dadurch wird das Web selbst zu einem de- der klickende Nutzer, „gefällt“ ist das Prädi- al Web nötig zu sein, um Nutzer zu iden- zentralen sozialen Netzwerk. kat und die dem Nutzer gefallende Seite ist tifizieren und sich mit anderen Nutzern in das Objekt (siehe Abbildung 1). Kontakt bringen zu können. Rückblick: Daten verlinken Doch die soziale Interaktion ist in der In den letzten Ausgaben wurde Linked Freunde von Freunden Regel auf die jeweiligen Dienste begrenzt Data thematisiert. Das WWW ist bereits Die Linked-Data-Prinzipien von Tim Ber- und lässt sich bestenfalls auf sogenann- heute ein Netz aus miteinander verlinkten ners-Lee [1] verlangen zunächst, dass te Social Networks wie Facebook, Twitter Dokumenten. Linked Data weitet dieses „Dinge“ – nicht nur Dokumente – mittels und Google+ ausweiten. Letztere werden Konzept der Links auf Daten aus, indem es URI identifiziert werden. Auch Personen auch oft als Authentifizierungsdienst he- nicht nur Dokumente, sondern auch Dinge können dabei durch einen URI identifiziert rangezogen. Dies führt zu einer Zentrali- über URIs identifiziert und miteinander in werden. Sobald dies geschehen ist, kön- sierung des eigentlich dezentralen Social Beziehung setzt. Dazu dient das Datenmo- nen sie als Subjekt oder Objekt in einem Webs zu monolithischen Social-Network- dell RDF, das Daten als „Tripel“ abbildet. Ein RDF-Tripel verwendet werden. Mein URI Plattformen. Dienste, die sich zur Authen- solches Tripel besteht aus Subjekt, Prädikat lautet etwa „http://me.desone.org/person/ tifizierung auf diese Plattformen verlassen, und Objekt. Subjekt und Objekt werden aveltens#me“ und mit folgendem RDF-Tri- werden von deren API und ihren Beschrän- über das Prädikat miteinander verlinkt. pel sage ich aus, dass ich Tim Berners-Lee kungen abhängig. Im Social Web bestehen vielerlei Bezie- kenne (siehe Listing 1). Mit Linked Data und dem WebID-Pro- hungen: Nutzer knüpfen digitale Freund- In dem Beispiel wird die FOAF-Ontologie tokoll ist ein Ausweg aus dem Dilemma in schaften, veröffentlichen Fotos, Kommen- [2] verwendet, um die Bekanntschafts-
32 |
iii iii iiiiii www.ijug.eu
(ohne „#me“). Letzterer identifiziert ein Do- kument, der erste eine Person (siehe Abbil- dung 2). Über „http://me.desone.org/per- son/aveltens.rdf“ und „http://me.desone. org/person/aveltens.html“ werden zudem zwei verschiedene Repräsentationen des Abbildung 1: „Gefällt mir“-Beziehung als RDF-Graph generischen Dokuments identifiziert (RDF/ XML und HTML). Wie man sieht, ist es leicht, ein Social- Network-Profil mithilfe von Linked Data foaf:knows zu erzeugen und mit anderen Profilen . und Web-Ressourcen zu verlinken. Aber das allein reicht noch nicht, um soziale Listing 1 Interaktionen im WWW zu ermöglichen. Mit bewährten, asynchronen Verschlüsse- lungsmechanismen und dem WebID-Pro- tokoll eignet sich ein FOAF-Profil auch zu a foaf:Person; foaf:familyName “Veltens“; Authentisierung im Web. foaf:givenName “Angelo“; foaf:homepage ; Das WebID-Protokoll foaf:basedNear . Authentifizierung im Social Web bedeutet, nachweisen zu können, dass einem Nutzer Listing 2 ein bestimmtes Profil gehört. Bei zentral organisierten Social-Network-Plattformen beziehung auszudrücken. FOAF steht me.desone.org/person/aveltens#me“ im kann dies durch die Eingabe des entspre- für „Friend of a Friend“ und ist eine weit Browser auf, erhält man eine menschenles- chenden Benutzernamens und des zu- verbreitete Ontologie, die strukturierte bare HTML-Seite. Verlangt man im HTTP-Ac- gehörigen Passworts erfolgen. In einem Aussagen über Personen und deren Be- cept-Header jedoch „application/rdf+xml“, dezentralen Social Web aus verlinkten ziehungen trifft. In Listing 2 ist ein Auszug antwortet der Server mit maschinenles- FOAF-Profilen soll eine Nutzerin nachwei- aus meinem FOAF-Profil in der RDF-Syntax barem RDF/XML. Das RDF-Dokument hat sen können, dass das unter einem bestimm- „Turtle“ zu sehen: auch einen eigenen URI und lässt sich über ten URI abrufbare Profil das ihre ist. Dieser In der ersten Zeile steht der URI des Sub- „http://me.desone.org/person/aveltens. Nachweis soll zudem gegenüber beliebi- jekts, über das Aussagen getroffen werden. rdf“ direkt aufrufen. gen Diensten im Web möglich sein. Es folgen Prädikat-Objekt-Paare, durch Im Web of Data werden Dinge von Do- Das WebID-Protokoll erreicht dies durch Semikolon getrennt. Aus den Daten geht kumenten unterschieden. Eine Person ist geschickte Kombination bewährter Web- hervor, dass es sich um eine Person handelt etwas anderes als deren Profilseite im Web. Standards. Neben einem persönlichen URI („a foaf:Person“). Auch Vor- und Nachna- Daher benötigen beide einen eigenen und einem darunter verfügbaren FOAF- me sind im Profil hinterlegt. Da es sich bei URI. Während ich als Person durch „http:// Profil benötigt ein Nutzer zusätzlich ein der Homepage um eine Web-Ressource me.desone.org/person/aveltens#me“ (Man X.509-Zertifikat und den dazu gehörigen handelt, wird sie über ihren URI verlinkt beachte den Fragment-Identifier „#me“, privaten Schlüssel. Alle heutigen Brow- und nicht wie die Namen als String-Literal der Teil des URI ist) identifiziert werde, lau- ser enthalten eine Zertifikatsverwaltung, hinterlegt. Die große Stärke von Linked tet der generische URI meiner Profilseite in der diese bequem hinterlegt werden Data liegt auch hier in der Verlinkung von „http://me.desone.org/person/aveltens“ können. Auch die Authentifizierung mit beliebigen Ressourcen im Web of Data. „foaf:basedNear“ verweist daher auf den URI der Stadt Braunschweig beim Dienst „geonames.org“. Folgt man diesem Link, erhält man weitere Informationen zur Stadt, beispielsweise deren Einwohnerzahl. Natürlich ist man in einem Profil nicht auf FOAF beschränkt, sondern kann alle im Web verfügbaren Ontologien nutzen und bei Bedarf eine eigene entwickeln. Für die Bedürfnisse von Anwendungen im Social Web ist in Ergänzung zu FOAF die SIOC- Abbildung 2: Dank Content-Negotiation kann unter dem Profil-URI sowohl ein menschen- (HTML, Ontologie [3] geeignet. Ruft man „http:// links) als auch maschinenlesbares Profil (RDF/XML, rechts) ausgeliefert werden
Java aktuell 3-2013 | 33 WebID
solchen Zertifikaten gegenüber einem bereitstehen und die Authentifizierung Web-Server ist keine neue Erfindung, son- über das WebID-Protokoll gewährleistet ist, ping:to . dern eine seit Langem funktionierende bleibt noch die Frage offen, wie die Kom- Technologie. Der neue Weg, den WebID munikation zwischen WebID-Nutzern ab- einschlägt, ist die Verknüpfung dieser Zer- laufen kann. Wie kann ich beispielsweise je- Listing 4 tifikate mit FOAF-Profilen. mandem mitteilen, dass ich ihn oder sie als Zum einen wird im Zertifikat der URI Freund hinzufügen möchte. Natürlich kann rende Social-Web-Anwendungen Links zu des Nutzers als „Subject Alternative Name“ man einfach ein entsprechendes RDF-Tripel Daten anderer Dienste setzen. Abbildung hinterlegt. Ein Server, der die Authentifi- im eigenen Profil ergänzen, doch möchte 4 zeigt, wie das Profil der WebID-Nutzerin zierung durchführt, kann den URI auslesen man sein Gegenüber vielleicht über diesen „Alice“ mit verschiedenen Inhalten im und die dort hinterlegten Daten abrufen. Link informieren, ihr die Gelegenheit ge- Social Web verlinkt ist. In diesem fiktiven Um zu beweisen, dass dieses Profil tatsäch- ben, die Freundschaft zu bestätigen und Beispiel hostet Alice ihr FOAF-Profil selbst lich dem Nutzer gehört, fügt dieser neben einen Backlink zu setzen. und hat sich mit ihrer WebID bei einem den gewünschten Profildaten auch seinen Dazu gibt es einen „Pingback“-Mecha- Bilderdienst eingeloggt. Nach einem Klick öffentlichen Schlüssel dort ein. Die dazu nismus, ähnlich wie man ihn schon von auf den dortigen „Gefällt mir“-Button wird nötigen Prädikate stellt die Cert-Ontologie Blogs kennt. Verlinkt eine Ressource auf der in Alices Profil angegebene Pingback- [4] zur Verfügung (siehe Listing 3). eine andere, kann sie die Information darü- Dienst benachrichtigt, der daraufhin ein Der öffentliche Schlüssel ist vom Typ ber über HTTP-POST an einen bestimmten RDF-Tripel im FOAF-Profil ergänzt. Alice „cert:RSAPublicKey“ und wird über das URI senden. Welcher URI das ist, kann die hat außerdem im Blog eines Freundes ei- Prädikat „cert:key“ mit der entsprechen- verlinkte Ressource wiederum selbst be- nen Kommentar hinterlassen. Auch dieser den Person verlinkt. „cert:exponent“ und kannt geben. Auch dafür gibt es eine pas- wurde mit ihrem Profil verlinkt, ebenso mit „cert:modulus“ beinhalten die entsprechen- sende Ontologie, das Semantic Pingback dem Blogartikel, auf den er sich bezieht. den Daten des Schlüssels. Optional kann Vocabulary [5]. Das folgende Listing gibt Eine Vielzahl von kleinen, auf eine Kern- der Schlüssel auch über ein „rdfs:label“ be- über das Prädikat „ping:to“ an, dass sich aufgabe spezialisierten Diensten kann sich nannt werden. Die Zusammenhänge sind der Pingback-Dienst von „my-profile.eu“ so zu einem Social Web of Data vernetzen. in Abbildung 3 schematisch dargestellt. um eingehende „Pings“ zu meinem Profil In der Summe bieten diese Dienste ihren Authentisiert sich nun eine Nutzerin kümmert (siehe Listing 4). Nutzern weit mehr Möglichkeiten als zen- über ihr Zertifikat an einem Web-Server, Logge ich mich mit meiner WebID bei tralisierte Social-Network-Plattformen und kann dieser das Profil abrufen und die digi- „my-profile.eu“ ein, bekomme ich einge- dennoch entfällt die Notwendigkeit, für tale Signatur mithilfe des dort hinterlegten hende „Pings“ in der Web-Oberfläche an- diese Vielfalt mehrere Accounts zu führen. öffentlichen Schlüssels prüfen. Das Web gezeigt. Im Artikel „Friending on the Social Die Herausforderung ist jedoch noch, dass ID-Protokoll setzt hier also auf bewährte Web“ haben Henry Story, Andrei Sambra viele Dienste WebID unterstützen müssen Public-Key-Authentifizierung, um die Zu- und Sebastian Tramp semantische Ping- und die Handhabung ähnlich einfach wer- gehörigkeit des FOAF-Profils zum Nutzer backs näher beschrieben [6]. den muss wie die von Facebook & Co. nachzuweisen. Diese Vorgehensweise ist nicht nur si- Daten-Silos überwinden Semantische Zugriffskontrolle cher, sondern auch benutzerfreundlich. Mit Linked Data und WebID kann es gelin- Ein FOAF-Profil muss keinesfalls komplett Ein Klick auf einen Link genügt, um sich gen, die abgeschotteten Daten-Silos des öffentlich sein. Über semantische Access gegenüber beliebigen Diensten im Web Web 2.0 zu öffnen und ein echtes Social Control Lists (ACL) ist es möglich, genau zu authentisieren. Weder müssen sich Nut- Web zu spinnen. Da sowohl Personen als zu definieren, wer welche Informationen zer komplizierte Passwörter merken, noch auch Inhalte über ihre URIs global ver- sehen darf. Diese ACL funktionieren ähn- müssen sie ihren URI eintippen. Denn letz- linkbar sind, entfällt die Notwendigkeit lich, wie man es bereits von Dateisyste- terer ist bereits im Zertifikat enthalten. eines zentralen Social-Network-Dienstes. men kennt, nur dass nun Personen und Wie auch im dokumentenbasierten WWW Gruppen über URIs identifiziert werden. Digitale Freundschaften schließen Links zu beliebigen anderen Seiten mög- Angenommen, Alice wird durch „http:// Nachdem nun Nutzerdaten im FOAF-Profil lich sind, können auf Linked Data basie- me.example.org/person/alice#me“ iden- tifiziert und stellt unter diesem URI einige unkritische Informationen über sich öf- cert:key <#publickey>. fentlich. Gleichzeitig will sie aber engen Freunden auch Zugriff auf ihr Geburtsda- <#publickey> tum und ihre Telefonnummer geben. Dazu a cert:RSAPublicKey; rdfs:label “Angelos Public Key“; hinterlegt sie diese Daten im Dokument cert:exponent 65537; „http://me.example.org/person/alice/pri- cert:modulus “ACE0[...]“^^. vate“ und verlinkt es in ihrem eigentlichen Profil (siehe Listing 5). Man beachte, dass Listing 3 in diesem Beispiel der relative URI „private“
34 |
iii iii iiiiii www.ijug.eu
Verfahren (SSO). Selbst wenn Mitarbeiter- daten über mehrere Systeme verteilt sind, können diese als Grundlage für ein unter- nehmensweites SSO dienen. Die Systeme müssen dazu lediglich die Daten, wie oben beschrieben, als RDF bereitstellen. Ein zen- traler Authentifizierungsdienst mit Kennt- nis aller Legitimationsdaten ist jedoch nicht notwendig. Insbesondere, wenn konsequent auf Linked Data gesetzt wird, können Unter- nehmen darüber hinaus auch von verbes- sertem Wissensmanagement profitieren. Mit Linked Data und semantischen Tech- nologien lässt sich Wissen organisieren und besser auffinden. Oft steht ein solches Wissensmanagement jedoch vor dem Pro- blem, dass Informationen nicht in den ge- eigneten Formaten vorliegen. Abbildung 3: Schematische Darstellung der Beziehungen zwischen Nutzer, Zertifikat und FOAF-Profil Identifiziert man Mitarbeiter über WebID, können RDF-Tripel als Nebenprodukt der genügt, da das Dokument in der Pfadhie- WebID-Protokoll authentifizieren, die ACL täglichen Arbeit entstehen. Angenommen, rarchie direkt unterhalb des öffentlichen auswerten und anschließend den Zugriff eine Mitarbeiterin liest im Unternehmens- Profil-Dokuments liegt. Nun gilt es noch, verweigern oder gestatten. Wiki die Dokumentation über ein Web- den Zugriff auf die privaten Informationen Wer WebID ausprobieren möchte, kann Framework. Sie bekommt dort einen Button zu schützen. Dazu hinterlegt Alice eine sich leicht bei „http://my-profile.eu“ ein „kenne mich aus“ zur Verfügung gestellt. Autorisierung in der ACL-Ontologie [7] in Profil anlegen. Dabei wird ein Zertifikat im Ein Klick darauf verlinkt ihre WebID entspre- ihrem privaten Dokument (siehe Listing 6). Browser erzeugt und installiert. Das zuge- chend mit dem Web-Framework. Projekte, Das Beispiel nutzt nicht mehr die Turtle- hörige FOAF-Profil wird bei „my-profile.eu“ die gerade planen, das Framework einzu- Syntax, sondern die ähnliche, aber mächti- gehostet. Anschließend kann man sich mit setzen, sehen diese Beziehung und können gere Notation 3. Da die ACL selbst keinen seiner WebID beispielsweise bei „http:// das Fachwissen der Mitarbeiterin bei Bedarf eigenen URI benötigt, ist sie in den ersten picserv.desone.org“ anmelden und dort zu Rate ziehen. Die dazu nötigen Kontakt- fünf Zeilen in eckigen Klammern als soge- ein Bild hochladen. Die nächste Ausgabe daten sind im FOAF-Profil ersichtlich. nannter „blank node“ hinterlegt. Das Prä- wird den praktischen Einsatz von WebID dikat „acl:accessTo“ teilt mit, welche Res- intensiver behandeln und zeigen, wie eine source durch die ACL geschützt wird. Das Anwendung Nutzer über WebID authenti- leere Klammernpaar „<>“ stellt im Grunde fizieren kann. wieder einen relativen URI dar, verweist also auf das aktuelle Dokument „http:// Linked Data und WebID im Unternehmensnetz me.example.org/person/alice/private“. WebID kann auch für den Einsatz im Unter- Über „acl:mode acl:Read“ wird ausgesagt, nehmens-Intranet eine Option sein. Zum dass es um den Lesezugriff geht. einen eignet es sich als Single-Sign-on- „acl:agentClass“ schließlich legt fest, wer zugriffsberechtigt ist. Das Prädikat ver- weist auf einen Typ, dem eine Ressource angehören muss, um Zugriff zu erlangen. Über „acl:agentClass foaf:Person“ könnte man beispielsweise allen Personen Zugriff auf eine Ressource gestatten. Alice will ihre Daten jedoch nur engen Freunden zugänglich machen und gruppiert diese daher in einem eigenen Typ „#closeFriend“. Ein Web-Server oder eine Web-Anwen- dung, die das Profil von Alice beherbergt, kann nun bei versuchtem Zugriff auf die private Ressource den Nutzer über das Abbildung 4: Verlinkung des WebID-Profils von Alice mit Inhalten im Social Web
Java aktuell 3-2013 | 35 WebID
bringt WebID die soziale Komponente in [5] http://purl.org/net/pingback # In http://me.example.org/person/alice/private [6] http://bblfish.net/tmp/2011/05/09 dieses Web. Nicht nur Dinge werden durch [7] http://www.w3.org/ns/auth/acl foaf:birthday “11-30“; URIs identifiziert, sondern auch Personen. foaf:phone . Durch Links lassen sich die URIs dieser Personen mit den Dingen im Web in eine # In http://me.example.org/person/alice Beziehung setzen. Die sozialen Beziehun- gen der Nutzer untereinander lassen sich Angelo Veltens foaf:givenName “Alice“; rdfs:seeAlso . ebenso abbilden wie die Verbindungen zu [email protected] den Inhalten, die sie im Web erzeugen und http://datenwissen.de Listing 5 teilen. Die Möglichkeiten, die uns heute auf Social-Network-Plattformen geboten werden, lassen sich so auf das gesamte [ offene Web ausweiten. Es entsteht eine acl:accessTo <>; direkte Interaktion zwischen den Profilen acl:mode acl:Read; der Nutzer, die sie bei Bedarf selbst hosten acl:agentClass <#closeFriend> können, und der Vielzahl an Diensten im ]. Web. Die Notwendigkeit für eine zentrale <#closeFriend> is rdf:type of Plattform entfällt ebenso wie das stän- , dige Anlegen von Accounts bei neuen . Diensten.
Angelo Veltens studierte Angewandte Informatik an der Dualen Listing 6 Referenzen Hochschule Baden-Württemberg Karlsruhe und befasste sich in [1] http://www.w3.org/DesignIssues/LinkedData. Studienarbeiten und Abschlussarbeit mit Linked Data und seman- Fazit html [2] http://xmlns.com/foaf/spec tischem Wissensmanagement. Heute ist er als Software-Entwickler Während Linked Data das Web aus Doku- [3] http://sioc-project.org in Braunschweig tätig, arbeitet in seiner Freizeit am „Social Web of menten zu einem Web aus Daten erweitert, [4] http://www.w3.org/ns/auth/cert# Data“ und referiert auf Konferenzen zu diesem Thema.
Berliner Expertenseminare • Wissensvertiefung für Oracle-Anwender • Mit ausgewählten Schulungspartnern • Von Experten für Experten
10./11. September 2013 Buchen Sie 2 Tage englischsprachige Intensiv-Schulung zum Thema JavaServer Faces (JSF 2.2), dem Standard Web-Appli- kations-Framework für Java EE. mit Ed Burns
www.ijug.eu www.doag.org
36 |
iii iii iiiiii www.ijug.eu
Vermittlungsinstanzen sind gefragt
Tobias Hartwig, Red Hat GmbH
Cloud-Computing, Software für mobile Endgeräte und Big Data rücken die Middleware in das Blickfeld von Entwicklern. Open-Source-basierte Middleware vereinfacht die Erstellung der dazu benötigten anspruchs- vollen Anwendungen.
In großen Unternehmen ist die IT-Infra- Die meisten Unternehmen kämpfen nigen. Darüber hinaus kann Middleware struktur historisch gewachsen und meist auch heute noch mit einer Vielzahl isolier- entscheidend dazu beitragen, Geschäfts- heterogen. Sie setzt sich aus unterschied- ter Anwendungs- und Informationssilos, prozesse zu optimieren, zu automatisie- lichen Hardware- und Betriebssystem- die eine Falle für Geschäftsdaten darstellen ren, zu dynamisieren und damit effizienter Plattformen, verschiedenen Datenbanken und komplexe Abstimmungen zwischen zu gestalten. und File-Systemen sowie einer Mischung den Anwendungen erforderlich machen. aus Standard-Applikationen und Individu- Middleware schafft Abhilfe und sorgt für Innovation und Entwickler-Produktivität al-Software zusammen. Viele Geschäftspro- die Interoperabilität von Anwendungen, Das Einsatzspektrum von Middleware hat zesse greifen dabei auf mehrere Anwen- ermöglicht den Aufruf von Diensten, die in sich seit einiger Zeit schon deutlich erwei- dungen zu, die koordiniert werden müssen. den unterschiedlichsten Programmierspra- tert, nachdem eine Vielzahl neuer interner Für Unternehmen wird es auch immer wich- chen implementiert wurden und liefert und externer Datenquellen sowie Anwen- tiger, sich schnell und zielgerichtet den dy- Endgeräten jeder Art Verzeichnis- und Ver- dungen auf den unterschiedlichsten mo- namischen Marktbedingungen anpassen mittlungsdienste zum Zugriff auf entfernte bilen Endgeräten und aus den verschiede- zu können. Die Herausforderungen kön- Clients. Damit vereinfacht Middleware den nen Cloud-Modellen dazugekommen sind. nen dabei sehr unterschiedlich sein – neue Datenzugriff und senkt die Entwicklungs- Als Folge hat die Komplexität massiv zuge- IT-Lösungen, die unternehmenskritische und Administrationskosten. Die wichtigs- nommen. Web- und Java-Entwickler benö- Geschäftsprozesse unterstützen sollen, ten Vorteile aus Business-Sicht: Middle- tigen flexible Entwicklungs-Plattformen, erfordern einen hohen Grad an Flexibilität, ware bietet vielfältige Möglichkeiten, um um anpassungsfähige Anwendungen zu um heutigen und künftigen fachlichen An- die Produktivität der Entwickler zu steigern erstellen. Die Entwickler-Produktivität spielt forderungen optimal gerecht werden zu und den Markteintritt von Produkten und hierbei auch eine entscheidende Rolle. In können. digitalen Dienstleistungen zu beschleu- diesem Zusammenhang hat der Open-
Abbildung 1: Das Produktportfolio von JBoss Enterprise Middleware auf einen Blick
Java aktuell 3-2013 | 37 Middleware
Abbildung 2: Open-Source-Middleware für Unternehmen muss zuverlässig und stabil laufen
Source-Ansatz eine besondere Bedeutung, in Zukunft weitere Gerätetypen, darun- sichere Lösungen, um heute schon unter- denn er erweist sich als zentraler Inno- ter beispielsweise auch neue Formen von schiedlichste Deployment-Paradigmen vationstreiber. Die Entwicklung wird in Sensoren, mit denen sich automatisch unterstützen zu können − physisch, virtu- Community-Projekten durch eine Vielzahl laufende Prozesse überwachen lassen. ell, in privaten, öffentlichen oder hybriden von Beteiligten vorangebracht, die aktu- Um die zunehmend heterogenen Mobil- Clouds, und das, ohne die Anwendungen elle Themen und Trends sehr schnell auf- geräte bedienen zu können, werden Ent- dafür jeweils anpassen zu müssen. greifen und in Software umsetzen können. wickler verstärkt auf Open-Source-fähige Unternehmen wollen zudem das Know- Plattformen wie Red Hats JBoss Enterprise Middleware und Frameworks zurückgrei- how der Entwickler, das sie beim Aufbau Middleware (siehe Abbildung 1) unterstüt- fen, die offene Standards unterstützen einer Applikation für den internen Ein- zen aktuelle Technologien sowie offene und vom grundlegenden Java-Paradigma satz von Applikationen benötigen, auch Standards und ermöglichen eine schnelle „write once, run anywhere“ profitieren bei Cloud-Anwendungen einsetzen. Dazu und produktive Entwicklung. Open-Sour- (siehe Abbildung 2). bietet sich Middleware an, die im Web die ce-Plattformen sind damit auf die neuen gleichen Funktionen bereitstellt wie im lo- Herausforderungen durch mobile Anwen- Middleware und die Cloud kalen Netzwerk. dungen, Cloud Computing und Big Data Beim Cloud-Computing sind vor allem die Entwickler müssen hier vor allem die gut vorbereitet. Platform-as-a-Service-Lösungen (PaaS) auf hohen Anforderungen an die Sicherheit Middleware angewiesen. PaaS-Dienstleis- der Daten berücksichtigen. Behörden, aber Anforderungen durch mobile Anwendungen ter stellen in der Cloud eine Plattform für auch Finanzdienstleister und Unternehmen Die Zahl mobiler Anwendungen ist enorm die Entwickler von Web-Anwendungen aus dem Gesundheitswesen, die neue Tech- gestiegen. Immer mehr Anwender wollen zur Verfügung. Sie bieten ihren Kunden nologielösungen für interne und externe von unterwegs genauso einfach auf ihre eine Laufzeitumgebung, die sich einfach User einsetzen wollen, legen großen Wert gewohnten Daten und Applikationen zu- administrieren lässt und die den gesamten auf die Common-Criteria-Zertifizierung. Die greifen wie an ihrem Schreibtisch. Entspre- Lebenszyklus einer Software vom Design JBoss Enterprise Application Platform (EAP) chende Apps für das iOS von Apple und für über die Entwicklung, den Test bis hin zum beispielsweise erfüllt den internationalen die Android-Welt gibt es bereits und nahe- Betrieb der Anwendungen in der Cloud Common-Criteria-Sicherheitsstandard für zu täglich kommen neue hinzu. Zum einen umfasst. Parallel dazu geht es darum, nicht Behörden und Unternehmen auf einer der integrieren immer mehr Unternehmen mo- nur den reinen Applikationsserver über die höchsten Stufen, dem Evaluation Assurance bile Anwendungen in komplexe Backend- Cloud zur Verfügung zu stellen, sondern Level 4+. Applikationen wie CRM- oder ERP-Systeme. ihn auch mit anderen Anwendungen zu Zum anderen fächert sich das Angebot an verknüpfen und mit einem Workflow- und Big Data Mobilgeräten in Zukunft weiter auf. Zu den Prozess-Management auszustatten. Ge- Neben mobilen Anwendungen und Cloud- Smartphones und Tablet-PCs gesellen sich fragt sind flexible und vor allem zukunfts- Computing ist Big Data momentan das drit-
38 |
iii iii iiiiii www.ijug.eu
Neue Standards für Middleware eine vereinfachte Paketierung. wendungen sind nicht proprietär, Standards vereinfachen die Software- sondern laufen auf allen mobilen Ge- Entwicklung im Bereich Middleware und • BPMN 2.0 räten und PCs. HTML 5 ist damit vor sorgen dafür, dass die Kommunikation Immer mehr Unternehmen nutzen allem für mobile Anwendungen von zwischen den Applikationen reibungslos Business Model and Notation 2, kurz Bedeutung. funktioniert. Dabei sind folgende Stan- BPMN 2.0. Dahinter steckt eine grafi- dards von besonderer Bedeutung: sche Spezifikationssprache, mit der • Advanced Messaging Queuing Pro- sich Geschäftsprozesse in Diagram- tocol (AMQP) • Java EE 6 men darstellen lassen. Die entstehen- Das AMQP ist noch verhältnismäßig In der Spezifikation der Java Enter- den Grafiken haben große Ähnlichkeit neu und wurde erst im Herbst 2011 prise Edition werden Standards de- mit Flussdiagrammen. Das Ziel von in der Version 1.0 verabschiedet. Be- finiert, die die Interoperabilität von BPMN ist es, einen grafischen Standard teiligt an der Entwicklung waren ne- Softwarekomponenten und Diens- zu entwickeln, den alle an einem Ge- ben IT-Unternehmen wie Red Hat, ten sicherstellen soll, die primär in schäftsprozess Beteiligten verstehen. VMware und Microsoft auch die IT- der Programmiersprache Java erstellt Abteilungen diverser Finanzinstitute werden. Dies ermöglicht die Realisie- • HTML 5 wie etwa JPMorgan, Bank of America rung verteilter, mehrschichtiger Ap- Der aktuelle Standard der Hyper- oder die Deutsche Börse. Bei AMQP plikationen. Die aktuelle Version Java text Markup Language vereint Tech- handelt es sich um ein herstellerneu- EE 6 führte einige Neuerungen zur Er- nologien, die den Browser von einem trales, freies und offenes Protokoll, das höhung der Entwicklerproduktivität Dokument-Betrachter in eine An- den Nachrichtenaustausch zwischen ein. Beispiele sind erweiterte Annota- wendungs-Plattform für Webappli- unterschiedlichen Systemen ermög- tionen, die Unterstützung eines einfa- kationen verwandeln – und zwar auf licht. AMQP kommt primär im Finanz- chen Objektmodells („POJO”) oder allen Plattformen. Das heißt, die An- sektor zum Einsatz.
te große Thema der IT-Welt. Marktforschern ten kontinuierlich ausweiten, weil beispiels- re“ profitieren. Middleware beschleunigt wie IDC zufolge wächst das Datenvolumen weise neue Märkte erschlossen werden und damit die Entwicklung anspruchsvoller in den Unternehmen um jährlich bis zu 60 neue Vertriebskanäle hinzukommen, müs- und komplexer Applikationen vor allem Prozent. Aufgabe von Big-Data-Anwen- sen Middleware technisch skalierbar und bei Cloud-Computing, Software für mobile dungen ist es, Informationen aus einer gleichzeitig die betriebswirtschaftlichen Endgeräte und Big Data. Leistungsfähige Vielzahl unterschiedlichster Datenquellen Kosten transparent kalkulierbar sein. Nicht Middleware unterstützt den Einsatz der am besten in Echtzeit aufzubereiten und nur technisch, auch unter Kostenaspekten Applikationen in physischen und virtuel- zu analysieren. Solche Anforderungen kann Open-Source-Middleware hier punk- len Umgebungen, aber auch in privaten, entstehen beispielsweise im Finanzwesen ten. Unterstützt eine Middleware-Lösung öffentlichen oder hybriden Clouds. beim Überwachen von Börsengeschäften, offene Standards, ist es einfach und kos- bei Telekommunikationsunternehmen, bei tengünstig möglich, bestehende Lösun- Internet-Suchmaschinen oder in großen gen zu ergänzen, zusätzliche Bausteine mit Online-Shops, bei denen jeden Tag für Tau- vorhandenen zu verbinden und nahezu Tobias Hartwig sende von Kunden riesige Datenmengen beliebig miteinander zu kombinieren. [email protected] anfallen. Vielfach geht es darum, sowohl große Fazit Mengen strukturierter als auch unstruk- Middleware vereinfacht die Arbeit der Pro- turierter Information einbeziehen zu müs- grammierer und steigert deren Produktivi- sen. Die Aufgabe der Middleware besteht tät, da sie den Aufwand bei der Erstellung darin, die gewonnenen Informationen von Applikationen reduziert. Deutliche Vor- über eine stabile und an offenen Standards teile zeigen sich beim Testen, bei der Inte ausgerichtete Prozess- und Analyseplatt- gration in bestehende Umgebungen sowie form an anderen Applikationen verfügbar bei der Skalierung und der Verwaltung. Mit zu machen oder weiterzugeben. moderner Middleware, die sich an offenen Standards orientiert, können sich Entwick- Skalierbarkeit ist gefragt ler voll auf die inhaltlichen Anforderungen Auch dann, wenn Unternehmen schnell einer Applikation konzentrieren und dabei Tobias Hartwig ist Business Unit Manager EMEA für JBoss wachsen und ihre geschäftlichen Aktivitä- vom Vorteil des „write once, run anywhe- Enterprise Middleware bei Red Hat.
Java aktuell 3-2013 | 39 Wicket
Anspruchsvolle Web-Anwendungen mit Wicket 6
Jochen Mader, Senacor Technologies AG
Wicket 6 stellt mit seiner starken Ausrichtung an objektorientierten Prinzipien nahezu einen Exoten unter den Web-Frameworks dar. Strikte Trennung von Markup und Logik, transparente Ajax-Integration und ausge- zeichnete Unit-Test-Unterstützung sind nur ein paar der Highlights, die in diesem Artikel beleuchtet werden.
Komponentenorientierung ist ein wichtiger des Artikels werden verschiedene Beispie- Guice, CDI) zu zwingen, wird ein API be- Bestandteil moderner Rich-Client-Frame- le anhand des Quickstarts aufgebaut. reitgestellt, das eine Integration erleichtert. works wie Eclipse oder NetBeans. Viele der Natürlich kann man auf vorgefertigte Mo- gängigen Web-Frameworks fühlen sich im dule zurückgreifen („wicket-spring“, „wicket- Gegensatz dazu etwas altbacken an. Oft ar- guice“ und „wicket-cdi“). Diese sind Teil der beitet man an den Konzepten der Objekto- Kern-Distribution, jedoch grundsätzlich von rientierung vorbei und „Copy & Paste“ wird Wicket losgelöst. Somit hat man nun die plötzlich wieder zum beliebten Entwick- Qual/Freude der Wahl. Eines wird jedoch lungsmuster. Seit ein paar Jahren hat hier vorausgesetzt: Ein Servlet-2.5-Container ein Umdenken eingesetzt. Verschiedene sollte es schon sein. Web-Frameworks haben damit begonnen, die Konzepte der Komponentenorientie- Komponenten rung zu adaptieren. Die herausragendsten Komponenten bilden die Basis einer Viel- Vertreter dieser Gattung sind nach Ansicht zahl von UI-Frameworks, angefangen von des Autors Wicket und sein geistiger Vater Eclipse RCP über NetBeans RCP bis hin zu Tapestry. Ihr Ziel ist es, die Entwicklung von JavaFX. Seit einigen Jahren hat sich hier Web-Anwendungen wieder näher an den auch eine kleine Gruppe von Web-Frame- Entwickler zu bringen und Web-Anwen- works etabliert, mit ihren bekanntesten dungen zu dem zu machen, was sie eigent- Vertretern Tapestry, JSF und eben auch Wi- lich sind: Objektorientierte Anwendungen, cket, die genau diesem Ansatz folgen. die HTML produzieren. Was Wicket von diesen abhebt, ist die Abbildung 1: Quickstart-Struktur strikte Trennung von Markup und Logik. Quickstart Während man bei beinahe allen Konkur- Nach dem Ausführen von „mvn archetype: Konfiguration renten die Möglichkeit hat, verschiedene generate - DarchetypeGroupId=org.apache Auf XML-Konfigurationsdateien wird voll- Formen von Skriptsprachen (JUEL, Groovy .wicket -DarchetypeArtifactId=wicket-arche ständig verzichtet. Alle relevanten Konfigu- etc.) direkt im Template zu verwenden, sieht type-quickstart -DarchetypeVersion=6.6.0 rationsoptionen werden in der „WicketAppli- Wicket diese Funktion nicht vor. Im Gegen- -DgroupId=com.senacor -DartifactId=demo- cation“ festgelegt. Wie heutzutage üblich teil: Man bemüht sich, diese Arbeitsweise DarchetypeRepository=https://repository. regiert auch hier das Prinzip von „Conventi- komplett zu verhindern, indem ein Templa- apache.org/ -DinteractiveMode=false“ hat on over Configuration“, Anpassungen sind te ein simples XHTML-Dokument mit erwei- man eine vollständig lauffähige Wicket- also nur in Ausnahmefällen notwendig. tertem Namespace ist. Mehr dazu später. Anwendung erzeugt. Besonders faule Men- Falls man doch mal etwas machen muss, Egal, ob eine vollständige Page oder ein schen können sie sich auch auf der Wicket- kann man in der „init“-Methode via „Getter“ Label – alle Wicket-Komponenten unterlie- Homepage erzeugen lassen. Diese lässt sich auf die verschiedenen Interfaces aus „org. gen einer festgelegten Struktur. Abbildung entweder direkt per „mvn jetty:run“, über die apache.wicket.settings“ zugreifen. Außer- 2 zeigt den entsprechenden Aufbau. Hier im Test-Ordner hinterlegte „Start“-Klasse oder dem lassen sich hier Page-Mounts definie- gibt es die eigentliche Komponentenklas- als Web-Anwendung in der IDE starten. ren, mit denen Pages auf feste URLs gelegt Ein Quickstart eignet sich beispielswei- werden können. Ein Blick in „JavaDoc“ zu se als Ausgangspunkt für eigene Anwen- den „mount“-Methoden verrät die Details. dungen, als Anhang für einen Bug-Report oder um mal kurz etwas außerhalb der Unmanaged eigentlichen Anwendung ausprobieren zu Wicket ist ein „Unmanaged“-Web-Frame- können. Abbildung 1 zeigt den Inhalt der work. Statt den Entwickler zur Verwendung frisch erzeugten Anwendung. Im Verlauf eines bestimmten Glue-Layers (Spring, Abbildung 2: Komponente
40 |
iii iii iiiiii www.ijug.eu
Damit wird der Komponente beschrieben, public class HomePage extends WebPage { public HomePage(final PageParameters parameters) { wie sie an ihre Daten kommt und Eingaben ... zurückgibt. Ein Label wird „IModel.getOb- final IModel input1 = Model.of(“default1“); ject()“ erst bei seiner Darstellung aufrufen. final IModel input2 = Model.of(“default2“); Gleichzeitig werden Eingaben via „IModel. Form testForm = new Form(“testForm“) { setObject(Object)“ entgegengenommen. @Override protected void onSubmit() { Dieses simple Interface hat gleich mehrere System.out.println(“Input1 “+input1.getObject()); Vorteile. System.out.println(“Input2 “+input2.getObject()); Der wichtigste ist, dass das Laden von } Daten entspannt erfolgt. Daten werden nur }; dann abgerufen, wenn sie tatsächlich not- TextField inputField1 = new TextField(“inputField1”, input1); TextField inputField2 = new TextField(“inputField2”, input2); wendig sind, und der entsprechende Aufruf geschieht zum Zeitpunkt der Verwendung. add(testForm Der zweite Vorteil liegt in der Möglichkeit, .add(inputField1) Modelle zu verketten. Listing 4 zeigt dieses .add(inputField2) Konzept. Das „userModel“ greift auf einen ); Service zu, um eine bestimmte User-Entität } } zu laden. Das „passwordField“ verwendet ein „PropertyModel“, das eine „Property- Listing 1: HomePage.java Expression“ benutzt, um selbige am verket- teten User-Model zu finden. Das „getObject“ ... liefert hier den String aus der „password“- Aspekt dieses Konstrukts ist aber die voll-
ständige Trennung der Beschaffung von Daten und ihrer Verwendung. Eine Kompo-
nente weiß nur, was sie mit einer Entität ma- Listing 2: HomePage.html chen soll, jedoch nicht, woher sie kommt. Der letzte Bestandteil des Komponen- se „Component.java“, neben ihr liegen im und der DOM-Tree äquivalent. Die Bezie- tisierungs-Konzepts sind die sogenannten Klassenpfad die zugehörige Template-Da- hung zwischen Java und HTML wird dabei „Behaviors“. Diese erlauben es, eine Kom- tei „Component.html“ und ihre Properties durch das XML-Attribut „wicket:id“ herge- ponente dynamisch um zusätzliche Funk- „Component.properties“. Die Vorteile die- stellt. tionen zu erweitern. So können AJAX- ses Konstrukts liegen auf der Hand: Alle Dieses wird durch die Verwendung des Funktionalitäten, Event-Verhalten oder das Bestandteile einer Komponente befinden entsprechenden Namespace im HTML-Tag Markup ergänzt werden. Am besten lässt sich an der gleichen Stelle im Klassenpfad bereitgestellt: „“. Daneben gibt es eine Das beste Web-Framework ist heutzu- Vielzahl weiterer Tags und Attribute, die tage nur so viel wert wie seine AJAX-Inte- Komponenten-Baum und DOM-Tree den Rahmen dieses Artikels sprengen wür- gration. Im Falle von Wicket ist diese voll- Der eingangs erwähnte Quickstart ent- den. Viel wichtiger ist es zu verstehen, was kommen transparent. In den allermeisten hält eine simple Startseite in „HomePage. hierdurch erreicht wird. Wicket-Templates Fällen wird man sich mit den JavaScript- java“, die im Folgenden um ein Formular beschreiben nur, was der Java-Code mit Details der AJAX-Interaktion nicht ausein- erweitert wird. Hierzu ergänzt man die be- ihnen tun soll. andersetzen müssen. Es wird zum natürli- stehende Klasse um den Code in Listing 1. chen Teil der Entwicklung. Gleichzeitig ist auch das zugehörige Mar- IModel Wer beispielsweise seine Komponente kup-Template in „HomePahe.html“ zu er- Auch die schönste Komponente muss ir- um die Möglichkeit eines automatischen gänzen (siehe Listing 2). gendwann Daten mit der Welt austauschen. Submit nach einer Eingabe erweitern will, Was sofort auffällt, ist die entstehende Wicket setzt auf ein simples, aber effektives Baum-Struktur. Im Java-Code werden der Konzept, um diese vom Service-Layer zu public interface IModel extends IDetachable Page eine Form-Komponente samt ihrer entkoppeln. Schlüssel dazu ist das „IModel“- { zwei Eingabefelder hinzugefügt und im Interface (siehe Listing 3). T getObject(); void setObject(final T object); DOM-Tree entsprechend ein „form“- und Jede Komponente hat im Normal- } zwei von ihm eingeschlossene „input“-Tags. fall einen Konstruktor der Form „public Somit sind der Wicket-Komponenten-Baum Label(final String id, IModel model“. Listing 3: IModelJava aktuell 3-2013 | 41 Wicket
muss nichts weiter tun, als das entsprechen- IModel userModel = new LoadableDetachableModel() { de Behavior hinzuzufügen. In Listing 5 wird @Override für diesen Zweck das von Wicket mitgeliefer- protected User load() { te „AjaxFormSubmitBehavior“ verwendet. return userService.loadUserById(1); Einzig das JavaScript-Event, auf das die } }; Komponente reagieren soll, wird dem Be- TextField passwordField = new TextField(“passwordField“, new PropertyModel< havior übergeben. Schon kann auf der Kon- String>(userModel, “password“)); sole beobachtet werden, wie „Form.onSub- mit()“ aus Listing 1 ausgeführt wird, sobald Listing 4: IModel-Chaining man Text im entsprechenden Eingabefeld eingibt. Das Ganze erfolgt ohne Neuladen der Seite. Dank der Wicket-AJAX-Biblio- add(testForm add(inputField1.add(new AjaxFormSubmitBehavior(“change“) { thek, die vollständig auf JQuery aufgebaut })) ist, wird nur der Inhalt des Formulars an add(inputField2) den Server gesendet. ); Natürlich hat Wicket noch mehr zu bie- ten. So lassen sich Komponenten mithilfe Listing 5: AJAX-Self Submit des „AjaxSelfUpdatingTimerBehavior“ zyk- lisch neu rendern oder via „AjaxEventBe- add(new Label(„input1Label“, input1) { havior“ um eine serverseitige Reaktion auf @Override beliebige JavaScript-Events erweitern. Das public void onEvent(IEvent event) { funktioniert alles ohne eine Zeile JavaScript. if(event.getPayload() instanceof AjaxRequestTarget) { ((AjaxRequestTarget)event.getPayload()).add(this); In Verbindung mit Events wird es aber erst } richtig spannend. } }); Events Komponenten existieren nicht um ih- Listing 6: Update mit Default Event rer selbst willen. An bestimmten Punkten wird man mit dem Rest des Komponen- content tenbaums kommunizieren müssen. In frü- heren Wicket-Versionen (<=1.4) war dies Listing 7: Update mit Default Event Markup per Default nur via Callbacks möglich. Je nach Tiefe des Komponentenbaums konn- public class TestHomePage { te dies zu extrem komplexen Konstrukten private WicketTester tester; führen, da man gezwungen war, ein Call- back vom Ursprung bis zum Verwender @Before durchzureichen. Bald fingen Entwickler an, public void setUp() { nach Alternativen zu suchen. tester = new WicketTester(new WicketApplication()); Mit Wicket 1.5 wurde dann endlich ein } moderner EventBus eingeführt. Jede Kom- ponente implementiert seither die Schnitt- @Test public void homepageRendersSuccessfully() stellen „IEventSource“ und „IEventSink“ und { kann Nachrichten senden und empfangen. tester.startPage(HomePage.class); Die so erzielte lose Kopplung erleichtert so- tester.assertRenderedPage(HomePage.class); wohl die Verwendung als auch die Wieder- } } verwendung von Komponenten. Gleichzei- tig wird der benötigte Boiler-Plate-Code auf Listing 8: Wicket-extensions ein erträgliches Maß reduziert. Ein gutes Beispiel für diesen Event-Me- trägt die Daten in einem Ajax-Request zum den Aufruf von „add“ hinzu, wird als Teil der chanismus ist „Ajax Default Event“. Neh- Server. Wicket erzeugt nun ein Objekt vom AJAX-Antwort gerendert und dann an den men wir das Beispiel von vorhin und fügen Typ „AjaxRequestTarget“, das als Event an Browser zurückgeschickt. im „HomePage“-Konstruktor den Code aus alle Komponenten im Baum der aktuellen Listing 6 hinzu. Das Markup wird um die Seite geschickt wird. Auch das neu hinzu- Unit-Tests Zeile in Listing 7 ergänzt. gefügte Label wird via „onEvent“ informiert Es gibt wohl kaum einen Bereich des TDD, Bei einer Eingabe in „inputField1“ löst und entscheidet sich, an diesem Request der so lange vernachlässigt wurde wie das unser Behavior einen Submit aus und über- teilzunehmen. Es fügt sich selbst durch Testen der UI. Diese sind sehr schwer zu
42 |
iii iii iiiiii www.ijug.eu
vollständigen Onlinebanking. Seine starke @Test Ausrichtung an objektorientierten Prinzi- public void checkContentAfterSubmit() { tester.startPage(HomePage.class); pien erleichtert vor allem erfahrenen Java- FormTester formTester = tester.newFormTester(“testForm“); Entwicklern den Einstieg. formTester.setValue(“inputField1“,“test“); Erwähnt seien auch die kurzen Reakti- formTester.submit(); onszeiten, wenn es um Issues/Exploits geht. assertEquals(“test“, formTester.getTextComponentValue(“inputField1“)); Gepaart mit einer starken Community und } dem Support älterer Versionen erledigen sich auch die Bedenken vieler Architekten Listing 9: Formulartest hinsichtlich seiner Zukunftssicherheit. Zu- dem gibt es noch verschiedene Aspekte nen eigenen Unit-Test für unser Formular der Anwendungsentwicklung mit Wicket von zuvor (siehe Listing 9). wie die interessanten Themen „Leicht les- org.apache.wicket wicket-extensions Der „WicketTester“ kapselt verschiedene bare Stacktraces“, „Markup-Vererbung“ oder ${wicket.version} Helper-Funktionen im sogenannten „Form- „Verwaltung von Ressourcen wie CSS und Tester“. Nachdem man diesen erzeugt hat, JavaScript“ (siehe auch http://code.goog- können Eingabefelder befüllt oder das For- le.com/p/wicket-guide). Listing 10: Wicket-Extensions mular abgeschickt werden. Mit dem pas- senden „assertEquals“ überprüfen wir dann, Jochen Mader testen und in vielen Fällen musste man ob der eingegebene Wert auch im Model [email protected] sich bisher der Hilfe von Tools wie Seleni- angekommen ist. Mittlerweile ist der Autor twitter:@codepitbull um bedienen, um überhaupt einen gewis- dazu übergegangen, seine Komponenten sen Grad automatisierter Tests bereitstel- fast vollständig ohne den Einsatz des Brow- len zu können. Natürlich ist Selenium ein sers zu entwickeln. Die Zeitersparnis ist be- großartiges Tool, für Unit-Tests ist es aber trächtlich. denkbar ungeeignet. Wicket nahm sich die- ses Problems an, indem es das einzige Hin- Basis-Komponenten derniss zu echten Unit-Tests aus dem Weg Wicket bietet einen sehr umfangreichen räumte: den Servlet-Container. Satz an Basis-Komponenten, von Formula- Beim Blick in die Wicket-Quellen fällt ren über Labels bis hin zu Buttons. Durch auf, dass man mittlerweile so gut wie keine das Einbinden der „wicket-extensions“-De- direkten Abhängigkeiten zum Servlet-API pendency in der „pom.xml“ (siehe Listing Jochen Mader ist als Chief Developer bei der Senacor Technologies hat. Da Wicket auch die komplette Request- 10) erhält man Zugriff auf weitere, deutlich AG tätig, wo er sich seit mehreren Jahren mit der Entwicklung und Optimierung von anspruchsvollen Web-Anwendungen auf Verarbeitung über einen Filter an Wicket- komplexere Komponenten wie fortge- der JVM beschäftigt. eigene Klassen delegiert, gibt es hier eine schrittene Tabellen mit Paging-Unterstüt- Sollbruchstelle. Es war möglich, Kompo- zung („DefaultDataTable“) oder Wizards. Unsere Inserenten nenten mit einigen kleinen Tricks komplett Darüber hinaus gibt es eine ganze Rei- außerhalb eines Containers zu verwenden. he spezialisierter Komponenten, die einen aformatik Training und Consulting S. 3 Die notwendigen Tricks sind im „WicketTes- automatischen „NoScript“-Fallback liefern. GmbH & Co. KG, ter“ zusammengefasst, der das Rückgrat Dies sind notwendig, da es tatsächlich User www.aformatik.de der Test-Unterstützung bildet. Natürlich gibt, die JavaScript deaktivieren oder Geräte Java Usergroup Stuttgart S. 18 gibt es auch für dessen Verwendung ein ohne selbiges nutzen. Es soll auch vorkom- www.java-forum-stuttgart.de entsprechendes Beispiel im Quickstart. In men, dass Entwickler zur Unterstützung „TestHomePage.java“ (siehe Listing 8) findet von IE6 gezwungen sind. Für alle diese Fälle DOAG e.V. S. 36 sich ein Beispiel für den grundlegendsten gibt es Komponenten wie „AjaxFallbackBut- www.doag.org aller Komponenten-Tests, den Render-Test. ton“ oder „AjaxFallbackDefaultDataTable“. Der „homepagerenderSuccessfully“-Test Diese degenerieren im „NoScript“-Fall auto- DOAG e.V. S. 48 stellt sicher, dass unsere „HomePage“ feh- matisch zu entsprechenden Alternativen. www.doag.org lerfrei gerendert wird. Dafür wird sie im Somit lassen sich auch Anforderungen wie DOAG e.V. U2 „WicketTester“ gestartet und am Ende das die Zugänglichkeit der Anwendung leicht www.doag.org gerenderte Ergebnis überprüft. Dies hört umsetzen. sich simpel an, verhindert aber bereits vie- iJUG e.V. U3 le zeitintensive Compile-Deploy-Browser- Fazit www.ijug.eu Roundtrips. Darüber hinaus steckt noch Das Unternehmen des Autors setzt Wicket viel mehr drin, als dieses einfache Beispiel in einer Vielzahl verschiedener Projekte ein, Trivadis GmbH, U4 hergibt. Deshalb erweitern wir es um ei- von Intranet-Anwendungen bis hin zum www.trivadis.com
Java aktuell 3-2013 | 43 Inhalt
„Java ist Grundlage für meine Software-Projekte …“
Usergroups bieten vielfältige Möglichkeiten zum Erfahrungsaustausch und zur Wissensvermittlung unter den Java-Entwicklern. Wolfgang Taschner, Chefredakteur von Java aktuell, sprach darüber mit Dirk Dittert von der Java User Group Erlangen-Nürnberg.
Wie ist die JUG Nürnberg organisiert? Wie sollte sich Java weiterentwickeln? Dittert: Wir sind Mitglied im Interessenver- Dittert: Java wird oft vorgeworfen, dass die Dittert: Eine aktive Community ist für mich bund der Java User Groups e.V. (iJUG). Intern Syntax sehr ausschweifend ist und die ei- bei jeder Technologie-Entscheidung ein sind wir hingegen eher lose organisiert. Es gentlichen Programm-Strukturen versteckt. wichtiges Kriterium. Nur so kann man si- ist also keine Vereinsmitgliedschaft notwen- Hier sollte Java von anderen Sprachen wie cherstellen, dass die Anforderungen aus dig, um an unseren Treffen teilzunehmen. beispielsweise Scala lernen und uns Ent- der Praxis wirklich zur Weiterentwicklung wicklern mehr Schreibarbeit abnehmen. der verwendeten Technologien führen Was zeichnet die JUG Erlangen-Nürnberg aus? Die für Java 8 geplanten Closures sind ein und man nicht auf Luftschlösser setzt. Die- Dittert: Unsere Speaker und unsere Teilneh- erster Schritt in die Richtige Richtung. Aber ser Aspekt ist jedoch nicht nur für die Com- mer bei den Treffen motivieren mich stark, auch die Typinferenz bei der Variablen-De- munity wichtig, sondern bringt auch für mich dort einzubringen. Der Erfahrungs- klaration würde Java gut bekommen. Oracle Vorteile: Software wie Spring, Scala, austausch unter den Mitgliedern steht im Modularisierung ist ein wichtiges Thema IntelliJ IDEA, Yourkit oder JRebel erlauben Mittelpunkt. Das Java-Ökosystem ist so bei großen Systemen. Die momentan ver- effizientes und komfortables Arbeiten – vielfältig, dass eine einzelne Person unmög- fügbaren Sichtbarkeiten gehen mir hier nicht wie kaum auf einer anderen Plattform. lich den Überblick über all die spannenden weit genug. Ich halte es hier aber für wesent- Weiterentwicklungen behalten kann. Ich lich wichtiger, sich endlich auf eine allgemein Wie sollte sich die Community gegenüber möchte durch unsere Treffen dazu beitra- akzeptierte Technologie zur Modularisierung Oracle verhalten? gen, dieses Wissen in der Region zu ver- auf der Java-Plattform zu einigen, als das Dittert: Die Community sehe ich als aktives breiten und so die Community zu stärken. JDK selbst zu modularisieren. Und wenn ich Sprachrohr gegenüber Oracle. Es ist unse- schon am wünschen bin: Es wäre schön, end- re Aufgabe, unsere Wünsche und Anforde- Wie viele Veranstaltungen gibt es pro Jahr? lich mal das komplette JDK in einem einheit- rungen aus dem täglichen Arbeitsalltag in Dittert: Wir treffen uns eimal im Monat. lichem Stil neu zu formatieren. gebündelter Form weiterzugeben.
Was bedeutet Java für dich? Wie sollte Oracle deiner Meinung nach mit Dirk Dittert Dittert: Java ist die Grundlage für meine Java umgehen? [email protected] Software-Projekte und darüner hinaus die Dittert: Oracle sollte die Entwicklungen Plattform mit dem besten Tool-Support. anderer Sprachen genau beobachten und Diese Programmiersprache begleitet mich innovative Konzepte, die zu Java passen, seit vielen Jahren ständig. dann integrieren. Mir ist eine nachhaltige Weiterentwicklung wesentlich wichtiger, Was hast du bei der Übernahme von Sun als sofort auf alle Hype-Themen aufzusprin- durch Oracle empfunden? gen oder gar die Sprache Java aufgrund von Dittert: Unter der Führung von Sun hat kurzfristigen Überlegungen zu verbiegen. sich ein aktives Ökosystem um die Sprache Bei den Technologien sehe ich Oracle Java und den zugehörigen Technologien eher in einer integrierenden Position. Vie- herausgebildet. Anfangs hatte ich Beden- le innovative Konzepte kommen aus der ken, ob unter Oracle die Offenheit der Community. Hier wünsche ich mir, dass Zur Person: Dirk Dittert Java-Plattform leiden würde. Diese wurden Oracle diese Bemühungen aktiv unter- Wie entwickle ich Software richtig? jedoch durch die kontinuierliche Weiterent- stützt und zügig die nötigen Grundlangen Diese Frage steht bei ihm seit den ers- wicklung und der klaren Kommunikation – in der Plattform schafft. Ein Beispiel hierfür ten Programmier-Erfahrungen im Mit- wie der Release-Pläne des JDK – vollständig ist die Unterstützung von „invokedynamic“, telpunkt. Dirk Dittert ist seit JDK 1.2 in ausgeräumt. Ich hatte aber auch von An- das gerade bei den dynamischen Program- der Java Community aktiv. Für seine fang an die Hoffnung, dass die Übernahme miersprachen Performance-Vorteile bringt. Firma berät er verschiedene Kunden frischen Wind in die Entwicklung des JDK in den Bereichen „Software-Architek- bringen würde. Es ist nun an Oracle, dies Welchen Stellenwert besitzt die Java-Com- tur“ und „Test Driven Development“. durch regelmäßige Releases zu beweisen. munity für dich?
44 |
iii iii iiiiii www.ijug.eu
Nachgefragt …
Uwe Sauerbrei, emmert CONSULTING + partner
Die Umbrella AG hat eine Expansion in den internationalen Markt beschlossen. Das brandneue Produkt, der europäische Rettungsschirm, soll, auf Wunsch des Geschäftsführers, mit einer modernen Workflow- Software entwickelt werden. Die Wahl fiel hierbei auf Atlassians Jira. Inzwischen sind die Vorbereitungen in vollem Gange und die Entwicklungsabteilung ist vollauf mit der Planung des Prototyps beschäftigt.
Nachdem in einer ersten Gesprächs- und bei unserem Gespräch über die Masken ler hat sein Notebook angeschlossen und auf Evaluierungsrunde das Pro und Kontra be- und Felder, dass man hier die Sichtbarkeit der Leinwand ist der Browser zu sehen. sprochen wurde (siehe Ausgabe 01/2013), konfigurieren könnte und auch die Verbin- Müller: Kollegen, lassen Sie uns gleich steht die Entscheidung fest, einen ersten dung zu den Vorgängen einstellbar ist. Ich einsteigen. Jira ist ein formularbasiertes Prototyp mit Jira zu implementieren. Dazu hatte bisher noch nicht die Zeit, mir das System. Es lebt davon, dass Felder gefüllt wurden exemplarisch die zukünftigen Vor- im Detail anzuschauen. Meine Mitarbeiter und beim Durchlaufen des Workflows ak- gänge definiert und die dazugehörigen möchten nun implementieren, haben aber tualisiert werden. Jira bringt von Haus aus Workflows entwickelt. Während der Ge- noch einige Fragen und vielleicht könnten eine ganze Menge „globaler Felder“ mit schäftsführer von einer Gewinn-Maximie- Sie etwas Zeit erübrigen, die Zusammen- (siehe Abbildung 1). In dem nachfolgen- rung träumt und keinen Zweifel hat, dass hänge aufzuzeigen? den Screenshot sind das beispielsweise seine Mitarbeiter das Projekt stemmen wer- Müller: Das muss Ihnen nicht unangenehm der „Type“, der den Namen des Vorgangs den, klopft es an der Tür des Projektleiters sein. Wir sollten keine Zeit verlieren, trom- anzeigt, der „Status“, der den aktuellen Erwin Müller, dem die Organisation und meln Sie Ihre Leute zusammen! „Standort“ im Workflow wiedergibt, und Umsetzung auferlegt wurde. Ein paar Stunden später ist der Schulungs- die „Resolution“, die eine Lösungsmenge Müller: Ja, herein! raum gut gefüllt, der Beamer läuft, Herr Mül- definiert. Der Entwicklungsleiter, der gegen den Ein- satz der neuen Software die meisten Beden- ken geäußert hatte, aber überstimmt wurde, betritt das Büro. Müller: Ach, was verschafft mir denn die Ehre, Sie in meinem Büro begrüßen zu dürfen? Entwicklungsleiter: Nun ja, es ist mir auch etwas unangenehm. Aber Sie erwähnten Abbildung 1: Beispiel für globale Felder
Java aktuell 3-2013 | 45 Projekt-Management
Müller: Das ist grundsätzlich richtig. Aber • Konstruktion Create Screen gesetzt den Fall, wir haben zwei Vorgänge: • Konstruktion Edit Screen Konstruktion und Wartung. Beide haben • Konstruktion View Screen Formulare mit vielen Feldern und unter- scheiden sich im Feld „Dienstleister“. In der Diese Masken werden nun den entspre- Wartung wird das Feld angezeigt und ist chenden Aktionen „Create“ und „Edit View“ ein Pflichtfeld, in der Konstruktion ist es zugeordnet, wobei man hier auch einen Abbildung 2: Beispiel für Feldtypen ausgeblendet und optional. Natürlich kön- Default-Screen vereinbaren kann. Ich habe nen wir jedem Vorgang eine eigene Maske das mal in einer Grafik skizziert (siehe Ab- Von diesen Feldern gibt es eine ganze spendieren. Aber noch einfacher ist es, für bildung 5). Reihe, die man sich einfach mal in Ruhe an- beide Vorgänge die gleiche Ansicht zu nut- Jeder Aktion wird nun eine eigene Bild- schauen sollte. Reichen diese Felder nicht zen und mittels einer speziellen „Field Con- schirmmaske zugeordnet. Diese kann nun aus, kann man sich auch eigene definieren, figuration“ die überzähligen Felder auszu- jeweils individuell konfiguriert werden. sogenannte „Custom Fields“. Dafür steht blenden. Vereinfacht könnte man sagen, Das bedeutet, wir können einzelne Felder eine Vielzahl von Feldtypen zur Verfügung, man macht bestimmte Eigenschaften der entfernen und hinzufügen. Jetzt müssen wie man auf diesem kleinen Ausschnitt er- Felder „Name“, „Sichtbarkeit“, „Pflichtfeld“ wir jedoch noch vereinbaren, welcher Vor- ahnen kann (siehe Abbildung 2). und „Renderer“ abhängig vom aktuellen gang mit dieser Kombination an Screens Diese Felder können nun auf einem Vorgang (siehe Abbildung 4). verbunden werden soll. Dafür gibt es Screen angeordnet werden. Einschrän- Entwicklungsleiter: „Renderer“? dann die sogenannten „Issue Type Screen kend muss ich jedoch hinzufügen, dass es Müller: Für mehrzeilige Textfelder kann ein Schemes“. Sie assoziieren auf der nächs- die Möglichkeit gibt, „Reiter“ hinzuzufü- sogenannter „Wiki-Renderer“ gesetzt sein, ten übergeordneten Ebene die Vorgänge gen, jedoch können die Felder, außer in ih- der es erlaubt, den Inhalt mit Wiki-Syntax (Issues) mit den „Screen Schemes“. Das rer Reihenfolge, nicht positioniert werden. auszuzeichnen. Auf gut deutsch: Sie kön- hört sich alles ein wenig kompliziert an, ist Anonymer Zwischenrufer: Was ist mit nen dort Überschriften und Tabellen einfü- es auch. Hier kann ich nur empfehlen, es Pflichtfeldern? gen, Listen generieren, Abschnitte unter- einfach auszuprobieren. Müller: Kann man definieren. Damit be- streichen etc. Ich erläutere dass nochmal am Beispiel treten wir jetzt das weite Feld der Konfigu- Anonymer Zwischenrufer: Angenommen der Konstruktion. Das Feld der Betriebs- rationen. Speziell handelt es sich hier um ich möchte beim Anlegen eines Vorgangs mittelnummer wird nur dem Create- und „Field Configurations“. Wie für alle Konfigu- Schlüssel vergeben, die ich danach nicht dem View-Screen zugeordnet. Damit wird rationen gibt es hier eine Default-Einstel- mehr ändern darf. Kann ich diese Felder es beim Anlegen einmal zur Verfügung ge- lung (siehe Abbildung 3). schützen? stellt – sollte dort auch ein Pflichtfeld sein Wenn wir das Feld „Description“ be- Müller: Also, wenn es hier um einen – und dann nur noch in der View zur An- trachten, so befindet sich das Feld auch Schreibschutz geht, den gibt es von Haus zeige gebracht. Eine weitere Änderung ist auf dem Default Screen. Wir können nun aus nicht. Das heißt allerdings nicht, dass nun nicht mehr möglich. festlegen, ob das Feld ein Pflichtfeld sein es dafür keine Lösung gibt. Entwicklungsleiter: Man muss sich offen- soll, indem wir diese Funktion mit „requi- Anonymer Zwischenrufer: Ein Schema? sichtlich einige Gedanken im Vorfeld ma- red“ aktivieren. Damit wird geprüft, ob das Müller: Genau, „Screen Schemes“. Das Prin- chen. Feld einen Wert enthält, bevor die Daten zip ist recht einfach. Wir nehmen eine fer- Müller: Allerdings! gespeichert werden können. tige Maske, sagen wir für die Konstruktion, Entwicklungsleiter: Wir haben bisher noch Anonymer Zwischenrufer: Was bedeutet kopieren sie dreimal und benennen sie fol- nicht darüber gesprochen, wie die Work- „hide“? Wenn ich ein Feld nicht sehen will, gendermaßen: flows da hineinspielen. Ich würde mal ver- kann ich es doch einfach löschen? muten, es wird noch komplexer? Müller: Ich fürchte, ja. Aber sie bieten auch eine Menge weiterer Möglichkeiten. Entwicklungsleiter: Aha, ist das für uns Abbildung 3: Default Field Configuration relevant? Was ich damit sagen will, sollten wir uns in diesem Rahmen auch damit nä- her beschäftigen? Müller: Auf jeden Fall. Entwicklungsleiter: Seufzt. Fahren Sie fort. Müller: Was ist ein Workflow? In erster Linie geht es um Zustandsänderungen, die ein Vorgang durchlebt. Jira bringt von Haus aus einen Standard-Workflow mit. Grund- sätzlich kann er sofort verwendet werden, Abbildung 4: Field Configuration Scheme aber das ist jetzt gar nicht der Punkt, auf
46 |
iii iii iiiiii www.ijug.eu
• In der Softwareentwicklung kann ein Re- view von Code-Änderungen erzwungen werden. • Es kann ein bestimmter Inhalt von Fel- dern (Stati, Versionen etc.) abgefragt werden.
Eigene Erweiterungen sind mit Skripten möglich, in denen beispielsweise ganz spezifische JQL-Abfragen getätigt werden können. Um Ihren Fragen zuvorzukommen, JQL ist das Mittel der Wahl, eigene Filter und Reports zu definieren.
Validators Abbildung 5: Screen Scheme Validatoren sind recht schnell erklärt und in- tuitiv einsetzbar. Wie der Name bereits sagt, können Felder inhaltlich geprüft werden. Schlägt so eine Prüfung fehl, erscheint eine Fehlermeldung, die genau darauf hinweist. Das ist ziemlich praktisch in einer Situation, in der ein Feld nur für diesen Übergang „re- quired“ ist. Man kann hier beliebige Felder prüfen lassen. Sonst gibt es noch: Abbildung 6: Workflow Transition Möglichkeit, Scripting einzusetzen. Darü- • Felder können miteinander verglichen ber können wir uns später mal unterhalten. werden So, hier mal ein kurzer Abriss, was wir hier • Der übergeordnete Vorgang muss sich alles machen können (siehe Abbildung 7). in einem speziellen Status befinden, womit auch Abhängigkeiten zwischen Conditions Haupt- und Subtasks verifiziert werden Ich muss zugeben, dass sich mir die Con- können. ditions rein praktisch nicht so recht er- • Natürlich spielen auch Berechtigungen schließen. Es ist möglich, hier Prüfungen der Anwender und Skripte eine große zu definieren, die den Übergang in einen Rolle. Gerade hier existieren eine Reihe anderen Status sozusagen freischalten. vorgefertigter Groovy-Snippets, die ei- Konkret bedeutet das: Ist eine Bedingung nen kleinen Eindruck davon vermitteln, Abbildung 7: Schaltzentrale der Transition- nicht erfüllt, steht die Schaltfläche für den was alles in diesem Bereich möglich ist. Funktionen Übergang erst gar nicht zur Verfügung. Ich Dass würde allerdings den heutigen habe allerdings keine Möglichkeit gefun- Rahmen sprengen. Ich muss auch zuge- den es mir ankommt. Einen Workflow im den, wie man die Information darüber, was ben, dass ich das noch nicht bis in die grafischen Editor anzupassen, ist trivial. genau fehlt, dem Anwender vermittelt. Es letzte Tiefe ausgelotet habe. Ich bevorzuge allerdings die Text-Variante, kann also passieren, dass man keine Ah- die mir etwas übersichtlicher und robuster nung hat, warum es nicht weitergeht. Hier ist das Template, das beliebig erweitert erscheint. Anonymer Zwischenrufer: Was kann hier werden kann (siehe Abbildung 8). Übrigens Den Wechsel von einem Zustand in ei- überhaupt geprüft werden? ist das Forum von Atlassian sehr aktiv und nen anderen nennt man eine „Transition“. Müller: Die Bandbreite ist ziemlich groß, aber hier findet man eine Vielzahl von Beispielen, Ich habe das am Beispiel der Statuswerte es gibt hier schon ein paar Schwerpunkte: wie solche Anfragen aussehen können. „Eingang“ und „In Bearbeitung“ aufgezeich- net (siehe Abbildung 6). Als Bedingung für • Prüfung von Berechtigungen. Beispiels- Post Functions einen Übergang lassen sich „Conditions“ weise dürfen nur der Bearbeiter oder der In vielen amerikanischen Serien gibt es ja definieren. Darüber hinaus gibt es „Validie- Reporter den Statuswechsel vornehmen. Sweeper-Teams, die das Chaos aufräumen, rungen“ und „Post Functions“. Wir können hier nun an der Oberflä- che kratzen. Für alle Bedingungen gibt es sowohl zusätzliche Plug-ins als auch die Abbildung 8: Einfache Groovy-Abfrage
Java aktuell 3-2013 | 47 Projekt-Management
das die SWAT-Teams hinterlassen haben. So sehr flexible Art und Weise „Notifications“ ich auf Sie zählen, wenn wir im weiteren ähnlich ist das mit den „Post Functions“. Sie in speziellen Situationen zu senden, die Verlauf des Projekts an Grenzen stoßen? sind das „Mädchen für alles“ und hier kann durch das allgemeine „Notification“-Kon- Müller: Ja, natürlich. man all das erledigen, was auf direktem zept nicht abgedeckt sind. Entwicklungsleiter: Ausgezeichnet, danke! Wege nicht so ohne Weiteres möglich ist. Nachdem der Entwicklungsleiter den Raum Grundsätzlich sind bereits einige Funk- Anonymer Zwischenrufer: Das hört sich verlassen hat, bleiben nur noch der anonyme tionen vordefiniert. Interessant ist hier be- alles nach „Eitel Sonnenschein“ an. Da lauert Zwischenrufer und Müller zurück. sonders auch der „Update Change“, der als doch bestimmt noch irgendwo ein „Aber“? Anonymer Zwischenrufer: Na Herr Mül- Zeitstempel für das Erreichen eigener Mei- Müller: Na ja, es gibt da schon ein paar ler, wie war ich? lensteine verwendet werden kann. Auch Einschränkungen. Ein großes Problem Müller: Es hat tatsächlich funktioniert! Ich hier kann ich nur eine Idee der sehr um- ist die Dokumentation. Wie halte ich alle hatte befürchtet, dass Sie meine Handschrift fangreichen Funktionalität vermitteln: Entscheidungen fest, die im Vorfeld der auf dem Fragenzettel nicht lesen könnten. Konfiguration für das Projekt und später Es musste halt alles ziemlich schnellgehen. • Die nachgelagerten Aktionen erlauben während der Implementierung getroffen Wir sind ein gutes Team, vielen Dank! es uns, Feldwerte zwischen Haupt- und werden? Auch bedingen sich manche Ab- Unteraufgaben zu synchronisieren. Das hängigkeiten und führen zu seltsamen Ef- Literatur/Web hat den Charme, dass eine Unteraufga- fekten, in denen Felder mal nicht sichtbar [1] http://www.atlassian.com/software/jira/over- view be relevante Daten von ihrer überge- sind oder als erforderlich angemahnt, aber [2] https://answers.atlassian.com/ ordneten Aufgabe übernehmen kann, gar nicht in der Maske enthalten sind. Zu- ohne dass der Anwender sie erneut ein- meist lässt sich das mit einer gründlichen Uwe Sauerbrei geben muss. Analyse beheben. Auch sind klare Grenzen [email protected] • Mit der Transition kann eine Zuweisung im „Look & Feel“ gesetzt, was schnell zum der Verantwortlichkeit automatisiert Frust führen kann, wenn die Bildschirm- werden. Beispielsweise gibt es für einen seite einfach nicht gut aussieht. Es ist halt bestimmten Status immer eine Rolle, sehr wichtig, sich intensiv mit dem System die hier verantwortlich zeichnet. zu beschäftigen und damit zu arbeiten, • Werte für eigene und Standard-Felder und bei Fragen stehe ich natürlich immer können gesetzt werden. Angenommen, gerne zur Verfügung. Wenn es keine wei- der Vorgang soll abgebrochen werden, teren Fragen gibt, bedanke mich für Ihre dann kann die „Resolution“ automatisch Aufmerksamkeit! durch das System zugewiesen werden. Entwicklungsleiter: Herr Müller, ich bin • In den Post Functions finden wir die um- beeindruckt, wie schnell Sie sich in dieses Uwe Sauerbrei arbeitete als Berater/Entwickler in den Branchen fangreichsten Skripting-Funktionen über- Thema eingearbeitet haben und auf jede Telekommunikation, Automotive, Logistik und Luftfahrt. 2006 haupt. Sie ermöglichen es uns auch, auf Frage eine fundierte Antwort haben. Darf gründete er die „emmert CONSULTING + partner“.
Berliner Expertenseminare • Wissensvertiefung für Oracle-Anwender • Mit ausgewählten Schulungspartnern • Von Experten für Experten
11./12. Juni 2013 3./4. September 2013 Engineering Oracle for Performance Oracle EM12c Monitoring mit Dr. Günter Unbescheid mit Bernhard Wesely
18./19. September 2013 14./15. Oktober 2013 Oracle Solaris 11 SOA Suite Fehlerbehandlung mit Heiko Stein mit Markus Lohn
www.doag.org
48 |
iii iii iiiiii www.ijug.eu
Fernbedienung verbunden mit Raspberry Pi
Den Rollladen steuern mit Pi
René Jahn, SIB Visions GmbH
Die Steuerung von Rollläden kann heutzutage bequem per Fernbedienung oder durch eine zentrale Steuereinheit erfolgen. Der Einsatz von zentralen Steuereinheiten automatisiert wunderbar alltägliche Abläufe wie zeitgesteuertes Öffnen und Schließen. Doch nicht jeder Haushalt mit elektronischen Rollläden besitzt auch eine zentrale Steuereinheit, denn diese sind meist recht teuer und erfüllen äußerst selten die gewünschten Anforderungen. Wer auf keine Funktion verzichten möchte und schon immer von einer eigenen Rollladensteuerung träumte, findet hier eine Anleitung.
Wer bisher seine Rollläden mit einer Fern- Es gibt auch praktische Erweiterungen, Empfängern der Rollläden. Es sollte also bedienung steuert, wird folgende Proble- etwa für die tageslichtabhängige Steue- ausreichen, diese Signale aufzuzeichnen, me nur allzu gut kennen. Man fährt in den rung oder spezielle Smartphone Apps. um sie später wieder senden zu können. Urlaub und lässt die Rollläden entweder un- Doch selbst damit gibt es Einschränkun- Dazu wären nur ein Sender für Funksig- ten, oben oder einen Spalt geöffnet, damit gen und als Software-Entwickler möchte nale und ein Oszilloskop erforderlich, die Pflanzen auch etwas Licht bekommen. man ja auf keinen Komfort verzichten. Vor um die Signale aufzuzeichnen. Natürlich Im Idealfall kümmert sich eine Nachbarin allem nicht, wenn man es selbst besser muss man die richtigen Signale am Ende um das Problem, doch die optimale Lö- machen könnte. Genau hier beginnt es noch softwaretechnisch erzeugen. Doch sung ist das nicht. Es kann aber auch schon spannend zu werden, denn wir entwickeln so einfach und günstig, wie sich der Au- einmal vorkommen, dass ganz einfach einfach unsere eigene zentrale Steuerein- tor das vorgestellt hatte, war es nicht. Es vergessen wurde, die Rollläden zu schlie- heit, die noch dazu kostengünstig ist. war schon nicht möglich, einen geeigne- ßen, weil die Zeit etwas knapp war. Man Das Ziel ist klar definiert: Wir wollen ten Sender für die benötigte Frequenz zu bemerkt das üblicherweise erst, wenn es unsere Rollläden per SMS öffnen oder organisieren, ohne gleich eine komplette zu spät ist. In diesem Fall wäre es natürlich schließen. Um das zu realisieren, benö- Schaltung zu bauen. wünschenswert, die Rollläden irgendwie tigen wir jedoch mehr als nur ein Stück Weil das Ganze auch ohne notwendiges runterfahren zu können. Ohne zentrale Software. Denn irgendwie müssen wir die Expertenwissen nicht umsetzbar gewesen Steuereinheit lassen sich die Probleme je- Rollläden auch ansteuern. Doch welche wäre, musste eine andere und vor allem ein- doch nicht lösen. Denn nur damit kann fest- Hardware kann das? Es scheint ja eigent- fache Lösung her. Am einfachsten erschien gelegt werden, wann die Rollläden hoch- lich ganz trivial zu sein, denn eine Fernbe- es, Software-gesteuert einen Tastendruck oder runterfahren. dienung schickt bestimmte Signale zu den auf der Fernbedienung durchzuführen. Die
Java aktuell 3-2013 | 49 Raspberry Pi
Um einen Stromkreis zu schließen reicht Der Raspberry Pi es aus, einen Schalter umzulegen, und ge- Spätestens seit der JavaOne 2012 sind Em- nau das ist die Aufgabe von Relais. Somit bedded Devices in aller Munde. Allen vor- war dieses Problem gelöst und es fehlte an der Raspberry Pi. Ein kreditkartengroßer nur noch eine Lösung für die Ansteuerung Computer mit ausreichend Rechenpower von Relais. Eine übliche Lösung wäre der und allen notwendigen Schnittstellen wie Einsatz einer seriellen Schnittstelle (RS232) USB, LAN und HDMI. Auf der Konferenz oder eines „USB zu RS232“-Adapters. Für wurde jedoch vor allem die Verwendbarkeit Abbildung 1: Fernbedienung mit aufgesetzter die Ansteuerung der seriellen Schnittstelle von JavaFX auf Embedded Devices hervor- Taster-Steuerung existiert mit RxTx [1] eine praxiserprobte gehoben. Das beeindruckte einerseits und Open-Source-Lösung. Bei seriellen Schnitt- verhalf andererseits JavaFX zu mehr Akzep- Fernbedienung war sowieso schon vorhan- stellen kommt jedoch schnell der Gedan- tanz. Seit diesem Event haben JavaFX und den und so musste nur überlegt werden, wie ke hoch, dass ein Notebook oder Desktop der Raspberry Pi auch den Autor in ihren eine Taste gedrückt werden konnte und vor PC notwendig ist. Die Lösung sollte aber Bann gezogen. allem, wodurch? Dieses Problem war relativ auf keinen Fall mehr Strom verbrauchen Aus diesem Grund war auch für die Roll- leicht lösbar, da jede Taste auf der Fernbe- als unbedingt nötig, daher musste eine ladensteuerung ein Raspberry Pi (RasPi) als dienung lediglich einen Stromkreis schließt. schlanke Alternative her. Hardware gesetzt. Ein großer Vorteil war
public static void main(String[] pArgs) throws Exception SerialModemGateway modem; { modem = new SerialModemGateway( System.out.println(“== GPIO control Test ==“); “modem“, “/dev/ttyUSB0“, 115200, “Cinterion“, “EGS3“); GpioController gpio = GpioFactory.getInstance(); modem.setSimPin(“0000“); GpioPinDigitalOutput pinDown; modem.setInbound(true); GpioPinDigitalOutput pinUp; modem.setSmscNumber(““); GpioPinDigitalOutput pinStop; Service serv = Service.getInstance(); pinDown = gpio.provisionDigitalOutputPin( serv.addGateway(modem); RaspiPin.GPIO_01, “Down“, PinState.LOW); serv.startService(); pinUp = gpio.provisionDigitalOutputPin( RaspiPin.GPIO_02, “Up“, PinState.LOW); //check incoming messages pinStop = gpio.provisionDigitalOutputPin( List msgList = new ArrayList(); RaspiPin.GPIO_03, “Stop“, PinState.LOW); Service.getInstance().readMessages(msgList, System.out.println(“--> GPIO down ON“); InboundMessage.MessageClasses.ALL); pinDown.high(); String sText; Thread.sleep(1000); for (InboundMessage msg : msgList) pinDown.low(); { System.out.println(“--> GPIO down OFF“); sText = msg.getText(); Thread.sleep(5000); System.out.println(“--> GPIO up ON“); if (“UP“.equalsIgnoreCase(sText)) pinUp.high(); { Thread.sleep(1000); up(); pinUp.low(); } System.out.println(“--> GPIO up OFF“); else if (“DOWN“.equalsIgnoreCase(sText)) Thread.sleep(5000); { System.out.println(“--> GPIO down ON“); down(); pinDown.high(); } Thread.sleep(1000); } pinDown.low(); serv.stopService(); System.out.println(“--> GPIO down OFF“); Thread.sleep(2000); System.out.println(“--> GPIO stop ON“); Listing 2 pinStop.high(); Thread.sleep(1000); pinStop.low(); System.out.println(“--> GPIO stop OFF“); GPIO Pin Funktion Thread.sleep(5000); System.out.println(“--> GPIO down ON“); 1 AB pinDown.high(); Thread.sleep(1000); pinDown.low(); 2 AUF System.out.println(“--> GPIO down OFF“); } 3 STOPP
Listing 1 Tabelle 1
50 |
iii iii iiiiii www.ijug.eu
auch, dass der RasPi problemlos mit dem Erfahrungsbericht USB-Port eines WLAN-Routers betrieben Die beschriebene Lösung steuert Rolllä- werden kann. Der Stromverbrauch ist mini- den des Autors seit Beginn des Jahres im mal. Zudem besitzt der RasPi mit den GPIO- 7x24-Betrieb und hat bereits den ersten Pins eine sehr gute Möglichkeit, digitale Urlaub erfolgreich gemeistert. Natürlich Signale zu schalten. Die serielle Schnittstel- wurden zahlreiche Erweiterungen inte le beziehungsweise ein USB-Port musste griert, etwa das Setzen der Öffnungs- und somit nicht belegt werden, um die Relais Schließzeiten per SMS, das Ein-/Ausschal- anzusteuern. Nachdem alle Hardware-Pro- ten der automatischen Steuerung, ein Wo- bleme für die Rollladensteuerung gelöst chenendmodus etc. Zusätzlich wurde eine waren, wurde mit etwas Geschick und ei- JavaFX-Applikation zur Steuerung umge- nem Lötkolben die Hardware zusammen- setzt (siehe Abbildung 3). gesetzt (siehe Abbildung 1). Aufgrund der integrierten Effektmög- Als Relais kamen G6L-1P (3V) von Om- lichkeiten von JavaFX war die Umsetzung ron zum Einsatz und für die Verbindung Abbildung 3: JavaFX-Applikation zur Steuerung des Bewegungsablaufes ein Leichtes und mit dem RasPi wurde ein USB-Port aufge- die App bewegt den Rollladen zeitgleich lötet. Für die Steuerung von „Auf“, „Ab“ und den Zugriff auf die GPIO-Pins mit einem zur Realität. „Stopp“ wurde je ein Relais verbaut. Ein einfachen API bietet. Das Testprogramm USB-Kabel stellte abschließend die Verbin- prüft, ob die Rollläden nach unten bezie- Fazit dung zum RasPi her. Das Praktische an der hungsweise oben gefahren und gestoppt Die Entwicklung der Lösung bereitete gro- Lösung ist, dass die Fernbedienung auch werden können. Es setzt eine definierte ßen Spaß, da gerade das Zusammenspiel weiterhin manuell bedient werden kann. GPIO-Pin-Belegung voraus (siehe Tabel- von Hard- und Software ein spannendes le 1). Abbildung 2 zeigt die vollständige Thema war. Vor allem die Verwendung des Die Software-Ansteuerung GPIO-Pin-Belegung, angepasst an die Ver- RasPi brachte enorme Zufriedenheit und Die Hardware ist eine sehr wichtige Kom- wendung mit Pi4J. bietet tolle Möglichkeiten zur (Heim-) Auto- ponente für die Steuerung. Doch ohne pas- Die größten Hürden sind überwunden matisierung zu einem unschlagbaren Preis. sende Software funktioniert auch unsere und die Steuerung der Rollläden kann be- Lösung nicht. Der erste Test erfolgt mithilfe reits durch unsere Software erfolgen. Ein Links eines Java-Programms (siehe Listing 1). entscheidender Punkt fehlt allerdings noch: [1] RxTx: http://rxtx.qbang.org [2] JDK8 Early Access: http://jdk8.java.net/fxarm- Zur Ausführung am RasPi ist ein Java- Wir wollten SMS-Nachrichten für die Be- preview/index.html Runtime-Environment für ARM-Prozessoren dienung einsetzen. Damit unsere Software [3] Pi4J: http://www.pi4j.com erforderlich. Das kann eine JavaSE-Embed- SMS verarbeiten kann, ist weitere Hardware [4] SMSLib: http://smslib.org/doc/compatibility ded-Version oder auch die JDK8-Early- notwendig. Es eignen sich sowohl Mobil- Access-Version [2] mit Hard-Float-Unter- telefone mit integriertem Modem als auch stützung sein. Zusätzlich wird die Open- spezielle GSM-Module, wie sie beispielswei- Source Bibliothek „Pi4J” [3] benötigt, die se Cinterion anbietet. Es sollte jedoch dar- René Jahn auf geachtet werden, dass die eingesetzte [email protected] Java-Bibliothek etwa mit „SMSLib” [4] die GSM-Hardware unterstützt. Die GSM-Hardware wird über eine seri- elle Schnittstelle (RS232) oder einen „USB zu RS232”-Adapter angeschlossen. Die An- steuerung mit Java erfolgt unter Verwen- dung von SMSLib (siehe Listing 2). Je nachdem, welche GSM-Hardware zum Einsatz kommt, kann es zu Problemen bei der Kommunikation kommen. In unserem Fall mussten zusätzliche System-Properties gesetzt sein, damit die Hardware mit dem RasPi funktionierte: “-Dsmslib.serial.polling -Dsmslib.at.wait=500 -Dsmslib.nocops=1”-. René Jahn ist Mitbegründer der SIB Visions GmbH und Head of Research & Development. Er verfügt über langjährige Erfahrung Das definierte Ziel ist damit erreicht. im Bereich der Framework- und API-Entwicklung. Sein Interes- Auch wenn es sich noch nicht um eine senschwerpunkt liegt auf der Integration von State-of-the-Art- vollständige Applikation handelt, sollte es Technologien in klassische Business-Applikationen. Unter anderem nicht sehr schwierig sein, die einzelnen Tei- betreut er die Open-Source-Sparte bei SIB Visions und veröffent- Abbildung 2: Raspberry Pi (Model B), GPIO für Pi4J le zusammenzusetzen. licht regelmäßig Artikel im Unternehmensblog.
Java aktuell 3-2013 | 51 Oracle ADF
ADF Essentials Mobile – Ein unlösbares Problem?
Markus Klenke, TEAM GmbH
Anwendungsentwicklung für mobile Endgeräte ist für Oracle in den letzten Jahren immer weiter in den Vordergrund gerückt. Mit der jüngsten Version des Oracle JDevelopers sind zum ersten Mal die neuen ADF-Mobile-Komponenten verfügbar.
Um auch ohne große Lizenzkosten die Vor- Speicher, um persönliche Einstellungen des dad-JSF-Oberflächen-Elemente auf. In den züge der ADF-Entwicklung kennenzuler- Benutzers abzulegen. Viele der ADF-spezifi- nächsten Abschnitten wird der Aufbau der nen, hat Oracle zusätzlich ADF Essentials schen Ausprägungen der oben genannten vorliegenden Applikation als Beispiel für veröffentlicht, eine Version von ADF, die Funktionalitäten sind aus den ADF Essen- ähnlich gelagerte, mobile Entwicklungs- auch auf lizenzkostenfreien Servern wie tials herausgenommen. Dazu zählen zum vorhaben vorgestellt. dem GlassFish 3.1 aufgespielt werden darf. Beispiel: Im gleichen Atemzug, in dem die mobi- Gibt es einen Entwicklungsfahrplan? len ADF-Komponenten von Oracle ange- • Oracle ADF Security Wie bei der Entwicklung einer typischen kündigt wurden, wurde jedoch bekannt • Oracle ADF Web Service Data Control ADF-Applikation wurde auch beim iConf- gegeben, dass die mobilen Anteile in den • Oracle Meta Data Storage Guide das Augenmerk sehr stark auf den Essentials nicht enthalten sind. Bedeutet • Oracle Business Component Service In- Anwendungsfluss und die Benutzer-Navi- das: „Keine mobile ADF-Entwicklung für terfaces gation gelegt. Durch die begrenzte Ober- kleinere Unternehmen?“ • Oracle Remote ADF Task Flow Call fläche auf mobilen Geräten hat man auf TEAM sagt „Nein!“. Auch ohne die ADF- Features wie „Partial Page Refresh“ oder Mobile-Elemente war es schon möglich, Durch Java-Herkunft und den durchgän- aufwändiges Layouting verzichtet. Daher mobile Anwendungen in ADF zu erstellen. gigen Einsatz des MVC-Design-Patterns waren Komponenten wie „ADF Bounded Anhand des TEAM iConfGuide, mit dem im ADF Framework ist es jedoch möglich, Task Flows“ und Oberflächen-Elemente wie Besucher der DOAG-Konferenz ihr eigenes diese Komponenten durch Open-Source- „ADF-Regionen“ erforderlich. Man konnte Konferenzprogramm zusammenstellen und Elemente zu ersetzen. So kann statt der ADF mit dem gegebenen Java-Server-Faces- verwalten können, stellt der Artikel einige Security beispielsweise ein individuelles Controller-Standard arbeiten, da dieser die interessante Konzepte und Möglichkeiten Security HTTP Servlet zusammen mit einer notwendigen Java Bean Scopes („session“ vor, wie ADF-Entwicklung für Mobilgeräte Benutzer-JavaBean eingebunden werden, und „request“) bereitstellt. So kann mit auch ohne die ADF-Mobile-Komponenten um User-Management für die Applikation aussehen kann. bereitzustellen.
ADF Essentials? Nie gehört. Die Theorie klingt überzeugend Grob formuliert könnte man sagen, dass in Nachfolgend wird der iConfGuide von ADF Essentials die Basics von ADF enthal- TEAM als Anschauungsmaterial für die Ent- ten sind. Das impliziert Oracle-Elemente wicklung einer mobilen ADF-Applikation wie ADF Business Components, den ADF ohne ADF-Mobile-Komponenten und mit Model Layer, ADF Task Flows sowie mehr den genannten optionalen Austauschmög- als 150 Komponenten aus den ADF Faces. lichkeiten betrachtet. Der iConfGuide (siehe Letztere erweitern den Java-Standard der Abbildung 1) ist seit 2010 für die unter- Java Server Faces. Somit können mit den Es- schiedlichen DOAG-Konferenzen im Einsatz. sentials viele Übungsapplikationen erstellt Die Applikation ermöglicht es den Benut- werden, beispielsweise aus dem Oracle-by- zern, einfach und schnell auf die Informa- Example-Bereich. Um allerdings eine pro- tionen der Aussteller sowie auf die Termine duktiv einsetzbare Applikation zu erstellen, der Vorträge zugreifen zu können und sich bedarf es weiterer Funktionalitäten. Dazu diese als Favoriten markiert zu speichern. gehören Sicherungskomponenten für eine Im Kern ist die Applikation über ADF Anwendung, die Bereitstellung von Schnitt- Business Components an eine Oracle-Da- stellen für zusätzliche Datenquellen und tenbank angebunden. Sie benutzt das ADF Komponenten wie Web-Services oder Busi- Model und setzt dann auf das allgemeine ness Intelligence, aber auch ein Metadaten- JSF Controlling und die allgemeinen Trini- Abbildung 1: Ausstellerauswahl im iConfGuide
52 |
iii iii iiiiii www.ijug.eu
gerade einmal drei verschiedenen Kom- nutzer seine Favoriten anschauen, so wird Applikation sich perfekt in das Look and ponenten der gesamte Applikationsfluss über einen gesetzten Cookie eine User ID Feel des iPhones integrieren lässt. Die heuti- dargestellt und der Benutzer auf einfache, ausgelesen, die als Suchwert in einer Fa- gen ADF-Mobile-Komponenten werden im visuelle Art und Weise durch die Anwen- voriten-Tabelle der Datenbank fungiert. Ist JSF-Rendering-Prozess automatisch auf den dung geführt werden. Das Navigations- dieser Cookie nicht gesetzt, wird ein neuer jeweiligen Browser optimiert und ein Groß- verhalten der Applikation kann also rein angelegt (siehe Listing 1). teil vorgegebener Skins liegt im JDeveloper deklarativ über einen Graphen dargestellt Über diese ID lassen sich weitere Funk- als Erweiterungsgrundlage vor. In unserem werden (siehe Abbildung 2), wobei von tionalitäten wie Mehrsprachigkeit oder ein Fall wurde zu Beginn der Entwicklungspha- jeder Seite über einen einfachen String- benutzerabhängiges Tracing realisieren. So- se über einen Styleguide festgelegt, welche Aufruf ein anliegender Navigationsfall ein- fern der Benutzer diesen Cookie speichert, Trinidad-Komponenten für die Entwicklung geleitet werden kann. ist ihm über die gesamte Zeitspanne der genutzt werden, und daraufhin ein CSS- Da in den ADF Essentials das Benutzen DOAG-Konferenz ein eindeutiger Benutzer Sheet entworfen, das den Ansprüchen und mancher Komponenten der Task Flows zugewiesen. Auf diese Weise können die den Anforderungen genügt. (wie zum Beispiel das Aufrufen externer für die Applikation wichtigen Elemente, wie Durch die kontinuierliche Weiterent- Task Flows) untersagt ist, stellt die Nutzung die favorisierten Vorträge, ohne den Oracle wicklung der mobilen Systeme, deren des allgemeinen JSF Controllers anstelle Meta Data Storage gespeichert werden. jeweiliger Betriebssysteme und Browser des ADF Controllers eine sehr simple, aber Für weitere Updates der Software und wurden weitere Stylesheets notwendig, dennoch effiziente und übersichtliche Me- für eventuelle Security-Implementierungen um jeden Benutzer zu bedienen. Um die thode dar, den Controller Layer einer even- lassen sich in die ADF- und Trinidad-Mobile- Größe der einzelnen Stylesheets übersicht- tuell komplexen Applikation zu entwerfen. Komponenten natürlich auch Erweiterun- lich zu halten, bietet es sich an, eine Skin gen im HTML5-Kontext einbinden. So kann Family für Mobile-orientierte Anwendun- Das Handy als Schlüssel für Metadaten-Speicher die in den ADF Essentials fehlende ADF Se- gen bereitzustellen. So lassen sich auf Ba- Der ursprüngliche Ansatz, dem Benutzer curity beispielsweise auch über die schon sis einer Default-mobile.css-Erweiterung Individualisierungen in der Applikation genannte HTTP Security, eine Web-Socket- Sheets für die jeweiligen Browser erstellen. zu ermöglichen, beruhte auf dem Oracle Verbindung und den Handshake, der den Über einen HTTP Servlet Request, der wie- Meta Data Storage (MDS) und der An- Client mit dem Server bekannt macht, er- derum durch den Java-Server-Faces-Kon- meldung des Benutzers via HTTP Servlet. setzt werden und über einen Session-ge- text der Anwendung gestellt wird, kann er- Wegen der hohen Anzahl der unterschied- bundenen Schlüssel eine Autorisierung des fragt werden, welcher Browser vom System lichen Nutzer, der früheren Instabilität Benutzers in der Applikation stattfinden. genutzt wird und wo das jeweilige .css-File des Oracle MDS und des umständlichen für die Anwendung geladen werden kann, Anmeldevorgangs per Handy wurde nach Das Rote oder das Grüne? um somit das gewünschte Look and Feel einer anderen Lösung für die favorisierten Die erste Version des iConfGuide wurde, bereitzustellen (siehe Listing 2). Einstellungen des Benutzers gesucht. Als wie man dem Namen vielleicht entneh- Da hier auf reinen Trinidad-Komponen- eine bequeme Möglichkeit bietet sich der men kann, für die Benutzung auf dem ten gearbeitet wird, ohne auf den ADF- Einsatz von Cookies an. Möchte der Be- iPhone optimiert. Gefordert war, dass die Standard zuzugreifen, sind die Regularien
Abbildung 2: Navigationsstruktur des iConfGuide mithilfe von JSF Controlling
Java aktuell 3-2013 | 53 Oracle ADF
String getUser() Skin getPhoneBrowser() { { FacesContext fc = FacesContext.getCurrentInstance(); if cookieFound{ HttpServletRequest req = cookieValue = getCookie(USERID_COOKIE_NAME); (HttpServletRequest)fc.getExternalContext().getRequest(); } String agent = req.getHeader(“User-Agent“); else{ Skin skin; cookieValue = getRequest().getSession().getID(); if (agent != null && agent.indexOf(“iPhone“) > -1) { addCookie(USERID_COOKIE_NAME, skin = Skin.IPHONE_SKIN; cookieValue,ID_COOKIE_MAXTIME); } } else if (…) return cookieValue; {….} } }
Listing 1 Listing 2
von ADF Essentials weiter erfüllt. Somit darf Vorteil, wenn es sich bei den zugrunde lie- jede dieser Komponenten. Dadurch, dass die Applikation auf einem lizenzkostenfrei- genden Technologien um Oracle-Produkte die Einschränkungen jeweils nur die ein- en Server gestellt und betrieben werden. (Oracle-Datenbank, WebLogic-Server) han- zubindenden Elemente betreffen, nicht delt, da in dem Framework der Übergang aber die Schnittstellen oder die Abstrak- ADF Essentials vs. Open Source der einzelnen Schichten so einfach wie tionsebenen selbst, kann man die Stärke Wie man an den letzten drei Abschnitten er- möglich gemacht wird (siehe Abbildung 3). des Frameworks auch dann nutzen, wenn kennen kann, ist die Entwicklung von mo- Die ADF Business Components bieten beispielsweise die ADF-UI-Komponenten bilen ADF-Anwendungen auch zu bewerk- beispielsweise vor allem Entwicklern mit selbst (wie im Beispiel des iConfGuide) stelligen, wenn man nur die in den ADF viel Datenbank- beziehungsweise Forms- nicht genutzt werden, sondern eine alter- Essentials bereitgestellten Komponenten Erfahrung eine bekannte Schnittstelle. Die native Oberflächenlösung gewählt wurde. nutzt und weitere Open-Source-Elemente notwendigen ADF-View-Objekte werden hinzufügt. Das ADF Framework erlaubt mithilfe von SQL-Queries definiert und so Fazit einen fließenden Übergang zwischen ver- wird ein typischer Arbeitsablauf aus dem Oracle ADF ist ein flexibles Framework mit schiedenen Ausprägungen der Applikati- Datenbank- und Forms-Umfeld generell nur schier endlosen Variationsmöglichkeiten. onsschichten. Man kann sich allerdings die in eine andere Applikationsschicht verlegt. Als Einsteiger kann man von der reinen Frage stellen, wieso überhaupt auf das ADF Der ADF Model Layer bietet eine sehr hilf- Masse schnell überwältigt werden und Framework aufgesetzt wird. Die Entwick- reiche abstrakte Schnittstelle zu Datenan- diese Vielfalt kostet seinen Preis. Mithilfe lungen der Java-Standards wie EJB und JSF bietern, sodass auch ein optionaler Wechsel der ADF Essentials bietet Oracle nicht nur schreiten weiter voran und auch die Ent- an dieser Stelle einfach zu realisieren ist. eine Möglichkeit, sich einen Überblick wicklung geeigneter IDEs, um beispielswei- Darüber hinaus sind auch die ADF über Technologie und die Komponenten se deklarativ zu entwickeln, ist zu erkennen. Data Bindings sowie der ADF Controller zu verschaffen, sondern eine wirkliche Al- Zudem könnten manche der durch JSF- mit Open-Source-Elementen nutzbar und ternative für kleinere Unternehmen und Standards gelösten Problemstellungen mit bieten somit eine Schnittstelle für beliebig Entwicklungsteams, die bis dato vor den anderen Frameworks eleganter gelöst wer- erweiterbare Komponenten. Die ADF Es- Lizenzkosten eines WebLogic-Servers zu- den. Dennoch sind JDeveloper und ADF im sentials beinhalten, wie eingangs erwähnt, rückgeschreckt sind.
Markus Klenke [email protected]
Markus Klenke ist als Softwareentwickler spezialisiert auf die Ent- wicklung von Oracle-ADF-Anwendungen und Integrationsum- gebungen. Durch Framework-Kenntnis und eine mathematisch abstrakte Denkweise unterstützt er als Consultant Unternehmen Abbildung 3: MVC Pattern mit ADF-Komponenten bei der Migration von Oracle Forms zu ADF.
54 |
iii iii iiiiii www.ijug.eu
Performance-Falle beim Logging: die Zeitstempel- Formatierung
Jürgen Lampe, A:gon Solutions GmbH
Ein Beispiel aus dem Projektalltag zeigt, wie mit relativ geringen Kosten und kleinen Modifikationen einer sich abzeichnenden Überlast vorgebeugt werden kann. Beim Profiling wurden Laufzeit und Allokationsverhalten gleichwertig untersucht, um kritische Code-Bereiche zu identifizieren. Die Erfahrung, dass das Einsparen von Objekt-Erzeugungen die Gesamtleistung überproportional verbessern kann, wurde erneut bestätigt.
Irgendwann ist jede erfolgreiche Applika- laufenden Produktionsbetrieb sehr um- Ansatz kann dann darin bestehen, auf dem tion so gewachsen, dass ihre Performance fangreiche Logs geschrieben werden. Das Testsystem die JIT-Funktion zu deaktivieren, durch zunehmende Nutzung und Funk- für den Debug-Modus bekannte Anti-Pat- um auf diese Weise wenigstens die Aufruf- tionserweiterungen an Grenzen stößt. tern, das darauf hinweist, „log.debug(…)“- Hotspots zu identifizieren. Mit etwas Glück Wenn die relativ günstigen Möglichkeiten Anweisungen in ein „if(log.debugEnabled()) liefert eine anschließende Code-Inspektion zum Upgrade der Hardware ausgereizt {log.debug(…);}“ einzuschließen, war also der gefundenen Bereiche Ansatzpunkte sind, bleibt nichts anderes übrig, als das nicht anwendbar, weil es bereits beachtet für Optimierungen. Man sollte diesen Weg gesamte System einer kritischen Schwach- wurde und die Last durch Info-Level-Ausga- aber nur dann weiterverfolgen, wenn die stellen-Analyse zu unterziehen. ben verursacht wird, die nicht abgeschaltet erkannten Defizite wirklich gravierend sind In dem hier betrachteten Fall handelte es werden dürfen. und prinzipiell nicht durch die VM behoben sich um einen großen kommerziellen Appli- werden können. Ansonsten besteht die kationsserver mit rund hundert Anwendun- Performance-Messung große Gefahr, Zeit und Kraft in Arbeiten zu gen, der bereits auf einer sehr elaborierten Es ist ein bewährter Grundsatz, Code-Opti- stecken, deren Auswirkungen minimal sind Hardware lief. Wie so oft hatten sich die mierungen nur auf der Basis von Messun- – oder gleich null, wenn nämlich im Produk- Performance-Probleme schleichend entwi- gen vorzunehmen und den Erfolg ebenfalls tionsbetrieb eine gleichwertige Beschleuni- ckelt. Updates mit neuen Funktionen brach- durch Messungen zu verifizieren. Das ist gung durch die JIT-VM bereits erreicht wird. ten zusätzliche Belastungen, andererseits leichter gesagt als getan. Die heute übli- Im vorliegenden Fall wiesen die durch konnten durch Änderungen in der Konfigu- chen Prozessoren mit mehreren Kernen, Profiling gewonnenen Daten auf einen ration auch immer wieder Verbesserungen Berechnungs-Pipelines und hierarchischen Schwerpunkt bei der Aufbereitung der Log- erreicht werden, ohne allerdings den lang- Cache-Strukturen machen es nahezu un- Ereignisse hin, insbesondere bei der Forma- fristigen Trend zu höherer Systembelastung möglich, reproduzierbare Daten zu gewin- tierung, ohne jedoch klare Favoriten für dauerhaft zu brechen. nen. Java-Entwickler sehen sich einer weite- die weitere Analyse auszuweisen. Bei Beginn der Untersuchungen war be- ren Schwierigkeit gegenüber, die durch die reits bekannt, dass die sich abzeichnenden Just-in-time (JIT) kompilierenden virtuellen Objekt-Erzeugung analysieren Probleme mit hoher Wahrscheinlichkeit Maschinen (VM) verursacht wird. Die be- In dieser Situation half es, sich an Erfah- auch durch das Logging verursacht wurden. kannte HotSpot-VM führt außerdem Opti- rungen mit früheren Anwendungen, die Indikatoren für diese Vermutung waren: mierungen wie Inlining (Ersetzung durch unter Speicherplatznot litten, zu erin- Einkopieren) von Methoden-Aufrufen oder nern. Als überraschendes Ergebnis hatte • Eine beobachtete und mit der Server- Loop-Unrolling auf der Basis statistischer es sich dabei immer wieder gezeigt, dass last korrelierende Verzögerung bei der Daten aus, die nicht nur zu stark variieren- Verbesserungen der Speicherökonomie Ausgabe der Log-Ereignisse den Ausführungszeiten führen, sondern gleichzeitig das Laufzeitverhalten verbes- • Die Tatsache, dass Änderungen in der auch Profiler bei der Datengewinnung be- sern. Das ist ein gewisser Widerspruch zu Verwaltung der Log-Dateien (schnelle- einträchtigen, da beispielsweise einkopier- der einst verbreiteten Überzeugung, dass res Filesystem) bereits eine Verbesse- te Methoden-Aufrufe praktisch unsichtbar sich Speicherbedarf und Laufzeit antago- rung gebracht hatten werden. nistisch verhalten und somit die Verbes- Weitere Probleme ergeben sich, wenn serung des einen auf Kosten des anderen Aufgrund rechtlicher Bedingungen, die – wie häufig und auch im vorliegenden geht. Zumindest für Java-Programme gilt eine lückenlose Nachvollziehbarkeit aller Fall – das Profiling nicht direkt in der Pro- diese Regel nicht, was leicht erklärbar ist. relevanten Aktionen erfordern, müssen im duktionsumgebung möglich ist. Ein erster Erstens kostet die Objekt-Erzeugung Lauf-
Java aktuell 3-2013 | 55 Performance verbessern
zeit und ein Objekt kommt selten allein; public class FastDatePatternLayout extends PatternLayout { oft müssen weitere (Member-)Objekte er- public FastDatePatternLayout() { zeugt werden. Zweitens bedeuten mehr this(DEFAULT_CONVERSION_PATTERN); Objekte auch mehr Arbeit für den Garba- } ge-Collector (GC) – schon während ihrer public FastDatePatternLayout(String pattern) { Lebenszeit sind mehr erreichbare Objekte super(pattern); zu traversieren. Gleichzeitig wird der Heap } schneller gefüllt, was häufigere GC-Aktivi- täten verursacht. @Override Eine erfolgversprechende Strategie be- public PatternParser createPatternParser(String pattern) { steht deshalb darin, Hotspots der Objekt- if (pattern == null) { return new FastDatePatternParser(DEFAULT_CONVERSION_PATTERN); Erzeugung zu suchen. Das ist wesentlich } else { einfacher als die oben beschriebene direk- return new FastDatePatternParser(pattern); te Laufzeitanalyse, weil Hardware und VM } praktisch keinen Einfluss auf die Objekt- } Erzeugung nehmen. Sollten irgendwelche } //////////////////////////////////////////////////////////// kurzlebigen Objekte tatsächlich im Stack public class FastDatePatternParser extends PatternParser { angelegt werden und uns entgehen, so public FastDatePatternParser(String pattern) { wäre das eine begrüßenswerte Optimie- super(pattern); rung, aber für diese Analyse unerheblich. } Ein besonderes Augenmerk haben bei @Override protected void finalizeConverter(char c) { dieser Analyse String-Objekte verdient. if (c == ‚d‘) { Die bequeme Handhabung von Zeichen- String dateFormatStr= “yyyy-MM-dd HH:mm:ss,SSS“; ketten ist einer der großen Vorzüge von String dOpt= extractOption(); Java, hat andererseits jedoch ihren Preis. if (“ABSOLUTE“.equals(dOpt)) { Die Erzeugung von Strings erfordert, außer dateFormatStr= “HH:mm:ss,SSS“; } else if (“DATE“.equals(dOpt)) { bei Teilstrings, jeweils die Allokation eines dateFormatStr= “dd MMM yyyy HH:mm:ss,SSS“; internen „char“-Arrays sowie das Kopieren } else if (“ISO8601“.equals(dOpt)) { der Zeichen in dieses Feld. Letzteres ist eine } else if (dOpt != null) { Operation, deren Kosten mit der Länge des dateFormatStr= dOpt; Strings zunehmen. Unglücklicherweise } PatternConverter pc= FastDatePatternConverter(formattingInfo, dateFormatStr); enthalten zahllose Methoden-Signaturen new currentLiteral.setLength(0); String-Parameter, obwohl „CharSequence“ addConverter(pc); als Typ vollkommen ausreichend wäre. } else { super.finalizeConverter(c); Formatierung } Um auf das genannte Problem zurückzu- } private static class FastDatePatternConverter extends PatternConverter { kommen – auch die Durchsicht der Allo- final private String format; kations-Profile deutete auf hohe Last beim Formatieren des Zeitstempels der „Log- FastDatePatternConverter(FormattingInfo formattingInfo, String format) { gingEvents“ innerhalb des verwendeten super(formattingInfo); Log4j-Frameworks hin [1]. Wobei es hier this.format= format; } nicht um eine bestimmte Software geht, @Override sondern darum zu zeigen, welche Auswir- public String convert(LoggingEvent event) { kungen kleine, scheinbar belanglose Un- return CurrentDateProvider.formatTimeMillis( event.getTimeStamp(), format); terschiede haben können. } Um die Vermutung zu bestätigen, wur- } } de für die Formatierung des Zeitstempels spezieller Code benutzt. Die Installation Listing 1 eines eigenen Konverters ist recht einfach. Listing 1 zeigt die beiden benötigten Klas- Damit dieser Konverter verwendet wird, Das aktuelle Datum sen „FastDatePatternParser“ und „FastDa- muss er in die Konfiguration aufgenom- Wenn man die Aufbereitung eines Zeit- tePatternLayout“, die fast nur aus Verwal- men werden, zum Beispiel durch die fol- stempels betrachtet, ist leicht erkennbar, tungsaktionen bestehen. Die eigentliche genden Zeilen in der Datei „log4j.xml“ in- dass ein relativ großer Aufwand getrieben Funktion verbirgt sich ganz unten in der nerhalb eines Appender-Elements (siehe werden muss, um aus dem Millisekunden- Methode „convert“. Listing 2). Wert das immer wieder gleiche Tagesda-
56 |
iii iii iiiiii www.ijug.eu
bar reduziert und Verzögerungen zwischen „LoggingEvent“-Generierung und der Pro- tokollierung treten so gut wie nicht mehr auf. Mittlerweile ist dieser Fix über ein Jahr Listing 2 erfolgreich und völlig unauffällig im Einsatz. Damit hat sich erneut gezeigt, dass Spar- tum zu berechnen. Deshalb liegt es nahe, Convenience-Methoden, die beispiels- samkeit beim Erzeugen von Objekten einen zunächst dort anzusetzen. Im vorliegen- weise Instanzen des aktuellen Datums in deutlich über die unmittelbar betroffenen den Fall existierte mit der Klasse „Current- verschiedenen Formaten aus dem Cache Programmteile hinausgehenden positiven DateProvider“ bereits eine Lösung, da auch liefern. Außerdem wird beim Tageswech- Effekt hat. Die Verschlechterung der Code- an anderen Stellen das aktuelle Datum als sel jeweils eine neue Instanz angelegt – Dichte durch angepasstes Ausprogrammie- Zeichenkette, mal mit und mal ohne Uhr- die Implementierung dieser Aufgabe ist ren von eigentlich in Bibliotheks-Methoden zeit, häufig benötigt wird. unproblematisch, sodass hier auf ihre Dar- vorhandenen Funktionen konnte dabei auf Listing 3 zeigt die hier interessierenden stellung verzichtet wird. einen sehr kleinen und gut austestbaren Teile des Codes. Für den aktuellen Tag wird Bereich beschränkt werden („CurrentDate- jeweils eine Instanz angelegt, die die Milli- Ergebnis Provider“). Tatsächlich war dieser Code ja sekunden-Werte für den Tagesbeginn („in- Bei der Bewertung des Ergebnisses sind sogar schon vorhanden. tervalStart“) und das Tagesende („interval die Ausgangsbedingungen in Betracht zu End“ = Tagesbeginn des Folgetags) sowie ziehen. Da sie nach Erfahrungen des Au- Nachtrag die numerischen Zeichen des Datums („da- tors nicht untypisch sind, seien sie kurz Das bisher beschriebene Vorgehen zeigt teText“) enthält. Daneben wird aus der Ta- beschrieben. Die Entwicklung einschließ- die Arbeit im Projektalltag, wo es vorran- geslänge noch ein Indikator für die beiden lich der Entwickler- und Integrationstests gig darum geht, ein gestecktes Ziel mit be- Tage der Sommer-Winterzeit-Umschaltung erfolgt auf Standard-PCs. In Produktion schränktem Aufwand zu erreichen. Das ist bestimmt („isDSTswitchDay“ mit den mög- läuft die Anwendung auf gänzlich anderen gelungen, ohne dabei wissenschaftliche lichen Werten „-1“, „0“ und „+1“). Systemen bei einem externen Hoster. Die Standards bei Analyse und Ergebnisbe- Die Formatierung des Zeitstempels Überwachung der Leistung erfolgt anhand wertung einzuhalten. reduziert sich so auf das Kopieren des Da- regelmäßig gelieferter und vertraglich ver- Bei der Vorbereitung dieses Artikels tums. Lediglich die Uhrzeit muss noch je- einbarter Auswertungen der Logs. Daraus wurde deshalb versucht, die erwähnten Er- weils neu konvertiert werden. Das leisten lassen sich Hinweise auf kritische Punkte fahrungen und Heuristiken etwas besser zu wenige Ganzzahl-Operationen. Zugunsten gewinnen, ein zielgerichtetes Profiling begründen und den seinerzeit erzeugten der Performance wurden die möglichen unter Produktionsbedingungen ist jedoch Code kritisch zu inspizieren. Die Ergebnisse Formate auf rein numerische eingeschränkt. unmöglich. Natürlich sollen sich eventu- werden in diesem zweiten Teil präsentiert. Außerdem muss der Formatstring genauso ell abzeichnende Probleme so rechtzeitig Diese Form ist bewusst gewählt worden, um viele Zeichen enthalten wie das erwartete beseitigt werden, dass eine Eskalation, die hier die Teile der Analyse nachzuliefern, für Ergebnis. Für den Einsatz beim Logging er- andererseits wiederum die Voraussetzung die normalerweise leider meist die Zeit fehlt. gab sich daraus kein Hindernis. Die Metho- dafür wäre, den Hoster mit dem Profiling Im Folgenden werden vier Varianten der de ist wiedereintrittsfähig (re-entrant) und zu beauftragen, vermieden wird. Formatierung verglichen. Als Ausgangs- erzeugt beim Aufruf nur ein einziges Objekt In dieser Lage bleibt nur, auf der Basis punkt mit dem Namen „NORMAL“ dient die – das Ergebnis-Array. von Erfahrungen und Tests auf den Ent- Implementierung, die jeden Zeitstempel Eine weitere Verbesserung für das Log- wicklungs- beziehungsweise Test-Syste- mithilfe von „java.text.SimpleDateFormat“ ging wäre eventuell dadurch zu erreichen, men nach Verbesserungen zu suchen. Mit aufbereitet. Das ist die Log4j-Standard-Im- dass „CurrentDateProvider“ um eine Me- dieser Strategie wurde das beschriebene plementierung, wenn im „ConversionPat- thode ohne Format-Parameter ergänzt wird, Logging-Problem angegangen. Die vorge- tern“ explizit ein Muster für die Zeitstem- die nur das im Log benötigte Format liefert. stellten Veränderungen zeigten sowohl im pel-Formatierung angegeben wird, „%d“ Anmerkung: In der Praxis wird dies fast nie Performance- als auch im Speicher-Profiling also nicht allein steht, sondern etwa in der geändert, weil es Änderungen an den Skrip- sichtbare Ergebnisse und wurden demzu- Form „%d{dd.MM.yyyy}“. ten zur Auswertung etc. zur Folge hätte. folge in die Produktion übernommen. Solch Unter dem Namen „FAST“ wird die Allerdings kann die Anzahl der erzeug- ein Schritt ist immer mit einem gewissen Ri- oben beschriebene Variante betrachtet. ten Objekte dadurch nicht mehr reduziert siko verbunden. Allerdings war angesichts Aufgrund der erläuterten speziellen Im- werden und die zu erwartende minima- der Tatsache, dass die Anzahlen der auszu- plementierung ist es dabei unerheblich, in le Beschleunigung dürfte den Aufwand führenden Bytecode-Instruktionen und der welcher Form das Format spezifiziert wird. kaum rechtfertigen. Bei einer Neuimple- erzeugten Objekte verringert wurden, zu- Bei genauem Lesen der Log4j-API-Do- mentierung sollte dieser Ansatz aber in mindest keine Verschlechterung zu erwar- kumentation findet sich ein wichtiger Hin- Erwägung gezogen werden. ten. Tatsächlich sind die Auswirkungen auf weis: „For better results it is recommended Über den hier gezeigten Code hinaus die Gesamtanwendung noch erfreulicher to use the log4j date formatters. These enthält diese Klasse noch eine Reihe von als erwartet. Die Serverlast hat sich mess- can be specified using one of the strings
Java aktuell 3-2013 | 57 Performance verbessern
„ABSOLUTE“, „DATE“ and „ISO8601“…” [2]. /** Tagesgrenzen */ private final long intervalStart, intervalEnd; Da das ISO8601-Format dem teilweise vor /** Cache fuer das aktuelle Datum in der Form ddMMyyyy */ der Optimierung verwendeten entspricht private final char[] dateText = new char[8]; (es ist das Default-Muster, wenn „%d“ al- lein steht), wurde die entsprechende Kon- protected final char[] formatToCharArrayIntern(long time, String format) { if (time < intervalEnd && time >= intervalStart) { vertierung als ISO8601 in den Vergleich int millisecs= (int) (time - intervalStart); aufgenommen. Der zugehörige Konverter if (isDSTswitchDay != 0) { hält nicht nur den Datumsteil des forma- if (isDSTswitchDay < 0 && millisecs > 7200000L) { millisecs+= 3600000L; tierten Zeitstempels in einem Cache vom } else if (isDSTswitchDay > 0 && millisecs > 10800000L) { Typ „char[ ]“, sondern alle Zeichen außer millisecs-= 3600000L; den Sekundenbruchteilen, die bei jedem } Aufruf neu konvertiert werden. Zusammen } char[] charArray= format.toCharArray(); mit den Zeichen steht der dazugehörige int yearCount= 0; Sekundenwert im Cache, um entscheiden int monthCount= 0; zu können, wann eine neue Konvertierung int dayCount= 0; des vorgehaltenen Teils notwendig ist. int hours= millisecs / 3600000; millisecs%= 3600000; Diese Arbeitsweise ist für die Forma- int minutes= millisecs / 60000; tierung sehr schnell aufeinanderfolgender millisecs%= 60000; Zeitstempel günstig, verliert ihre Vorteile int secs= millisecs / 1000; int millis= millisecs % 1000; aber, wenn die Zeitstempel ungeordnet sind oder nur wenige pro Sekunde vorlie- char[] dateAsText= dateText; gen. Nebenbei bemerkt, ergab ein kleine for (int i= 0, len= charArray.length; i < len; i++) { (nichtrepräsentative) Umfrage, dass unter switch (charArray[i]) { case ‘y’: den Log4j-Anwendern vielen unbekannt if (yearCount < 2) { ist, dass zwischen den Formaten „%d“ be- charArray[i]= dateAsText[6 + yearCount++]; ziehungsweise „%d{ISO8601}“ einerseits } else if (yearCount++ == 2) { und „%d{yyyy-MM-dd HH:mm:ss,SSS}“ charArray[i - 2]= dateAsText[4]; charArray[i - 1]= dateAsText[5]; andererseits ein erheblicher Performance- charArray[i]= dateAsText[6]; Unterschied besteht. Anmerkung: Im vorlie- } else { genden Projekt kamen diese Formen eben- charArray[i]= dateAsText[7]; } falls vermischt zur Anwendung. Bisweilen break; ist Optimierung schon durch die Auswahl case ‘M‘: der richtigen Schreibweise möglich. charArray[i]= dateAsText[2 + monthCount++]; Die abschließende vierte Variante break; case ‘d‘: „FAST2“ kann wegen Zugriffs-Restriktionen charArray[i]= dateAsText[0 + dayCount++]; nicht vollständig realisiert werden. Mit ihr break; soll der Einfluss untersucht werden, den case ‘H‘: das Einsparen von String-Objekten hat. charArray[i]= (char) (‘0‘ + hours / 10); hours= hours % 10 * 10; Dafür wird ein weiterer „PatternConverter“ break; definiert, der diesmal die „format“-Metho- case ‘m‘: de von „org.apache.log4j.helpers.Pattern- charArray[i]= (char) (‘0‘ + minutes / 10); minutes= minutes % 10 * 10; Converter“ überschreibt. Im Wesentlichen break; wird in dieser Methode die in Listing 1 zu case ‘s‘: findende „convert“-Methode aufgerufen charArray[i]= (char) (‘0‘ + secs / 10); und deren Ergebnis-String in einen „String- secs= secs % 10 * 10; break; Buffer“ kopiert. Listing 4 zeigt die geänder- case ‘S‘: te Methode. Die erste auskommentierte charArray[i]= (char) (‘0‘ + millis / 100); Zeile wurde durch die nachfolgende neue millis= millis % 100 * 10; break; ersetzt. Die zweite auskommentierte Zeile default: müsste angepasst werden, wird für den Test } aber nicht benötigt. } Die aufgerufene statische Methode return charArray; } else return null; „CurrentDateProvider.formatTimeMillisTo- } Chars“ kapselt den Code für das Ermitteln der aktuellen Instanz des Providers und Listing 3 ruft deren „formatToCharArrayIntern“-
58 |
iii iii iiiiii www.ijug.eu
Methode (siehe Listing 3) auf. Durch das @Override direkte Kopieren des „char“-Arrays in den public void format(StringBuffer sbuf, LoggingEvent e) { „StringBuffer“ wird pro Aufruf ein String ein- // String s = convert(e); wird ersetzt durch gespart. Anmerkung: Diese Optimierung ist char[] s = CurrentDateProvider.formatTimeMillisToChars(e.getTimeStamp(), format); if (s == null) { generell anwendbar, praktisch aber leider if (0 < min) { mit einigem Aufwand verbunden, da die spacePad(sbuf, min); für die Konfiguration des „PatternConver- } ter“ verwendete Klasse „FormattingInfo“ return; „package-private“ ist. } int len = s.length; if (len > max) { Einfache Messung // sbuf.append(s.substring(len - max)); Auf die Problematik der Performance- } else if (len < min) { Messung mit modernen Prozessoren und if (leftAlign) { VM wurde bereits hingewiesen. Alle Mes- sbuf.append(s); spacePad(sbuf, min - len); sungen sind auf einem PC mit Intel 7-2600 } else { CPU/3.40 GHz, 16 GB Hauptspeicher und spacePad(sbuf, min - len); HotSpot-64-Bit-Server-VM (1.6.0_31) aus- sbuf.append(s); geführt. Tabelle 1 zeigt repräsentative Er- } gebnisse für jeweils vier aufeinanderfol- } else { sbuf.append(s); gende Formatierungen von „LogEvents“, } gemessen mit „System.nanoTime()“. Bei den } ersten drei Aufrufen wird der gleiche Event verwendet, beim vierten ein solcher mit Listing 4 einem um mehr als eine Sekunde abwei- chenden Zeitstempel. version instances B ns linear runtime Die Ergebnisse sind wenig überra- NORMAL 9,00 504 903 ======schend. Die Dauer des ersten Aufrufs wird FAST 7,00 408 431 ======durch das Laden und Initialisieren der Klas- ISO860 9,00 504 536 ======sen bestimmt. Da die Varianten von oben FAST2 5,00 312 425 ======nach unten und in einem Lauf ausgeführt werden, profitieren die letzten natürlich Listing 5 davon, dass die meisten benötigten Klas- sen bereits geladen sind. Klar erkennbar Durchlauf / Variante 1 2 3 4 ist die längere Laufzeit von NORMAL, wäh- rend die anderen Varianten relativ dicht NORMAL 417461 ns 29280 ns 21130 ns 28977 ns beieinander liegen. Weitere Erkenntnisse sind: FAST 897102 ns 12075 ns 9961 ns 10263 ns ISO8601 55541 ns 14187 ns 10565 ns 20828 ns • Die Laufzeiten von NORMAL variieren wesentlich stärker als die der anderen FAST2 20224 ns 9659 ns 9659 ns 9357 ns Verfahren. • Wenn ISO8601 auf den Cache zurück- Tabelle 1 greifen kann, ist die Laufzeit mit FAST vergleichbar (Läufe 2 und 3). Benchmark programmiert werden. Die Struktur gleicht • Der vierte Aufruf von ISO8601 (Ereignis Um einen Eindruck vom Einfluss des JIT- der von JUnit-Tests, nur dass die Methoden- mit Zeitstempel, der nicht mithilfe des Compiling der VM zu bekommen, werden Namen mit „time“ beginnen. Listing 6 zeigt Cache formatiert werden kann) reicht die Formatierungen mit Googles Bench- den Code des Format-Benchmarks. Neben erwartungsgemäß in der Dauer an mark-Framework „Caliper“ [3] untersucht. der Laufzeit kann der verbrauchte Speicher NORMAL heran. Das verfügbare Release 0.5 ist laut eigener protokolliert werden. „Caliper“ bietet ver- • FAST2 ist fast immer (ein wenig) schnel- Homepage noch „a little rough around the schiedene Möglichkeiten, die Ergebnisse ler als FAST. edges, but we have already found it quite darzustellen, darunter auch einen direkten useful”. Implementiert wird ein statistischer Upload auf einen Web-Server. Im einfachs- Wie zu erwarten war, zeigen die Messun- Ansatz, der sich an Experimenten mit kom- ten Fall erhält man die folgende Ausgabe gen eine große Streuung, wobei, von ein- plexen biologischen Systemen orientiert. auf die Konsole (siehe Listing 5). zelnen Ausreißern abgesehen, die aufge- Ein Benchmark kann einfach als Erwei- Die Resultate korrespondieren gut mit führten Ergebnisse klar erkennbar sind. terung der Klasse „SimpleBenchmark“ denen der Einzelmessungen. Nebenbei
Java aktuell 3-2013 | 59 Performance verbessern
die vorher bereits eine gewisse Lastgrenze private PatternLayout layout; private LoggingEvent[] events; überschritten hatten. Letztlich haben die zusätzlichen Unter- @Param Version version; suchungen keine wirklich neuen Fakten an public enum Version {NORMAL, FAST, ISO860, FAST2} den Tag gebracht. Das sollte niemanden @Override davon abhalten, solche Messungen vor- protected void setUp() throws Exception { zunehmen. Das Performance-Modell von Logger logger= LogManager.getLogger(«FormatLogger»); Prozessoren und VM macht Vorhersagen switch (version) { zunehmend schwieriger. Umso wichtiger case NORMAL: layout= new PatternLayout(«%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] - %m%n»); ist es, die bewährten Heuristiken immer break; wieder zu überprüfen, um unangenehme case FAST: Überraschungen möglichst vermeiden zu layout= new FastDatePatternLayout(«%d [%t] - %m%n»); können. Im vorliegenden Fall darf man break; case ISO860: nicht außer Acht lassen, dass Log4j eine layout= new PatternLayout(«%d [%t] - %m%n»); Bibliothek mit bereits weitgehend opti- break; miertem Code ist. Jedes andere als das case FAST2: vorgestellte Resultat wäre daher eine ech- layout= new FastDatePatternLayout2(«%d [%t] - %m%n»); break; te Überraschung gewesen. } long ts= System.currentTimeMillis() - 8 * 3600L; Zusammenfassung events = new LoggingEvent[10000]; for (int i= 0; i < events.length; i++) { Performance-Verbesserungen sind eine events[i]= new LoggingEvent(«fgnOf», logger, ts+600*i, Level.INFO, «message», null); wichtige und schwierige Aufgabe. In or- } dentlich gebauten Anwendungssystemen } ist es oft schwierig, allein durch Laufzeit- public String timePatternLayoutFormat(int reps) { Profiling kritische Codestellen zu identifizie- String dummy= null; ren. In diesen Fällen ist die Suche nach Al- for (int i= 0; i < reps; i++) { lokations-Hotspots eine vielversprechende dummy= layout.format(events[i % 10000]); Alternative. Die vorliegenden Erfahrungen } return dummy; sprechen dafür, dass insbesondere beim } Umgang mit Strings Sorgfalt sinnvoll ist.
Listing 6 Quellen [1] Apache log4j, http://logging.apache.org/log4j [2] http://logging.apache.org/log4j/1.2/apidocs/ sieht man das erhebliche Beschleunigungs- Betrachtung mit einbezieht. Wie im Bench- org/apache/log4j/PatternLayout.html potential der JIT-Technologie. Bei der Inter- mark-Versuch dokumentiert, erzeugt ein [3] Caliper – Microbenchmarking framework for pretation muss man aber beachten, dass Aufruf der FAST-Formatierung zwei Objekte Java: https://code.google.com/p/caliper/ die wiederholte Ausführung in Schleifen zu weniger (sieben statt neun) und verbraucht einer besonders aggressiven Optimierung dadurch fast 20 Prozent weniger Platz (408 Jürgen Lampe führt. Im tatsächlichen Anwendungssze- statt 504 Byte). ISO8601 und NORMAL un- [email protected] nario ist die Formatierung jedoch nur ein terscheiden sich in dieser Beziehung nicht Schritt in einer umfassenderen Schleife, voneinander. Interessant wäre nun natür- sodass sich durchaus andere Hotspots er- lich die Frage, ob beim Einsatz der FAST2- geben können. Wichtig ist die Erkenntnis, Variante in der Produktion eine weitere Ver- dass keine der untersuchten Varianten besserung beobachtet werden kann. Code enthält, der die VM bei ihren Opti- Obwohl die Auswirkungen des Spei- mierungen behindert. chersparens deutlich spürbar sind, ist das Ausmaß quantitativ kaum exakt erfass- Fazit bar, denn neben der Verringerung der Die zwischen den Varianten ISO8601 und GC-Aktivität wird unter Umständen durch FAST beobachteten Laufzeit-Unterschiede größere Datenlokalität auch der Effekt des sind – auch wenn man berücksichtigt, dass Caching verbessert. Wegen der zahlrei- Dr. Jürgen Lampe ist IT-Berater bei der A:gon Solutions GmbH in daneben noch teilweise NORMAL verwen- chen Einfluss-Faktoren lassen sich solche Frankfurt. Vor seiner Tätigkeit als Berater wirkte er als Hochschulleh- det wurde, – zu gering, um für sich allein Effekte jedoch nicht isolieren. Offen bleibt rer an einer Technischen Universität. Seit mehr als 15 Jahren befasst die beim Gesamtsystem erreichten Ver- gleichfalls, ob sich die sparsamere Verwen- er sich mit Design und Implementierung von Java-Anwendungen besserungen zu erklären. Das gelingt nur, dung des Speichers gerade (oder nur) bei im Bankenumfeld. An Fachsprachen (DSL) und Werkzeugen für wenn man den Speicherverbrauch in die Systemen so positiv bemerkbar macht, deren Implementierung ist er seit seiner Studienzeit interessiert.
60 |
iii iii iiiiii www.ijug.eu
Unbekannte Kostbarkeiten des SDK Heute: Web-Services
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 stellen in dieser Reihe derartige Features des SDK vor: die unbekannten Kostbarkeiten.
Nachdem Gartner und andere Analysten befindet. Wir zitieren dazu die Dokumen- package de.pdbm; einen Web-Service-Hype für die Dekaden- import javax.jws.WebService; tation des Werkzeugs: „The wsgen tool mitte vorhergesagt hatten und dieser auch @WebService generates JAX-WS portable artifacts used tatsächlich eintrat, sah sich Sun veranlasst, public class HelloWorld { in JAX-WS web services. The tool reads eine Web-Service-Implementierung in das public String helloWorld(String whom) { a web service endpoint implementation return “\“hello world\“ from “ + whom; Java SDK zu integrieren, die wir hier kurz class (SEI) and generates all the required } vorstellen wollen. } artifacts for web service deployment, and invocation.“ Web-Services und das SDK Listing 1 Zurück zum Beispiel: Der Aufruf von „ws- Gartner veröffentlichte im Jahr 2001 eine gen -cp bin -d bin -s generate de.pdbm. Analyse, die für die Jahre 2005 und folgen- Um den Web-Service veröffentlichen HelloWorld“ erzeugt für die Web-Service- de eine starke Verbreitung von Web-Servi- zu können, ist ein Web-Service-Endpoint Klasse „de.pdbm.HelloWorld“ zwei neue ces und die Etablierung serviceorientier- erforderlich. Dieser ist durch die Klasse Klassen, deren Quell-Code im Verzeichnis ter Architekturen prognostizierte [1]. Der „Endpoint“ realisiert, sodass zur Vervoll- „generate“ und deren Compilate im Ver- entsprechende JSR 224 (Java API for XML- ständigung unseres Beispiels nur ein einzi- zeichnis „bin“ abgelegt werden. Based Web Services (JAX-WS) 2.0) [2] wur- ger Aufruf der „publish()“-Methode dieser Auch für das Erzeugen der benötigten de 2006 verabschiedet. Die Referenz-Im- Klasse genügt, wie Listing 2 zeigt. Damit Client-Artefakte enthält das SDK die ent- plementierung [3] stammte von Sun. Diese ist offensichtlich, dass das SDK auch einen sprechende Unterstützung. Das Werkzeug wurde in das SDK 6 integriert und kann einfachen HTTP-Server enthalten muss, „wsimport“ des SDK erzeugt die für einen damit ohne weitere Bibliotheken oder Ser- um das Binding für das verwendete URI- Client benötigten Artefakte. Wir zitieren ver wie etwa GlassFish oder JBoss-AS als Schema bereitzustellen. auch hier die Dokumentation: „The wsim- einfache Web-Service-Implementierung Wird die Klasse als Main-Klasse gestar- port tool generates JAX-WS portable arti- ausschließlich mit dem SDK betrieben wer- tet, so liefern HTTP-Get-Aufrufe für „http:// facts, such as: den. Wir gehen auf WSDL, SOAP und weite- localhost:8080/HelloWorld“ und „http://lo- re Themen nicht ein und beschränken uns calhost:8080/HelloWorld?wsdl“ allgemeine • Service Endpoint Interface (SEI) auf das unbedingt Nötige. Informationen zum Endpunkt beziehungs- • Service weise das entsprechende WSDL-Dokument • Exception class mapped from wsdl:fault Das obligatorische „Hello World“ zurück. Um den Web-Service tatsächlich (if any) Wir entwickeln im Folgenden die typische deployen und nutzen zu können, müssen • Async Reponse Bean derived from res- Hello-World-Anwendung, um sie als Web- noch weitere Klassen generiert werden. ponse wsdl:message (if any) Service zu publizieren. Danach bauen wir Hierzu verwendet man das Werkzeug „ws- • JAXB generated value types (mapped einen Client für diesen Service. Die Klasse gen“, das sich im bin-Verzeichnis des SDK java classes from schema types)“ „HelloWorld“, die nachfolgend wiederge- geben ist, wird mit „@WebService“ anno- tiert. Diese Annotation ist im JSR 181 [4] import javax.xml.ws.Endpoint; definiert und veröffentlicht die Klasse als public class HelloWorldServer { Web-Service-Endpoint, sodass alle öffentli- public static void main(String[] args) { Endpoint.publish(“http://localhost:8080/HelloWorld“, new HelloWorld()); chen Methoden als Web-Service verfügbar } sind. Die Annotation einer Methode mit „@ } WebMethod“ ist damit nicht notwendig (siehe Listing 1). Listing 2
Java aktuell 3-2013 | 61 Performance verbessern
Der Aufruf erfolgt durch „wsimport -keep package de.pdbm; -p de.pdbm.client -d bin -s generate http:// import de.pdbm.client.HelloWorldService; localhost:8080/HelloWorld?wsd“. Auch hier public class HelloWorldClient { wird eine Reihe von Klassen erzeugt, die im public static void main(String[] args) { Verzeichnis „generate“ und hier wiederum HelloWorldService service = new HelloWorldService(); im Package „de.pdbm.client“ abgelegt ist. de.pdbm.client.HelloWorld proxy = service.getHelloWorldPort(); System.out.println(proxy.helloWorld(„Duke“)); Als Grundlage der Generierung wird die } Service-Beschreibung verwendet, die über } den HTTP-Server verfügbar ist. Als letzter Schritt kann nun ein Client entwickelt wer- Listing 3 den, der die generierten Artefakte verwen- Bernd Müller det. Die Klasse HelloWorldClient leistet ge- Web-Services bleiben natürlich nach wie [email protected] nau dies (siehe Listing 3). vor umfassenderen Frameworks wie AXIS2 Die verwendeten Klassen „HelloWorld- oder Application-Servern vorbehalten. Service“ und „HelloWorld“ wurden zuvor von „wsimport“ erzeugt. Wir sind damit am Ende Literatur unseres einfachen Beispiels angelangt. [1] Gartner: The Hype Is Right: Web Services Will Deliver Immediate Benefits, http://www. gartner.com/id=344028 Zusammenfassung [2] JSR 224: Java API for XML-Based Web Ser- Mit Version 6 des SDK wurde eine Imple- vices (JAX-WS) 2.0, http://jcp.org/en/jsr/ mentierung von Web-Services in das Java- detail?id=224. [3] JAX-WS Reference Implementation: http://jax- SE SDK integriert. Damit ist es möglich, ws.java.net einfache Web-Services ohne weitere Bib- [4] JSR 181: Web Services Metadata for the Bernd Müller ist Professor für Software-Technik an der Ostfalia. liotheken und Frameworks zu realisieren. Java Platform 2.0, http://jcp.org/en/jsr/ Er ist Autor des Buches „JavaServer Faces 2.0“ und Mitglied in der Komplexe Anwendungen auf Basis von detail?id=181. Expertengruppe des JSR 344 (JSF 2.2).
Die iJUG-Mitglieder auf einen Blick
Java User Group Deutschland e.V. Java User Group München (JUGM) Sun User Group Deutschland e.V. http://www.java.de http://www.jugm.de http://www.sugd.de
DOAG Deutsche ORACLE Anwendergruppe e. V. Java User Group Metropolregion Nürnberg Swiss Oracle User Group (SOUG) http://www.doag.org http://www.source-knights.com http://www.soug.ch
Java User Group Stuttgart e.V. (JUGS) Java User Group Ostfalen Berlin Expert Days e.V. http://www.jugs.de http://www.jug-ostfalen.de http://www.bed-con.org
Java User Group Köln Java User Group Saxony Java Student User Group Wien http://www.jugcologne.eu http://www.jugsaxony.org www.jsug.at
Der iJUG möchte alle Java-Usergroups unter einem Dach vereinen. So können sich alle Java-Usergroups in Deutschland, Öster- reich und der Schweiz, die sich für den Verbund interessieren und ihm beitreten möchten, gerne unter [email protected] melden.
62 |
iii iii iiiiii www.ijug.eu
Foto: IBM
Integration von Java via JNI in traditionelle Cobol- Batch-Anwendungen
Marc Bauer und Martin Kiefer, IBM Deutschland GmbH
In den letzten Monaten ist die Anzahl an Projekten zur Modernisierung von Altanwendungen beträchtlich gestiegen. Entwickler, die sowohl die traditionelle als auch die Java-Welt kennen, sind gefragt.
Für den neuen Trend gibt es vor allem zwei das Erstellen von Kontoauszügen oder Die erste Idee ist die Ablösung der Altan- Gründe: Erstens gehen mehr und mehr Rechnungsschreiben. wendungen durch neue Java-Programme. Experten für die älteren Programmierspra- Die Abkürzung „Cobol“ steht für „Com- Jedoch sind derartige Projekte aufgrund chen wie beispielsweise Cobol in den Ru- mon Business Oriented Language“. Die der hohen Komplexität oft mit viel Risiko hestand und zweitens ist Java schon lange Syntax ist stark an die natürliche Sprache behaftet. Des Weiteren fehlt in vielen Fällen erwachsen und robust genug, um auch in angelehnt und leicht verständlich. Zahlen eine genaue Funktionsbeschreibung der sehr kritischen Einsatzgebieten angewen- werden beispielsweise in Fix-Komma-No- Altanwendung, wodurch die Gefahr steigt, det zu werden. Die Technologie, um Alt- tation abgelegt. Gefördert durch die fort- dass im Rahmen der Neuentwicklung wich- systeme mit neuen Java-Anwendungen zu währende Abwärtskompatibilität, wuchs tige Anforderungen übersehen werden. erweitern und abzulösen, steht bereit. Der die Komplexität der Batch-Anwendungen Außerdem ist das Neuprogrammieren ei- Artikel zeigt anhand eines Beispiels, wie an. Systeme mit mehreren Millionen Zeilen ner schon bestehenden Anwendung nur leicht Cobol in Batch-Anwendungen um Cobol-Code und einem Alter von mehr als schwer zu verkaufen, da die Fachabteilun- die Funktionalität aus Java-Klassen erwei- dreißig Jahren sind keine Seltenheit. Je- gen, die heutzutage oft die Budgetverant- tert werden kann. doch ist davon auszugehen, dass in den wortung haben, kaum unmittelbaren fach- Batch-Anwendungen und die Program- nächsten Jahren ein Großteil der Cobol-Ex- lichen Nutzen erkennen werden. miersprache Cobol sind seit vielen Jahren perten den Markt verlassen wird. Mit ihnen Eine Alternative kann die Entwicklung ein fester Bestandteil der Anwendungs- verschwindet auch das Wissen über die einer hybriden Anwendung sein, in der entwicklung. Sie charakterisieren sich da- historisch gewachsenen und hochkom- neue Module in Java entwickelt und Be- durch, dass sie ohne Benutzer-Interaktion plexen Bestandssysteme. Somit stehen standsmodule aus Cobol weiterverwendet ablaufen und eine sehr große Menge an wir heute vor der Frage, wie wir mit diesen werden. Auf diese Weise würden die Inves- Eingabedaten verarbeiten. Beispiele wären Bestandssystemen in Zukunft umgehen titionen in die Altanwendungen geschützt die monatliche Kreditkartenabrechnung, sollen. und neue Anforderungen schnell und
Java aktuell 3-2013 | 63 Mainframe
unter Verwendung vieler Frameworks mit Variablen, die im Programm verwendet Programmanweisungen, die die Anwen- Java ermöglicht werden. werden. Auf Java-Objekte wird über Vari- dung gliedern und mithilfe der Perform- Eine naheliegende Möglichkeit, eine ablen zugegriffen, die entsprechende Ob- oder Goto-Anweisung angesprungen hybride Anwendung zu erstellen, bietet jekt-Referenzen enthalten. Im Beispiel wer- werden können. Im Gegensatz zur Goto- das Java Native Interface (JNI). Es ist ein den hier zunächst Variablen für die Klassen Anweisung erfolgt bei der Perform-Anwei- standardisiertes API, um von nativen Pro- „PDFCreator“ und „Exception“ benötigt. sung ein Rücksprung am Ende der Section. grammen auf Java-Anwendungen und Es ist in Cobol üblich, Variablen logisch Im Beispiel initialisieren wir zunächst das umgekehrt zugreifen zu können. Somit zu Records zusammenzufassen. Im Beispiel JNI, sodass mithilfe des JNI-Environment ist es möglich, Java-Objekte im Cobol-Pro- enthält hier der Record „CUSTOMER“ die Pointer-Funktionen aufgerufen werden grammcode zu verwenden. Variablen, die für die Verarbeitung von können. Zuerst werden die Variablen aus Am folgenden Beispiel wird aufgezeigt, Name und Kontonummer notwendig sind. dem „CUSTOMER“-Record gesetzt. Hat eine wie die Interaktion von Cobol und Java Der Datentyp „PIC X(30)“ entspricht einer Zeichenkette ein „z“ als Präfix, wird sie null- mithilfe von JNI erfolgen kann. Dabei be- Zeichenkette mit 30 Zeichen, „PIC S9(9)“ terminiert. Dies wird vom Java-Native-Inter- reitet das Cobol-Modul Daten beispielswei- einer vorzeichenbehafteten Ganzzahl mit face vorausgesetzt, um die Cobol-Zeichen- se für einen Kontoausdruck auf; sie sollen neun Stellen, der Zusatz „COMP-5“ sorgt kette in einen Java-String umzuwandeln. anschließend als PDF ausgegeben werden. dafür, dass die Zahl im Zweierkomplement Die Section „CREATE-PDFGEN“ wird auf- Die PDF-Generierung übernimmt ein Java- abgelegt wird. Dieser Datentyp ist kompa- gerufen. Sie verwendet die JNI-Funktion Modul mithilfe der iText-PDF-Bibliothek. tibel zum Java-Basisdaten-Typ „int“. Zusätz- „GetStringPlatform“, die aus den Daten Zunächst schreiben wir eine Klasse „PDF lich enthält der Datensatz eine Variable mit hinter einem Zeiger auf eine Cobol-Zei- Creator“, die „itextPdf“ verwendet und einer Objekt-Referenz auf einen String. Sie chenkette einen Java-String sowie eine über ihre Methoden alle Funktionen be- wird später dem Konstruktor übergeben, Referenz auf diesen erzeugt. Nun wird ein reitstellt, die von Cobol zum Generieren der einen String und einen Integer als Objekt der Klasse „PDFCreator“ erstellt. eines rudimentären Kontoausdrucks be- Argumente erwartet. Analog enthält der Hierzu kommt zum Ausführen von Metho- nötigt werden. Datensatz Transaction-Variablen für den den die „INVOKE“-Anweisung zum Einsatz, Wir übergeben im Konstruktor den Na- Aufruf von „AddTransaction“. Der Datentyp die auch zur Ausführung von objektorien- men des Kunden und dessen Kontonum- „COMP-1“ ist kompatibel zum Java-Basis- tiertem Cobol verwendet wird. Dem Aufruf mer. Über die Methode „addTransaction“ daten-Typ „float“. In der Linkage Section wird zuerst die Klasse beziehungsweise werden Betreff und Wert von Überweisun- wird das Copybook für das JNI importiert. das Objekt übergeben, für das eine Me- gen übergeben. Wurden alle Überweisun- Es enthält Definitionen, die für dessen Ver- thode ausgeführt werden muss. Es folgen gen eingetragen, kann die Methode „write- wendung benötigt werden. die Parameter der Methode. Ist ein Rück- Pdf“ aufgerufen werden, um eine PDF-Da- Zuletzt folgt in jedem Cobol-Programm gabewert vorgesehen, wird er in die Vari- tei mit Name, Kontonummer und aktuel- die Procedure Division, in der die eigentli- able hinter dem Schlüsselwort „Returning“ lem Datum abzulegen (siehe Listing 1). chen Programmbefehle angegeben wer- gespeichert. An dieser Stelle rufen wir die Nun soll aus einer Cobol-Anwendung den. Sie enthält üblicherweise Sections mit Klasse „PDFCreator“ mit dem Schlüssel- auf diese Java-Klasse zugegriffen werden. Eine Cobol-Anwendung besteht aus meh- public class PdfCreator { reren „Divisions“, die wiederum „Sections“ private Document document; enthalten können. Diese sind in „“Para- private Paragraph paragraph; graphs” unterteilt (siehe Listing 2). public PdfCreator(String name, int accountId) throws FileNotFoundException, DocumentException { Die „Identification Division“ enthält document = new Document(); Meta-Informationen über das Programm. PdfWriter.getInstance(document, new FileOutputStream(“OUTPUT.pdf“)); Sie muss vorhanden sein, spielt aber für document.open(); paragraph = new Paragraph(); die konkrete Verwendung des JNI keine Chunk chunk = new Chunk(“Name: “ + name + “Customer ID: “ + accountId+ “\n“); direkte Rolle. paragraph.add(new Chunk(chunk)); In der „Environment Division“ muss ein chunk = new Chunk(“--Subject------Value------\n“); Eintrag für jede Java-Klasse angelegt sein, paragraph.add(new Chunk(chunk)); } die von der Anwendung verwendet wird. Für das Beispiel wird hier unsere Klasse public void writePdf() throws DocumentException{ „PDFCreator“ angegeben, darüber hinaus document.add(paragraph); document.close(); benötigen wir die Klasse „jstring“, die ei- } nem gewöhnlichen Java-String entspricht, sowie die Klasse „java.lang.Exception“, um public void addTransaction(String subject, float value) { auftretende Exceptions zu behandeln. paragraph.add(new Chunk(subject + “ “ + String.format((“%.2f“),value) +“$“ + “\n“)); } In der „Data Division“ sind Programm- } variablen und Datenstrukturen definiert. Ihre Working-Storage-Section enthält alle Listing 1
64 |
iii iii iiiiii www.ijug.eu
IDENTIFICATION DIVISION. GO TO OKEND. PROGRAM-ID. ‚ExTrans‘ RECURSIVE. * Progam End AUTHOR. martin. ENVIRONMENT DIVISION. * Create the PDFGenerator for current customer CONFIGURATION SECTION. CREATE-PDFGEN. REPOSITORY. * Convert Cobol name String to Java String Class PdfCreator is “PdfCreator“ CALL “NewStringPlatform“ USING BY VALUE JNIEnvPtr Class jstring is “jstring“ ADDRESS OF NAME ADDRESS OF jName 0 Class jException is “java.lang.Exception“. * Create PdfCreator object INVOKE PdfCreator New USING BY VALUE jName ACCOUNT DATA DIVISION. RETURNING creator. WORKING-STORAGE SECTION. 01 ex OBJECT REFERENCE jException. * Convert Cobol subject string and call addTransaction 01 creator OBJECT REFERENCE PdfCreator. ADD-TRANSACTION. 01 CUSTOMER. CALL “NewStringPlatform“ 05 NAME PIC X(30). USING BY VALUE JNIEnvPtr ADDRESS OF SUBJECT ADDRESS 05 ACCOUNT PIC S9(9) COMP-5. OF jSubject 0 05 jNameOBJECT REFERENCE jstring. INVOKE creator “addTransaction“ USING BY VALUE jSubject 01 TRANSACTION. TVALUE. 05 SUBJECT PIC X(30). 05 TVALUE USAGE COMP-1. * Call the writePdf method 05 jSubject OBJECT REFERENCE jstring. WRITE-PDF. INVOKE creator “writePdf“. LINKAGE SECTION. COPY JNI. * CLEAN-UP for Garbage Colletion CLEAN-UP. PROCEDURE DIVISION. CALL DeleteLocalRef USING BY VALUE JNIEnvPtr jName * Get the JNI Environment Pointer CALL DeleteLocalRef USING BY VALUE JNIEnvPtr jSubject SET ADDRESS OF JNIEnv TO JNIEnvPtr CALL DeleteLocalRef USING BY VALUE JNIEnvPtr creator. SET ADDRESS OF JNINativeInterface TO JNIEnv * Set customer information * Check for an exception MOVE z“THOMAS J. WATSON“ TO NAME EXCEPTION-CHECK. MOVE 314159 TO ACCOUNT CALL ExceptionOccurred USING BY VALUE JNIEnvPtr RE- PERFORM CREATE-PDFGEN. TURNING ex. IF ex NOT = null THEN * Check for an exception CALL ExceptionClear using by VALUE JNIEnvPtr PERFORM EXCEPTION-CHECK DISPLAY “Caught an exception!“ INVOKE ex “printStackTrace“ * Create transaction input GO TO ERREND MOVE z“Einkauf“ TO SUBJECT END-IF. MOVE 14.99 TO TVALUE * Return code 0 and exit. * Add the transaction OKEND. PERFORM ADD-TRANSACTION DISPLAY “Everything went fine.“ PERFORM EXCEPTION-CHECK MOVE 0 TO RETURN-CODE. STOP RUN. * Write the PDF fiel PERFORM WRITE-PDF * Return code 8 and complain. And exit. PERFORM EXCEPTION-CHECK ERREND. DISPLAY “An error occured.“ * Free all Java object references MOVE 8 TO RETURN-CODE. PERFORM CLEAN-UP STOP RUN.
Listing 2 wort „New“ auf, um eine Objektreferenz für werden, um weiter Java-Komponenten zu cord für eine Überweisung gesetzt. Die Sec- ein Objekt vom Typ „PDFCreator“ zu erhal- verwenden, andernfalls wird die Anwen- tion „ADD-TRANSACTION“ wird aufgerufen, ten und übergeben dem Konstruktor die dung unsanft durch das Betriebssystem ihre Implementierung ist weitestgehend eben erzeugte Referenz auf den Namen beendet. Generell empfiehlt es sich, beim analog zu „CREATE-PDFGEN“. Einzig der und die Kontonummer. Prüfen auf Exceptions nicht zu sparsam zu „INVOKE“-Befehl wird hier dazu verwendet, Im Anschluss wird die Section „EXCEPTI- sein, denn selbst wenn die Methode keine die Methode „addTransaction“ aufzurufen, ON-CHECK“ aufgerufen. Sie prüft mit einer Exception vorsieht, kann eine unerwartete sodass anstelle der Klasse und „New“ die JNI-Funktion, ob die zuletzt aufgerufene RuntimeException zu demselben Verhal- Referenz auf das „PdfRecord“-Objekt und Methode eine Exception verursacht hat, ten führen und bei komplexeren Anwen- der Methodenname übergeben werden. die nicht behandelt wurde. Ist dies der Fall, dungen die Datenkonsistenz gefährden. Im weiteren Programmverlauf wird die muss mit der JNI-Funktion „Exception Im nächsten Programmabschnitt wer- Section „WRITE-PDF“ aufgerufen, um die Clear“ die aufgetretene Exception aufgelöst den Variablen für das „TRANSACTION“-Re- PDF-Datei mit der Funktion „writePdf“ zu
Java aktuell 3-2013 | 65 Mainframe
schreiben. Bevor das Programm beendet gegriffen wird und hybride Anwendungen Impressum werden kann, verdient die aufgerufene denselben transaktionalen Kontext benö- Section „CLEAN-UP“ besondere Aufmerk- tigen, stößt man schnell auf die Grenzen der Herausgeber: samkeit. Vielleicht haben Sie sich bis zu Technologien und muss unter Umständen Interessenverbund der Java User dieser Stelle gefragt, wie der Garbage zusätzliche Middleware integrieren. Groups e.V. (iJUG) Collector der JVM nicht mehr benötigten Zukünftige Modernisierungsprojekte Tempelhofer Weg 64, 12347 Berlin Speicher freigeben kann, wenn sich die werden sich dem Einsatz von Java kaum Tel.: 030 6090 218-15 Objekt-Referenzen im Cobol-Code seiner entziehen können. Der Markt ist gefüllt www.ijug.eu Überwachung entziehen. Die Antwort lau- von Experten, Werkzeugen und Vorgehens- Verlag: tet: Der Garbage Collector kann es nicht. modellen für die Implementierung von DOAG Dienstleistungen GmbH Standardmäßig werden von den JNI-Funk- Java-Anwendungen. Die großen Heraus- Fried Saacke, Geschäftsführer tionen sogenannte „lokale Referenzen“ forderungen werden eher im Bereich der [email protected] zurückgegeben. Ihre Lebensdauer endet Integration entstehen, da Cobol und Java- mit dem aufgerufenen Cobol-Modul. Es ist Know-how gleichermaßen benötigt wer- Chefredakteur (VisdP): oftmals jedoch nicht ausreichend, auf das den und Schnittstellen aufgrund der hö- Wolfgang Taschner, [email protected] Ende der Lebensdauer der Variablen zu heren Komplexität gut durchdacht werden warten. In Batch-Anwendungen könnten müssen. Zudem sind verschiedene Entwick- Redaktionsbeirat: für viele zu verarbeitende Datensätze neue lermentalitäten und Entwicklungsprozesse Ronny Kröhne, IBM-Architekt; Java-Objekte erzeugt werden. Das kann in zu vereinen. Ein spannendes Feld für Archi- Daniel van Ross, NeptuneLabs; einer Situation enden, in der der Speicher tekten und Java-Entwickler gleichermaßen. Dr. Jens Trapp, Google; André Sept, InterFace AG der JVM vollständig belegt ist und nicht mehr freigegeben werden kann. Das Pro- Chefin von Dienst (CvD): gramm kann nicht mehr weiter ausgeführt Marc Bauer Carmen Al-Youssef, [email protected] werden. Aus diesem Grund kann zwischen [email protected] der statischen Speicherverwaltung von Titel, Gestaltung und Satz: Cobol und der automatischen Speicher- Alexander Kermas verwaltung von Java als drittes Konzept DOAG Dienstleistungen GmbH manuelle Speicherverwaltung hinzutre- Foto Titel © burak çakmak / Fotolia.com ten. Mithilfe der JNI-Funktionen „DeleteLo- Foto S. 25 © alphaspirit / Fotolia.com calRef“ beziehungsweise „DeleteGlobal- Foto S. 34 © burak çakmak / Fotolia.com Ref“ können Referenzen vorzeitig für den Foto S. 45 © Picture-Factory / Fotolia.com Garbage Collector freigegeben werden. Anzeigen: Simone Fischer Fazit [email protected] Das Beispiel zeigt, dass das Verwenden von Marc Bauer arbeitet im Software Service der IBM Deutschland Funktionalität aus Java-Programmen mit- Mediadaten und Preise: GmbH. Er berät und unterstützt Kunden bei Modernisierungen hilfe von JNI in Cobol realisierbar ist. Das http://www.doag.org/go/mediadaten Aufrufen von Methoden mit dem „INVOKE“- von Mainframeanwendungen mit Hilfe von WebSphere und Java- Applikationen. Statement ist intuitiv möglich. Dennoch Druck: treffen sehr unterschiedliche Eigenschaften Martin Kiefer Druckerei Rindt GmbH & Co. KG der Programmiersprachen aufeinander. [email protected] www.rindt-druck.de
Cobol-Anwendungen verwenden traditio nell statisches Speicher-Management, bei dem der verwendete Speicher vor Ablauf des Programms feststeht. Demgegenüber steht Java mit seiner dynamischen Spei- cherverwaltung und dem Garbage Collec- tor. Java-Konzepte wie Exception Handling müssen beachtet werden. Den unterschied- aktuell lichen Datentypen in den beiden Program- miersprachen muss beim Austausch Rech- nung getragen werden. So werden in Cobol Zahlen oft in Fix-Komma-Notation abgelegt Matrin Kiefer absolviert ein duales Informatikstudium in Koope- und benötigen somit eine Umwandlung ration mit der IBM und beschäftigt sich dabei mit den Themen für die Übertragung in Java-Programme. der Anwendungsmodernisierung auf dem Mainframe und der Java Magazin der Java-Community Insbesondere, wenn auf Datenbanken zu- Anwendungsentwicklung mit Java und C++, sowie z/Linux.
66 | 03-2013 | Herbst | www. ijug.eu 2-2013 Nr. 1-2013 | Sommer | Dezember, | www. Januar, ijug.eu Februar | www. ijug.eu Nr. 04 | Winter 2012 | www. ijug.eu www.ijug.eu
Java
Javaaktuell
Praxis. Wissen. Networking. Das Magazin für Entwickler
aktuellaktuellaktuell JavaJavaPraxis. Wissen.Praxis. Networking. Wissen. Networking. Das Magazin Das für Magazin Entwickler für EntwicklerDas Magazin der Java-Community Die „Bohne“ in voller Blüte Java trägtJava Früchte verbreitetaktuell sich überall aktuell Besser mit Java Jetzt
aktuell entwickeln aktuell Java EE 7 für die Cloud, Seite 14 Neue Technologie Apache Camel Security, Java-API für Batch-Anwendungen, SeiteJava 8 Seite 30 Java
Java Eclipse Code Recommenders,
Java Ausblicke Entwicklungsstrategien Seite 44 Abo Software modularJDeveloper aufbauen,Java 12c, Seite Seite –19 8 Android goes Gradle, SeiteTools 29 für Web-Applikations- bestellen Mehr selbst entwickeln, Seite 23
ISSN 2191-6977 Lasttests, Seite 52 Programmiersprache ISSN 2191-6977
ISSN 2191-6977 ISSN Web-EntwicklungHochverfügbarkeitmit TiefgangJava aktuell Das Web als SocialJBoss Network, AS7, Seite Seite 21 32 Benelux: 5,80 EUR Update Neu: Wicket 6, Seite 40 Benelux: 5,80 EUR Neu auf demFortschritte Markt bei JAX-RS 2.0, Benelux: 5,80 EUR 5,80 Benelux: Web-EntwicklungSeite 9 CH: 9,80 CHF Eclipse 4, Seite 18 Play!, GeronimoSeite 32 3.0, Seite 65
Java CHF 9,80 CH: und Oracle Neue Features in Java FX 2.1,
CH: 9,80 CHF 9,80 CH: ADF Essential LinkedMobile, Data, Seite Seite 52 38 A: 5,60 EUR Seite 18 Mainframe EUR A: 5,60
A: 5,60 EUR 5,60 A: Modernisieren mit Java, Seite 27
D: 4,90 EUR Java und Oracle Continous Integration, Seite 59 D: 4,90 EUR D: 4,90
Wissen für Entwickler 4 D: 4,90 EUR 4,90 D:
Garbage Collection, Seite 36 191978 Scrum & Kanban, Seite 61
304903 Sichern Sie sich
Java und Oracle
iii iii iii Kostenlose ADF-Version, Seite 45 iii 04
01 PL/SQL-Logik in Java-Anwendungen, Seite 46
iii
iiiiii iiiiii iii
02 Debugging für Forms 11g, Seite 50
iii iii 4 Ausgaben für 18 EUR iiiiii 304903 D: 4,90 EUR A: 5,60 EUR iJUGiJUG CH: 9,80 CHF iiiiii 304903 Benelux: 5,80 EUR Verbund ISSN 2191-6977 Verbund iJUG
191978 4 VerbundiJUG 191978 4 Verbund Für Oracle-Anwender und Interessierte gibt es das Java aktuell Abonnement auch mit zusätzlich sechs Ausgaben im Jahr der Fachzeitschrift DOAG News und vier Ausgaben im Jahr Busi- ness News zusammen für 70 EUR. Weitere Informationen unter 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
Anschrift ggf. ABWEICHENDE rechnungsanschrift
Name, Vorname Straße, Hausnummer
Firma PLZ, Ort
Abteilung E-Mail
Straße, Hausnummer Telefonnummer
PLZ, Ort Die allgemeinen Geschäftsbedingungen* erkenne ich an, Datum, Unterschrift
*Allgemeine Geschäftsbedingungen: 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- 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. Technik allein bringt Sie nicht weiter. Man muss wissen, wie man sie richtig nutzt.
Trivadis ist das führende Unternehmen für IT-Beratung, Systemintegration und IT-Services mit Fokussierung auf Oracle- und Microsoft-Technologien. Unsere Leistungen erbringen wir aus den strategischen Geschäftsfel- dern Application Development, Business Intelligence, Infrastructure Engineering und Training. Darüber hinaus übernimmt die Trivadis Services den korrespondierenden Betrieb Ihrer IT Systeme. Sprechen Sie mit uns über Ihre IT-Lösungen und vor allem: welchen Nutzen wir Ihnen bringen. www.trivadis.com.
Trivadis Holding AG Europa-Strasse 5 CH-8152 Glattbrugg Telefon +41 4480870-20 www.trivadis.com [email protected]