<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>blog.codecentric.de</title>
	
	<link>http://blog.codecentric.de</link>
	<description>Blog von codecentric über Agilität, Architektur, Java, Performance und Enterprise Content Management</description>
	<lastBuildDate>Thu, 02 Sep 2010 13:49:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/codecentric" /><feedburner:info uri="codecentric" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Keine Zeit für Monitoring?</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/2n7QWo1Y0BI/</link>
		<comments>http://blog.codecentric.de/2010/09/keine-zeit-fur-monitoring/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 10:20:38 +0000</pubDate>
		<dc:creator>Rainer Schuppe</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[APM]]></category>
		<category><![CDATA[Monitoring]]></category>
		<category><![CDATA[Production]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=5035</guid>
		<description><![CDATA[Das Monitoring großer, verteilter Java-Landschaften hilft vor allem, die Kontrolle über zunehmend komplexe Applikationen zu behalten. Aber viele Administratoren sparen den Aufwand, ein Monitoring überhaupt einzurichten: Keine Zeit. Nun ist eine zeitsparende Abhilfe in Sicht! &#8220;Wir sind eh zu 100% &#8230; <a href="http://blog.codecentric.de/2010/09/keine-zeit-fur-monitoring/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Das  Monitoring großer, verteilter Java-Landschaften hilft vor allem, die  Kontrolle über zunehmend komplexe Applikationen zu behalten. Aber viele  Administratoren sparen den Aufwand, ein Monitoring überhaupt  einzurichten: Keine Zeit. Nun ist eine zeitsparende Abhilfe in Sicht!</p>
<blockquote><p>&#8220;Wir sind eh zu 100% ausgelastet. Wir brauchen eine Lösung, die uns hilft  schneller und effektiver zu arbeiten und nicht etwas, das uns mit Glück die Zeit spart, die es selber kostet um es einzurichten und am Laufen zu halten.&#8221;<br />
Diese  oder ähnliche Aussagen höre ich oft von Administratoren. Mit dem  Effekt, dass Lösungen für das Application Performance Monitoring (APM)  nur von Experten als &#8220;Feuerlöscher&#8221; eingesetzt werden.</p></blockquote>
<p>Was  wird also gebraucht? Eine Lösung, die mit minimalem  Konfigurationsaufwand eine große Menge an Applikationen überwacht und im  Problemfall rasch die Ursache identifiziert.</p>
<p>Tatsächlich habe ich inzwischen ein Tool gefunden und getestet, dass diese Anforderungen erfüllt. <span id="more-5035"></span><a href="http://www.appdynamics.com">AppDynamics</a> hat  ein Produkt entwickelt, das nicht zuletzt durch seine sehr einfache  Bedienung überzeugt. Mit hoher Skepsis bin ich an die Lösung  herangegangen, habe jedoch in den bisherigen Installationen keine  Enttäuschung erlebt. Fast schon wie eine iPhone- oder Android-App:  Einfach benutzen.</p>
<h3><strong>Die 3 Schritte zur 24&#215;7 Überwachung</strong></h3>
<p>Betrachten  wir das Aufsetzen eines typischen Application-Monitorings Schritt für  Schritt und welche Vorteile dabei die Lösung von AppDynamics bringt.</p>
<h3><strong>1. Was messe ich?  - Messpunkte</strong></h3>
<p>Die  Definition der Messpunkte stellt die erste Herausforderung dar. Die  meisten APM-Lösungen im Bereich Java und .NET verwenden BCI (Bytecode  Instrumentierung), um an Performance Daten heran zu kommen. Die  Messpunkte müssen sinnvoll definiert werden, damit der Einfluss der  Messung auf das Ergebnis gering gehalten wird (Overhead), da ja  zusätzlicher Code ausgeführt wird. Dieser Schritt erfordert mindestens  einen Experten, in der Regel einen Entwickler oder Architekten, der die  Applikation im Detail kennt. Und das für jede Applikation, die   überwacht werden soll.</p>
<p>Wird  agil entwickelt ist das ein anstrengendes Unterfangen, da sich die  Klassen täglich ändern können, bzw. neue dazu kommen. Ein “Trial and  Error”-Verfahren verbietet sich in Produktion, da dazu die  Applikationsserver meist neu zu starten sind und evtl. der Overhead  zwischendurch so stark erhöht wird, dass die     Nutzer davon merklich  betroffen werden.<br />
AppDynamics  wendet hier ein zum Patent angemeldetes Verfahren an, welches mit  minimaler BCI auskommt und trotzdem bis auf Methodenebene Auskunft geben  kann, welche Komponente einer Applikation “trödelt”. Und das ohne  jeglichen Konfigurationsaufwand. Der Architekt / Entwickler darf also  weiterhin seiner eigentlichen Tätigkeit nachgehen.</p>
<h3><strong>2. Wie verschaffe ich mir einen Überblick? &#8211; Visualisierung</strong></h3>
<p>Für  den Überblick bieten sich Dashboards an, welche die Architektur (wer  spricht mit wem wie oft) und die Fachlichkeiten (welche Business  Transaktion braucht wie lange und warum?) für alle Applikationen  veranschaulichen.</p>
<p>Die  meisten Hersteller benutzen zur Visualisierung “Customizable  Dashboards”, also jenes “Allheilmittel”, mit dem man individuelle  Ansichten für jeden Benutzer erstellen kann. Und genau das ist dann auch  in allen Details und für jede Applikation zu tun &#8211; quasi &#8220;Mustomizable  Dashboards&#8221;. Neuerlicher Aufwand entsteht, sobald sich etwas in der  Umgebung oder an den Fachlichkeiten ändert.</p>
<p>AppDynamics  Dashboards erstellen sich dagegen automatisch und ermitteln die  Business Transaktionen im laufenden Betrieb basierend auf den “inneren”  Werten einer Applikation (z.B. Struts Actions, URL Pattern oder HTTP  Parametern). Sollten die Definitionen nicht passen, können sie mit  wenigen Klicks angepasst werden und das System ist fertig eingestellt.</p>
<table>
<tbody>
<tr>
<td>
<div id="attachment_5150" class="wp-caption alignleft" style="width: 260px"><a href="http://blog.codecentric.de/wp-content/uploads/2010/09/AD-Overview-Screenshot-klein.png" rel="lightbox"><img class="size-thumbnail wp-image-5150" src="http://blog.codecentric.de/wp-content/uploads/2010/09/AD-Overview-Screenshot-klein-150x150.png" alt="AppDynamics - Application Overview" width="250" height="200" /></a><p class="wp-caption-text">AppDynamics - Application Overview</p></div></td>
<td>
<p><div id="attachment_5149" class="wp-caption alignright" style="width: 260px"><a href="http://blog.codecentric.de/wp-content/uploads/2010/09/AD-App-Map-Screenshot-klein.png" rel="lightbox"><img class="size-thumbnail wp-image-5149" src="http://blog.codecentric.de/wp-content/uploads/2010/09/AD-App-Map-Screenshot-klein-150x150.png" alt="AppDynamics Application Flow Map" width="250" height="200" /></a><p class="wp-caption-text">AppDynamics Application Flow Map</p></div>
</td>
</tr>
</tbody>
</table>
<h3><strong>3. Alarm! Da läuft was schief! &#8211; Schwellwerte</strong></h3>
<p>Was  ist ein Problem in der Produktion? In der Regel etwas, dass außerhalb  der Reihe passiert. Z.B. der Login eines Anwenders dauert 3-mal so lange  wie normal zu dieser Tageszeit in Applikation X oder eine JVM hat einen  starken CPU Verbrauch. Solche Auffälligkeiten werden durch zuvor  definierte Schwellwerte erkennbar, deren Überschreitung einen Alarm  auslöst.</p>
<p>Jetzt  sehe ich in der Praxis oft 100 Applikationen mit diversen fachlichen  Transaktionen die unterschiedliche “normale” Laufzeiten haben: Mal ist 2  Sekunden gut (Kostenkalkulation in der Versicherung), mal sind 200 ms  Antwortzeit schon eine Katastrophe (Platzierung einer Wette in einem  Online Wettsystem). Oder es liegen gar keine genau definierten  nicht-funktionalen Anforderungen vor, so dass ins Blaue Werte festgelegt  werden, die anschließend aufwändig anzupassen sind. Denn gehen wir mal  nur von 50 Applikationen mit jeweils 50 fachlichen Transaktionen aus,  sind das schon satte 2.500 Schwellwerte, die ich anpassen muss!  Regelmäßig. Und wir betrachten hier nur Antwortzeiten&#8230;</p>
<p>Mit  AppDynamics fällt dieser Aufwand zum großen Teil weg, da ein schlaues  Baselining und statistische Methoden wie die Standardabweichung  verwendet werden. Hier kann ich die Werte individuell einstellen, aber  mehr als 95% der Schwellwerte sind mit den Standardregeln schon  abgedeckt. Sogar Tageszeit-bezogene Unterschiede (Montag morgens dauert  der Login doppelt so lange aufgrund der Last wie 2 Stunden später)  werden dabei berücksichtigt.</p>
<h3><strong>4. Und was ist mit der Root Cause-Analyse?</strong> (Bonusschritt)</h3>
<p>Alarmierungen  bei Problemen sind gut und schön, man weiß dann, dass etwas schief  ging, aber wer ist jetzt zu benachrichtigen? Möglichkeiten zur Triage  und Root Cause Analyse vervollständigen die Überwachung. Also die  Verantwortlichen für die Problemlösung identifizieren und ihnen dann  auch gleich die Detaildaten übergeben, um schnell wieder Normalität  einkehren zu lassen.</p>
<p>Ich  habe vorher ausgeführt, dass AppDynamics nur sehr wenig Bytecode  instrumentiert. Wie komme ich dann an die erforderlichen Details? Hierzu  verwendet AppDynamics so genannte Snapshots, welche einem Callstack  gleichen, mit Transaktionsdetails angereichert sind und im Bedarfsfall  erzeugt werden. Bedarf besteht dann, wenn etwas außerhalb der Norm  passiert, bzw. immer mal wieder zur Stichprobe zwischendurch. Dadurch  wird ein Operator nicht mit Unmengen an Daten belastet, sondern erhält  genau die richtigen Informationen, wenn sie benötigt werden.</p>
<p>In  den nächsten Wochen werden wir hier im Blog auch noch auf verschiedene  typische Performance-Probleme und deren Diagnose eingehen.</p>
<h3><strong>Einfach und effektiv</strong></h3>
<p>Zusammenfassend  hat AppDynamics eine einfach zu benutzende und effektive Lösung auf den  Weg gebracht in der ich endlich das verwirklicht sehe, was in den  letzten sieben Jahren zwar angedacht aber nie umgesetzt wurde. Es ist  ein einfach zu bedienendes System, welches spezifisch auf die  Produktionsüberwachung ausgerichtet wurde.</p>
<p>Ist  das revolutionär? Eher evolutionär. AppDynamics hat die Lehren aus  bisherigen Lösungsansätzen verschiedenster Anbieter gezogen und vor  allem über die Automatisierung nachgedacht. Das Ziel wird in den Zahlen  “2-3-100” zusammen gefasst: 2 Administratoren können in 3 Tagen 100  Applikationen in die Überwachung nehmen.</p>
<p>Hatten  die ersten Anbieter von APM Lösungen (für Java und .NET) das  vordringliche Ziel,  überhaupt Daten zu bekommen und die Blackbox zu  öffnen, erweiterte die zweite Generation das Ganze auf Transaktionen, um  auch moderne, dynamische SOA/SBA Applikationen vernünftig zu  durchleuchten. Was auf der Strecke blieb war bis jetzt die Usability.  Wie bekomme ich ohne Aufwand Ordnung in meine Messdaten und mache daraus wertvolle Informationen?</p>
<h3>Auf in die nächste Generation des APM!</h3>
<p>Also: Agent in die Anwendung einbinden (siehe <a href="http://blog.codecentric.de/2010/08/einfache-performanceanalyse-mit-appdynamics-lite/">AppDynamics Lite Screencast von  Fabian</a>), an den zentralen Controller Daten schicken lassen und kurz warten, bis sich die ersten Werte einstellen.</p>
<div class="dzone_button" style="float: right; margin: 10px 0;">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&url=http%3A%2F%2Fblog.codecentric.de%2Fen%2F2010%2F09%2Fno-time-for-monitoring%2F&title=No+time+for+monitoring%3F" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div><img src="http://feeds.feedburner.com/~r/codecentric/~4/2n7QWo1Y0BI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/09/keine-zeit-fur-monitoring/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2010/09/keine-zeit-fur-monitoring/</feedburner:origLink></item>
		<item>
		<title>Business Case für Agilität</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/vtxTtfJoIi8/</link>
		<comments>http://blog.codecentric.de/2010/09/business-case-fur-agilitat/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 17:13:46 +0000</pubDate>
		<dc:creator>Mirko Novakovic</dc:creator>
				<category><![CDATA[Agilität]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Business Case]]></category>
		<category><![CDATA[Kanban]]></category>
		<category><![CDATA[SCRUM]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=5096</guid>
		<description><![CDATA[Agile Methoden wie Scrum oder Kanban  etablieren sich zunehmend als Alternative zu klassischen Vorgehensmodellen in der Softwareentwicklung. Ist das alles nur ein großer Hype oder steckt mehr dahinter? Gibt es vielleicht sogar einen echten Business Case? Anhand einer idealisierten Geschichte &#8230; <a href="http://blog.codecentric.de/2010/09/business-case-fur-agilitat/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p>Agile Methoden wie Scrum oder Kanban  etablieren sich zunehmend als  Alternative zu klassischen Vorgehensmodellen in der Softwareentwicklung.  Ist das alles nur ein großer Hype oder steckt mehr dahinter? Gibt es  vielleicht sogar einen echten Business Case? Anhand einer idealisierten  Geschichte soll verdeutlicht werden, welche Chancen die Agilität bietet  und warum sich ein Umstieg rechnet.</p></blockquote>
<p><img class="alignleft size-full wp-image-5102" src="http://blog.codecentric.de/wp-content/uploads/2010/09/bt_magazin.png" alt="" width="200" height="283" />In der aktuellen Ausgabe des <a href="http://it-republik.de/business-technology/" target="_blank">Business Technology </a>Magazins beschreiben Andreas und ich anhand einer fiktiven Geschichte, warum sich Agilität auch aus finanzieller Sicht für Unternehmen lohnt.</p>
<p>Die 4 Kernthesen für den Business Case für Agilität sind dabei:</p>
<ol>
<li>Schneller geschäftlicher Nutzen und Time to Market</li>
<li>Weniger Fehl- und Blindleistungen</li>
<li>Risikomanagement von komplexen Situationen</li>
<li>Hohe und nachhaltige Qualität</li>
</ol>
<p>Den vollständigen Artikel kann man von unserer Webseite herunterladen: <a title="Business Case für Agilität" href="http://www.codecentric.de/de/m/kompetenzen/publikationen/artikel/publikation.html?id=/inhalte/publikationen/artikel/2009_2010/business-case-fuer-agilitaet" target="_blank">Business Case für Agilität</a></p>
<div class="dzone_button" style="float: right; margin: 10px 0;">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&url=http%3A%2F%2Fblog.codecentric.de%2F2010%2F09%2Fbusiness-case-fur-agilitat%2F&title=Business+Case+f%C3%BCr+Agilit%C3%A4t" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div><img src="http://feeds.feedburner.com/~r/codecentric/~4/vtxTtfJoIi8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/09/business-case-fur-agilitat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2010/09/business-case-fur-agilitat/</feedburner:origLink></item>
		<item>
		<title>Softwarearchitektur-Workshop mit Dana Bredemeyer und Meet the Experts</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/1EALYrryWP0/</link>
		<comments>http://blog.codecentric.de/2010/09/architektur-workshop-mit-dana-bredemeyer-und-meet-the-experts/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 15:31:36 +0000</pubDate>
		<dc:creator>Uwe Friedrichsen</dc:creator>
				<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Konferenzen]]></category>
		<category><![CDATA[meet the experts]]></category>
		<category><![CDATA[Architektur Workshop]]></category>
		<category><![CDATA[Dana Bredemeyer]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=5097</guid>
		<description><![CDATA[Nun denn, ich versuche einmal, den wahrscheinlich kürzesten Post zu schreiben, der jemals auf dem codecentric Blog erschienen ist &#8230; Worum geht&#8217;s? Ich wollte nur diejenigen unter Euch, die es noch nicht wissen, kurz darauf hinweisen, dass Dana Bredemeyer seinen &#8230; <a href="http://blog.codecentric.de/2010/09/architektur-workshop-mit-dana-bredemeyer-und-meet-the-experts/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nun denn, ich versuche einmal, den wahrscheinlich kürzesten Post zu schreiben, der jemals auf dem codecentric Blog erschienen ist &#8230; <img src='http://blog.codecentric.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Worum geht&#8217;s?</p>
<p>Ich wollte nur diejenigen unter Euch, die es noch nicht wissen, kurz darauf hinweisen, dass <a href="http://www.bredemeyer.com/">Dana Bredemeyer</a> seinen bekannten Software Architektur Workshop vom 13.9.2010 &#8211; 16.9.2010 bei codecentric halten wird. Dana hat seit fast 10 Jahren keinen öffentlichen Workshop in Deutschland gehalten und von allem, was ich bislang darüber gehört habe, wird das ein wirklich guter Kurs werden. Also, falls irgend jemand von Euch Interesse an dem Workshop haben sollte und dafür nicht extra in die USA reisen möchte (oder darf): Mehr Infos gibt es unter <a href="http://www.meettheexperts.de/software-architecture">http://www.meettheexperts.de/software-architecture</a>.</p>
<p>Außerdem wollte ich das &#8220;Meet the Experts&#8221; am 17.9.2010 erwähnen. Das Motto lautet dieses Mal &#8220;Herausforderungen in der Architektur heute&#8221;. Fünf bekannte Sprecher, darunter Dana Bredemeyer, Dr. Gernot Starke und Prof. Dr. Heinz Züllighoven werden ihre An- und Einsichten zu dem Thema mit Euch teilen. Und wie immer wird es jede Menge Zeit für Diskussionen, Netzwerken, Open Space für Eure Fragen, super Catering, usw. geben. Falls das für jemanden von Euch interessant klingen sollte: Mehr Infos dazu gibt es unter <a href="http://www.meettheexperts.de/meettheexperts-architektur">http://www.meettheexperts.de/meettheexperts-architektur</a>.</p>
<p>Okay, das war&#8217;s schon. Mehr wollte ich gar nicht erzählen. Ich denke, dass beide Veranstaltungen echt spannend werden und werde auf jeden Fall dabei sein. Und falls jemand von Euch da sein sollte, freue ich mich schon darauf, Dich (oder Sie) kennenzulernen &#8230; und falls nicht, klappt es vielleicht ein anderes Mal mit dem Kennenlernen &#8230;</p>
<div class="dzone_button" style="float: right; margin: 10px 0;">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&url=http%3A%2F%2Fblog.codecentric.de%2Fen%2F2010%2F09%2Farchitecture-workshop-with-dana-bredemeyer-and-meet-the-experts%2F&title=Software+Architecture+Workshop+with+Dana+Bredemeyer+and+Meet+the+Experts" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div><img src="http://feeds.feedburner.com/~r/codecentric/~4/1EALYrryWP0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/09/architektur-workshop-mit-dana-bredemeyer-und-meet-the-experts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2010/09/architektur-workshop-mit-dana-bredemeyer-und-meet-the-experts/</feedburner:origLink></item>
		<item>
		<title>Einfache Performanceanalyse mit AppDynamics Lite</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/aoTA-rhDXKQ/</link>
		<comments>http://blog.codecentric.de/2010/08/einfache-performanceanalyse-mit-appdynamics-lite/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 10:30:12 +0000</pubDate>
		<dc:creator>Fabian Lange</dc:creator>
				<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4893</guid>
		<description><![CDATA[AppDynamics ist der aufgehende Stern am Application Performance Management Himmel. Mirko beschreibt sehr schön in seinem Eintrag &#8220;Java Troubleshooting in Produktion: Vorstellung von AppDynamics Lite&#8221; warum AppDynamics die richtigen Antworten auf fast alle Fragen in modernen verteilten Architekturen gibt. Dabei &#8230; <a href="http://blog.codecentric.de/2010/08/einfache-performanceanalyse-mit-appdynamics-lite/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>AppDynamics ist der aufgehende Stern am <strong>Application Performance Management</strong> Himmel.</p>
<p>Mirko beschreibt sehr schön in seinem Eintrag &#8220;<a href="http://blog.codecentric.de/2010/08/java-troubleshooting-in-produktion-vorstellung-von-appdynamics-lite/">Java Troubleshooting in Produktion: Vorstellung von AppDynamics Lite</a>&#8221; warum AppDynamics die richtigen Antworten auf fast alle Fragen in modernen verteilten Architekturen gibt.</p>
<p>Dabei ist ein wesentliches Versprechen von AppDynamics die <strong>Einfachheit</strong>. Einfache Installation, einfacher Betrieb und schnelle Ergebnisse. Das klingt ungewöhnlich, und fast schon unglaubwürdig. Dass dies aber tatsächlich so ist zeigen folgende ungekürzte Screencasts.<br />
<span id="more-4893"></span><br />
Die Installation von AppDynamics Lite, der kostenlosen Version der Monitoringlösung, ist wirklich kinderleicht. In diesem Screencast zeige ich die wenigen dafür notwendigen Schritte (Vollbildmodus ist unten rechts aktivierbar):</p>
<p><object id="scPlayer" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="575" height="395" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="data" value="http://content.screencast.com/users/FabianLange/folders/Default/media/af36cc46-5b12-42ba-ace1-046a6a50795a/bootstrap.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="thumb=http://content.screencast.com/users/FabianLange/folders/Default/media/af36cc46-5b12-42ba-ace1-046a6a50795a/FirstFrame.jpg&amp;containerwidth=575&amp;containerheight=395&amp;content=http://content.screencast.com/users/FabianLange/folders/Default/media/af36cc46-5b12-42ba-ace1-046a6a50795a/appdynamics-lite-installation-deutsch.swf&amp;blurover=false" /><param name="allowFullScreen" value="true" /><param name="scale" value="showall" /><param name="allowScriptAccess" value="always" /><param name="base" value="http://content.screencast.com/users/FabianLange/folders/Default/media/af36cc46-5b12-42ba-ace1-046a6a50795a/" /><param name="src" value="http://content.screencast.com/users/FabianLange/folders/Default/media/af36cc46-5b12-42ba-ace1-046a6a50795a/bootstrap.swf" /><embed id="scPlayer" type="application/x-shockwave-flash" width="575" height="395" src="http://content.screencast.com/users/FabianLange/folders/Default/media/af36cc46-5b12-42ba-ace1-046a6a50795a/bootstrap.swf" base="http://content.screencast.com/users/FabianLange/folders/Default/media/af36cc46-5b12-42ba-ace1-046a6a50795a/" allowscriptaccess="always" scale="showall" allowfullscreen="true" flashvars="thumb=http://content.screencast.com/users/FabianLange/folders/Default/media/af36cc46-5b12-42ba-ace1-046a6a50795a/FirstFrame.jpg&amp;containerwidth=575&amp;containerheight=395&amp;content=http://content.screencast.com/users/FabianLange/folders/Default/media/af36cc46-5b12-42ba-ace1-046a6a50795a/appdynamics-lite-installation-deutsch.swf&amp;blurover=false" bgcolor="#FFFFFF" quality="high" data="http://content.screencast.com/users/FabianLange/folders/Default/media/af36cc46-5b12-42ba-ace1-046a6a50795a/bootstrap.swf"></embed></object></p>
<p>Direkt nach der Installation kann dann mit der Problemsuche begonnen werden. Im folgenden Screencast sind die Grundfunktionen erläutert und ich zeige wie man einer Problemursache auf den Grund gehen kann (Vollbildmodus ist unten rechts aktivierbar):<br />
<object id="scPlayer" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="587" height="367" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="data" value="http://content.screencast.com/users/FabianLange/folders/Default/media/92072b62-e55b-46e4-bcc6-91352d7e414b/bootstrap.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="thumb=http://content.screencast.com/users/FabianLange/folders/Default/media/92072b62-e55b-46e4-bcc6-91352d7e414b/FirstFrame.jpg&amp;containerwidth=587&amp;containerheight=367&amp;content=http://content.screencast.com/users/FabianLange/folders/Default/media/92072b62-e55b-46e4-bcc6-91352d7e414b/appdynamics-usage-deutsch.swf&amp;blurover=false" /><param name="allowFullScreen" value="true" /><param name="scale" value="showall" /><param name="allowScriptAccess" value="always" /><param name="base" value="http://content.screencast.com/users/FabianLange/folders/Default/media/92072b62-e55b-46e4-bcc6-91352d7e414b/" /><param name="src" value="http://content.screencast.com/users/FabianLange/folders/Default/media/92072b62-e55b-46e4-bcc6-91352d7e414b/bootstrap.swf" /><embed id="scPlayer" type="application/x-shockwave-flash" width="587" height="367" src="http://content.screencast.com/users/FabianLange/folders/Default/media/92072b62-e55b-46e4-bcc6-91352d7e414b/bootstrap.swf" base="http://content.screencast.com/users/FabianLange/folders/Default/media/92072b62-e55b-46e4-bcc6-91352d7e414b/" allowscriptaccess="always" scale="showall" allowfullscreen="true" flashvars="thumb=http://content.screencast.com/users/FabianLange/folders/Default/media/92072b62-e55b-46e4-bcc6-91352d7e414b/FirstFrame.jpg&amp;containerwidth=587&amp;containerheight=367&amp;content=http://content.screencast.com/users/FabianLange/folders/Default/media/92072b62-e55b-46e4-bcc6-91352d7e414b/appdynamics-usage-deutsch.swf&amp;blurover=false" bgcolor="#FFFFFF" quality="high" data="http://content.screencast.com/users/FabianLange/folders/Default/media/92072b62-e55b-46e4-bcc6-91352d7e414b/bootstrap.swf"></embed></object></p>
<p>AppDynamics Lite ist sowohl für Entwicklungs- als auch für Produktionsysteme geeignet. Es lässt sich in kürzester Zeit installieren, benötigt keine Konfiguration und liefert schon in den ersten Minuten wertvolle Ergebnisse. Die kostenlose Lite Version ist auf <a href="http://www.appdynamics.com/free">appdynamics.com/free</a> herunterladbar.</p>
<div class="dzone_button" style="float: right; margin: 10px 0;">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&url=http%3A%2F%2Fblog.codecentric.de%2Fen%2F2010%2F08%2Feasy-performance-analysis-with-appdynamics-lite%2F&title=Easy+Performance+Analysis+with+AppDynamics+Lite" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div><img src="http://feeds.feedburner.com/~r/codecentric/~4/aoTA-rhDXKQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/08/einfache-performanceanalyse-mit-appdynamics-lite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2010/08/einfache-performanceanalyse-mit-appdynamics-lite/</feedburner:origLink></item>
		<item>
		<title>Java Troubleshooting in Produktion: Vorstellung von AppDynamics Lite</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/zyDk6rVlZE4/</link>
		<comments>http://blog.codecentric.de/2010/08/java-troubleshooting-in-produktion-vorstellung-von-appdynamics-lite/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 20:58:10 +0000</pubDate>
		<dc:creator>Mirko Novakovic</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=5005</guid>
		<description><![CDATA[Die Performance und Stabilität von Java Applikationen in Produktion wird mehr und mehr unternehmenskritisch. Viele (wenn nicht alle) wichtigen Geschäftsprozesse basieren heute auf Software. Der Ausfall oder eine schlechte Performance von Anwendungen wirkt sich dadurch direkt auf den Umsatz eines &#8230; <a href="http://blog.codecentric.de/2010/08/java-troubleshooting-in-produktion-vorstellung-von-appdynamics-lite/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Die Performance und Stabilität von Java Applikationen in Produktion wird mehr und mehr unternehmenskritisch. Viele (wenn nicht alle) wichtigen Geschäftsprozesse basieren heute auf Software. Der Ausfall oder eine schlechte Performance von Anwendungen wirkt sich dadurch direkt auf den Umsatz eines Unternehmens aus. Immer mehr Unternehmen nutzen zudem Web- und Mobiltechnologien, um Kunden oder Partner in die Geschäftsprozesse zu integrieren. Diese Anwendungen nutzen in der Regel unterschiedlichste Services, um das gewünschte Ergebnis zu erzielen oder zu präsentieren. Die Systemarchitektur dieser Services und Applikationen ist immer stärker virtualisiert und wandert in private oder öffentliche Clouds.</p>
<p><span id="more-5005"></span>In einem kürzlich erschienen Artikel schreibt<a href="http://www.omnisophie.com/"> Gunther Dueck</a> von IBM, dass man versuchen kann die &#8220;guten alten Zeiten&#8221; zu romantisieren, in denen alles viel besser und einfacher gewesen ist, aber am Ende wird man sich mit SOA, Cloud und Mobilen Apps anfreunden müssen &#8211; sie sind da und werden auch nicht wieder verschwinden.</p>
<p>Als &#8220;Feuerwehr&#8221; für Enterprise Anwendungen müssen wir natürlich auch mit diesen Gegebenheiten auseinandersetzen und wir sehen auch eine große Veränderung bei den Problemfelder, die wir für unsere Kunden im Java Web- und Enterprise Umfeld lösen müssen. Waren es bisher eher Code- und Design Probleme, wie schlecht konfigurierte Hibernate Mappings oder Memory Leaks, die ein System in die Knie gezwungen haben, so sind die es heute immer häufiger Probleme, deren Ursache in der Architektur einer Anwendung zu suchen ist &#8211; also Problemfelder die auf Grund von steigender Komplexität und hoher Abhängigkeit von Anwendungen zu externen Services resultieren. Zudem steigen auch die Anforderungen an Performance und Skalierbarkeit der Anwendungen &#8211; manchmal auch schneller als man es vorab geplant hatte. Eine Anwendung kann vielleicht problemlos 5.000 Anwender verkraften &#8211; aber schafft sie auch 100.000? Welche der 20 Services die benötigt werden ist die Ursache für eine schlechte Performance? Was passiert, wenn einer dieser Services nicht verfügbar ist?</p>
<p>Diese Fragen werden meistens erst in Produktion beantwortet. Treten dort Probleme auf, dann stellt sich die Anwendung häufig als &#8220;großer, dunkler Raum&#8221; dar, in dem die Suche nach der Ursache des Problems nicht einfach ist und in der Praxis lang und teuer werden kann.</p>
<p>Immer kürzere Entwicklungszyklen durch agile Entwicklungsmethoden, verschärfen die Situation noch zusätzlich. Die Halbwertszeit des Wissens über eine Anwendung liegt dann bei maximal 2-4 Wochen. Einige Internet Unternehmen wie Flickr bringen <a href="http://www.slideshare.net/jallspaw/10-deploys-per-day-dev-and-ops-cooperation-at-flickr">bis zu 10 Mal pro Tag</a> eine neue Version Ihrer Anwendung in Produktion.</p>
<p>Wie können wir also die Performance und Stabilität solcher Anwendungen sicherstellen? Profiler sind für Produktion nicht geeignet &#8211; sie haben i.d.R. einen viel zu hohen Overhead und sind für Entwicklungsumgebungen bzw. den Entwicklerarbeitsplatz konzipiert. In diesen Umgebungen hat man allerdings kein Abbild der verteilten Produktionsumgebung, sondern eine lokale Installation, so dass Probleme, die unter Last oder Parallelität entstehen, so gut wie nicht nachgestellt werden können.</p>
<p>Klassische Monitoring und Application Performance Management (APM) Werkzeuge sind in vielen Fällen nicht für verteilte und hoch frequentierte Systeme konzipiert, so dass sie nicht die Daten liefern können, die wir für die Analyse der Probleme benötigen. Zudem adaptieren sie die Änderungen in Anwendungen nicht automatisch, was zu sehr hohen Aufwände für Instrumentierung und Konfiguration führt &#8211; oft enden diese Produkte dann als reines System-Monitoring Werkzeug, da ein Anwendungsmonitoring für viele, sich schnell ändernde Anwendungen garnicht möglich ist.</p>
<p>AppDynamics, ein Start-up aus San Francisco hat ein APM Tool entwickelt, das sie selber  &#8220;next generation performance management tool&#8221; nennen. Es wurde von Grund auf für Monitoring und Diagnose von verteilten SOA und Cloud Anwendungen in <strong>Produktion</strong> konzipiert. AppDynamics überwacht verteilten Java EE Applikationen ohne das man eine spezielle Instrumentierung oder Konfiguration benötigt. Es erstellt automatisch eine so genannte &#8220;Applikations Landkarte&#8221; (siehe Screenshot), die alle wichtigen Aufrufe (JMS, DB, Webservices, &#8230;) mit Anzahl und Antwortzeit anzeigt. So erhält man in wenigen Minuten eine Übersicht, über das Laufzeitverhalten seiner Applikationen. Dazu erhält man auch einen Callstack aller wichtigen Business-Transaktionen mit Details bis auf Methoden-Level. Hierzu verwendet AppDynamics eine patentierte Technologie, die fast ohne Bytecodeinstrumentierung der Anwendung auskommt. Dies führt zu einem niedrigen Overhead von maximal 2% und zudem zu einer Vermeidung von aufwendiger Instrumentierung und Konfiguration. Zudem werden nur die Informationen angezeigt, die benötigt werden &#8211; so wird die Datenmenge reduziert und die Analyse schneller und einfacher. Dazu verwendet AppDynamics eine intelligente Regelmaschine, die auf Basis von Statistiken und vorkonfigurierten Regeln ermittelt, welche Daten erfasst werden müssen. Innerhalb von weniger als 15 Minuten hat man AppDynamics installiert und erhält alle benötigten Informationen, um die Problemursachen zu analysieren.</p>
<p><img src="http://blog.codecentric.de/wp-content/uploads/2010/08/appdynamics_standalone-600x308.png" alt="" width="580" height="308" /></p>
<p>Hört sich unrealistisch an? Habe ich auch gedacht, als ich zum ersten Mal mit dem AppDynamics Team geredet habe. Die gute Nachricht ist aber, dass es eine kostenfreie Version von AppDynamics gibt: AppDynamics Lite. Damit kann man langsame Antwortzeiten, SQLs, Fehler und Deadlocks in Produktion analysieren und sich selber einen Eindruck von dem Werkzeug machen. Die Lite Edition ist zwar gegenüber der kommerziellen Variante limitiert, aber oftmals ausreichend, um ein Problem zu analysieren. Das Tool ist in weniger als 15 Minuten einsatzbereit, so dass ich nur empfehlen kann es einfach mal runterzuladen und auszuprobieren:  <a href="http://www.appdynamics.com/free" target="_blank">http://www.appdynamics.com/free</a></p>
<p>Fabian, unser Competence Center Leiter Performance, zeigt <a href="http://blog.codecentric.de/2010/08/einfache-performanceanalyse-mit-appdynamics-lite/">in seinem Eintrag in zwei Screencasts</a> wie man AppDynamics Lite in 5 Minuten installiert und danach mit Hilfe der Informationen echte Probleme analysieren kann.</p>
<div class="dzone_button" style="float: right; margin: 10px 0;">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&url=http%3A%2F%2Fblog.codecentric.de%2Fen%2F2010%2F08%2Ftroubleshoot-java-in-production-introducing-appdynamics-lite%2F&title=Troubleshoot+Java+in+production+%26%238211%3B+introducing+AppDynamics+Lite" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div><img src="http://feeds.feedburner.com/~r/codecentric/~4/zyDk6rVlZE4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/08/java-troubleshooting-in-produktion-vorstellung-von-appdynamics-lite/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2010/08/java-troubleshooting-in-produktion-vorstellung-von-appdynamics-lite/</feedburner:origLink></item>
		<item>
		<title>Zahlengläubigkeit</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/O-Re7Kgz-bo/</link>
		<comments>http://blog.codecentric.de/2010/08/zahlenglaubigkeit/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 07:39:00 +0000</pubDate>
		<dc:creator>Dr. Raymond Georg Snatzke</dc:creator>
				<category><![CDATA[Mathematicians view]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Performance-Tests]]></category>
		<category><![CDATA[Testbericht]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4975</guid>
		<description><![CDATA[So ungefähr sieht meines Erachtens nach ein typisches Albtraumszenario eines Performance-Testers aus: Eine neue Version eines Testobjekts findet den Weg in meine Hände. Nach etwas Herumkonfigurieren, um das Ding ans Laufen zu kriegen, führe ich einen kurzen, ersten Testlauf durch. &#8230; <a href="http://blog.codecentric.de/2010/08/zahlenglaubigkeit/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>So ungefähr sieht meines Erachtens nach ein typisches Albtraumszenario eines Performance-Testers aus: Eine neue Version eines Testobjekts findet den Weg in meine Hände. Nach etwas Herumkonfigurieren, um das Ding ans Laufen zu kriegen, führe ich einen kurzen, ersten Testlauf durch. Irgendjemand – Entwicklung, Architektur, Projektmanagement, wer auch immer – bekommt davon Wind und ist neugierig auf die Ergebnisse. Ich versuche es mit einer Verzögerungstaktik: „Es ist der allererste Lauf. Die Testumgebung ist noch gar nicht vollständig aufgebaut. Wir müssen noch mehr Tests durchführen. Erst müssen wir die Zahlen bestätigen, bevor es irgendeinen Sinn ergibt, sie zu diskutieren.“ Mein Gegenüber gibt nicht auf und bohrt weiter. Er sei sich aller meiner Bedenken bewusst und wolle nur seine Neugier befriedigen. Letztendlich gebe ich nach und liefere die Zahlen, was ich schon kurz darauf zutiefst bereue. Mein kleines Fitzelchen an Information hat wie eine Lawine in Null-komma-Nichts eine gigantische Größe erreicht und kommt wie ein Bumerang zu mir zurück.<br />
<span id="more-4975"></span><br />
Fälle wie dieser sind oftmals die Folge einer übermäßigen Zahlengläubigkeit. Wenn etwas getestet und quantifiziert ist, vertraut man gerne den Ergebnissen und verlässt sich auf diese, ohne die konkreten Umstände zu berücksichtigen. Selbst ein allererster Messpunkt wird häufig gewichtet und auf eine Art und Weise diskutiert, als läge eine ausgefeilte und vollständige Testserie zugrunde. Sind die Zahlen schlecht, führt dies manchmal zu hektischen und gar sonderlichen Aktivitäten wie z.B. Eskalation, Krisensitzungen und eventuell sogar Maßnahmen seitens des Managements. Sind die Zahlen unerwartet gut, könnte eine voreilige Entwarnung die Folge sein.</p>
<p>Sogar der Performance-Tester selbst kann für solche Fehler anfällig sein. Ich kann hier aus eigener Erfahrung sprechen&#8230; Entweder, weil er ein bestimmtes Ergebnis wünscht oder erwartet, oder aus schlichter Routine heraus, kann er in Versuchung sein, seine gerade selbst ermittelten Zahlen zu schnell zu glauben. Anwendungssysteme und ihre Konfiguration sind oftmals sehr komplex, so dass man leicht kleine Änderungen mit möglicherweise großen Auswirkungen auf die Testergebnisse vergessen oder übersehen kann.</p>
<p>Dieser anscheinend unerschütterliche Glaube an die Gültigkeit von Zahlen kann noch viele andere ungünstige Folgen haben. Oftmals wird schon ein einzelner Datenpunkt hoffnungslos überanalysiert, indem z.B. mögliche  zukünftige Performance-Verbesserungen extrapoliert werden oder die Effekte auf ein n-Mal größeres System und so weiter. Falls dann weitere Tests diese Erwartungen nicht erfüllen, setzt manchmal eine hektische Suche nach der vermuteten versteckten Ursache der „falschen“ Zahlen ein, anstatt zu bedenken, dass man von Anfang an unvergleichbare Dinge verglichen hat. Ebenso werden manchmal bereits korrekt berichtete und archivierte Zahlen wiederentdeckt, aber ihr Kontext vergessen, was zu ebenso falschen Interpretationen, Schlüssen und Maßnahmen führen kann.</p>
<p>Meist ist es kaum möglich, erfolgreich gegen diese Zahlengläubigkeit zu argumentieren, darauf zu beharren, dass weitere Tests zur Bestätigung nötig sind und dass große Schwankungen ganz normal sind. Performance-Messungen als Teil der Qualitätssicherung in der Anwendungsentwicklung sind keine exakte Wissenschaft. Da die oberste Priorität normalerweise ist, „etwas ans Laufen zu kriegen“, sind die Vorbedingungen eines kontrollierten Experimentes wie in der akademischen Welt nur selten gegeben. Die Ergebnisse solcher Experimente werden aber oft genau so betrachtet und behandelt.</p>
<p>Als Performance-Tester sollte man sich bewusst sein, welche möglichen Auswirkungen die berichteten Testergebnisse haben können. Testen, besonders Performance-Testen, soll Unsicherheit durch Wissen ersetzen, aber der unvorsichtige Umgang mit Testergebnissen kann schnell zum entgegengesetzten Resultat führen. Meines Erachtens sollte die oberste Regel sein, nur Daten zu berichten, die man selbst verstanden hat, zu denen man stehen und die man verteidigen kann. Man sollte sich immer über die Belastbarkeit, Reichweite, Relevanz und Vergleichbarkeit der Zahlen im Klaren sein, die man berichtet, und diese Charakteristika ebenso berichten. Und es ist ratsam, explizit darauf hinzuweisen, falls eine Messung nur für einen bestimmten Testaufbau Aussagekraft besitzt und für weitere Hochrechnungen ungeeignet ist.</p>
<p>Falls eine Fehlinterpretation von Testergebnissen passiert, sollte man schnell, deutlich und mit Nachdruck die Sichtweise des Testers auf die Zahlen und ihren Kontext darstellen, um den möglichen Schaden zu begrenzen. Zahlen, die einmal in der Welt sind, nehmen gerne ein Eigenleben an. Wie bei Gerüchten ist es praktisch unmöglich, sie wieder einzufangen. Daher sollte man stets sorgfältig bedenken, was man wann berichtet.</p>
<p>Und ein letzter Rat: Als Performance-Tester sollte man sich immer einen skeptischen Blick auf die eigene Arbeit und auch auf die eigenen Instinkte bewahren. Andere Leute sollten Testergebnissen nicht blind glauben – und auch der Tester selbst sollte dies nicht tun.</p>
<div class="dzone_button" style="float: right; margin: 10px 0;">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&url=http%3A%2F%2Fblog.codecentric.de%2Fen%2F2010%2F08%2Fbelieving-in-numbers%2F&title=Believing+in+Numbers" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div><img src="http://feeds.feedburner.com/~r/codecentric/~4/O-Re7Kgz-bo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/08/zahlenglaubigkeit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2010/08/zahlenglaubigkeit/</feedburner:origLink></item>
		<item>
		<title>Richfaces Session Speicherverbrauch – Analyse eines Memory-Leaks</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/9EvZyQz1KRE/</link>
		<comments>http://blog.codecentric.de/2010/08/richfaces-session-speicherverbrauch-analyse-eines-memory-leaks/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 16:35:42 +0000</pubDate>
		<dc:creator>Fabian Lange</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Heapdump]]></category>
		<category><![CDATA[Memoryleak]]></category>
		<category><![CDATA[OutOfMemoryError]]></category>
		<category><![CDATA[Richfaces]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4942</guid>
		<description><![CDATA[Für die Entwicklung von JSF basierten Webseiten ist das Richfaces Framework ein gern genommenes Werkzeug. Es ist ein solides Framework mit umfassender Funktionalität, guter Dokumentation und einer Vielzahl von Komponenten. Mitgeliefert wird auch ein Ajax Framework namens Ajax4JSF (auch a4j &#8230; <a href="http://blog.codecentric.de/2010/08/richfaces-session-speicherverbrauch-analyse-eines-memory-leaks/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Für die Entwicklung von JSF basierten Webseiten ist das <a href="http://www.jboss.org/richfaces">Richfaces Framework</a> ein gern genommenes Werkzeug. Es ist ein solides Framework mit umfassender Funktionalität, guter Dokumentation und einer Vielzahl von Komponenten. Mitgeliefert wird auch ein Ajax Framework namens <a href="http://en.wikipedia.org/wiki/Ajax4jsf">Ajax4JSF</a> (auch a4j genannt). Deployt man nun eine solche Anwendung in das weite Internet in Produktion, so stellen viele Leute fest, daß der Speicherverbrauch stark ansteigt und in nicht mehr reagierenden Systemen oder OutOfMemoryError Abstürzen resultiert. Die Ursache hierfür ist ein Designproblem in JSF / A4J und kann leider nicht einfach behoben, jedoch aber umgangen werden. Beginnen wir aber zuerst mit einer Analyse des Problems in einer ansonsten gut funktionierenden Anwendung.<br />
<span id="more-4942"></span></p>
<p><strong>Ursachenforschung</strong></p>
<p>Bei Speicherproblemen ist das Mittel der Wahl fast immer ein HeapDump um festzustellen was genau den Speicher belegt.<br />
Nachdem man nun einen solchen Dump in dem fabelhaften <a href="http://www.eclipse.org/mat/">Eclipse MAT</a> geöffnet hat, so erhält man zum Beispiel ein Bild wie dieses:</p>
<p><img class="aligncenter size-full wp-image-4863" title="richfaces-sessions" src="http://blog.codecentric.de/wp-content/uploads/2010/08/richfaces-sessions.png" alt="" width="538" height="441" /></p>
<p>Ouch. 1.8 GB der 2GB sind von Sessions belegt. Ich filtere dafür üblicherweise nach &#8220;StandardSession&#8221; um die Apache Sessions einzeln zu sehen und mich leicht in diesen umsehen zu können. Besonderes Augenmerk lege ich darauf was relativ viel Speicher belegt (retained heap).</p>
<p><img class="aligncenter size-full wp-image-4866" title="richfaces-sessions-per-session" src="http://blog.codecentric.de/wp-content/uploads/2010/08/richfaces-sessions-per-session.png" alt="" width="533" height="170" /></p>
<p>Schonwieder ouch&#8230; 10MB pro Session. Das kann nicht funktionieren. Nun es wäre möglich, daß ein unvorsichtiger Programmierer so viele Daten in die Session gelegt hat, doch dies stimmt nicht, wie wir leicht herausfinden können:</p>
<p><img src="http://blog.codecentric.de/wp-content/uploads/2010/08/richfaces-session-detail.png" alt="" title="richfaces-session-detail" width="590" height="435" class="aligncenter size-full wp-image-4964" /></p>
<p>Interessant! Fast der gesamte Speicher einer Session wird also von AjaxStateHolders belegt. Also, was genau macht dieses Ding eigentlich?</p>
<p><strong>Wie JSF und A4J arbeiten</strong></p>
<p>Ich beschreibe das verhalten etwas vereinfachend. Bevor JSF das HTML für den Browser des Benutzers erzeugt baut es eine interne Darstellung auf. Für jede Seite (oder View) wird diese interne Darstellung (auch Component Tree genannt) erstellt und durch den JSF lifecycle geschleust. Jegliche Benutzerinteraktionen werden dabei verarbeitet. Gibt es zum Beispiel eine Auswahlkomponente mit 3 Einträgen, so werden diese 3 Einträge gelesen und an den Component Tree gehängt. Die Komponente selber hält fest welcher Eintrag ausgewählt ist.</p>
<p>Nun wollen wir nicht daß der Benutzer die Seite abschicken muss um seine Auswahl zu tätige, welches in einem Neuaufbau des Component Tree resultieren würde. Wir möchten dafür Ajax verwenden! Damit dies möglich wird muss sich A4J an den Zustand der Komponenten erinnern wie er war als die Seite erzeugt wurde. Die Komponente und die 3 Einträge sind also bekannt und wenn der Benutzer eine Auswählt wird der Zustand der Komponente verändert und der Teil der Seite aktualisiert auf dem die Komponente angezeigt wird. Dies nennt man teilweise Seitendarstellung (partial page rendering).</p>
<p>Wie funktioniert nun dieses &#8220;erinnern&#8221;? Ganz einfach: Es erzeugt einen AjaxStateHolder in der Benutzersession und hängt an diesen den Component Tree.</p>
<p><strong>Es wächst</strong></p>
<p>Ok, es ist also die aktuelle Seite und sein Component Tree. Das können zwar große Bäume sein, aber doch nur einer pro Benutzer? Dies ist leider nicht ganz richtig. A4J speichert mehr als nur einen View. Aber warum? Nun, Browser haben einen Knopf, der es erlaubt auf die vorherige Seite zurückzukehren. Klickt man diesen Knopf an, so wird aber nicht die Seite neu angefordert, sondern aus dem Browsercache dargestellt. Der Server weiß also garnicht daß der Browser die letzte Seite anzeigt. Benutzt man dann Ajax Funktionalität, so muss der Server den Zustand kennen der zu dem Zeitpunkt auf dem Server existiert hat. Woher soll der Server diesen Zustand noch kennen? Einfach: Dieser ist natürlich auch im AjaxStateHolder. Standardmäßig werden <strong>16 Views</strong> gespeichert. Und weil man während einer Sitzung an dem gleichen View mehrmals vorbeikommen kann, werden jeweils <strong>16 Varianten</strong> der Views erstellt.</p>
<p>Offensichtlich kann dies doch sehr viel werden. Und das pro User.</p>
<p><strong>Ein Lösungsansatz</strong></p>
<p>Leider gibt es keine Lösung. So funktioniert JSF und so funktioniert A4J.</p>
<p>Im Richfaces Bug Tracker gibt es auch ein Ticket zu dem Thema: <a href="https://jira.jboss.org/browse/RF-3878">RF-3878 &#8211; Session memory leak</a>. Und die beste Antwort ist: Reduziere die Anzahl der gespeicherten Views.</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;context-param<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;description<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/description<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;param-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>com.sun.faces.numberOfViewsInSession<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/param-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;param-value<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/param-value<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/context-param<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;context-param<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;description<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/description<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;param-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>com.sun.faces.numberOfLogicalViews<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/param-name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;param-value<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/param-value<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/context-param<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Man verliert Teile der &#8220;Zurück&#8221; Knopf Funktionalität, gewinnt aber Unmengen von Speicher.<br />
Die zweite Lösung ist die Component Trees drastisch zu reduzieren. Diese sind aber wahrscheinlich so groß weil es komplexe Strukturen und große Datenlisten gibt, welche sich sehr schwer reduzieren lassen können.</p>
<div class="dzone_button" style="float: right; margin: 10px 0;">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&url=http%3A%2F%2Fblog.codecentric.de%2Fen%2F2010%2F08%2Frichfaces-sessions-eating-memory-analysis-of-a-memory-leak%2F&title=Richfaces+Sessions+Eating+Memory+%26%238211%3B+Analysis+of+a+Memory+Leak" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div><img src="http://feeds.feedburner.com/~r/codecentric/~4/9EvZyQz1KRE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/08/richfaces-session-speicherverbrauch-analyse-eines-memory-leaks/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2010/08/richfaces-session-speicherverbrauch-analyse-eines-memory-leaks/</feedburner:origLink></item>
		<item>
		<title>codecentric startet ihren ersten Podcast</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/wRuASSOy7Yw/</link>
		<comments>http://blog.codecentric.de/2010/08/codecentric-startet-ihren-ersten-podcast/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 11:02:09 +0000</pubDate>
		<dc:creator>Andreas Ebbert-Karroum</dc:creator>
				<category><![CDATA[Agilität]]></category>
		<category><![CDATA[Architektur]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[codecentric]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4938</guid>
		<description><![CDATA[Ein Fünftel der Arbeitszeit aller Mitarbeiter bei codecentric sind der Weiterbildung und der Erforschung und Entwicklung eigener Ideen gewidmet. Ein für die strategische Ausrichtung der Firma wichtiger Aktivposten. Insbesondere bei den Themen, bei denen wir Vordenker sein wollen, sind wir &#8230; <a href="http://blog.codecentric.de/2010/08/codecentric-startet-ihren-ersten-podcast/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ein Fünftel der Arbeitszeit aller Mitarbeiter bei codecentric sind der Weiterbildung und der Erforschung und Entwicklung eigener Ideen gewidmet. Ein für die strategische Ausrichtung der Firma wichtiger Aktivposten. Insbesondere bei den Themen, bei denen wir Vordenker sein wollen, sind wir da natürlich besonders aktiv. In den Themengebieten Agilität, Architektur, Enterprise Content Management, Java und Performance entspinnen sich deshalb &#8211; geplant und ungeplant &#8211; immer wieder sehr interessante Diskussionen.</p>
<p>Ab heute gibt es für alle die Möglichkeit diesen Diskussionen teilweise beizuwohnen. Ab heute gibt es den <a href="http://podcast.codecentric.de">codecentric competence center podcast</a>.</p>
<p>Die Leiter der competence center, und ggf. auch geladene Gäste, setzen sich regelmäßig zusammen und diskutieren aktuelle Themen aus den jeweiligen Bereichen. Initial haben wir uns einen 2-wöchigen Rhythmus vorgenommen. Der erste Podcast behandelt die Themen &#8220;Story Points&#8221; und &#8220;Benennung von Java Klassen&#8221;. Langweilig? Ganz im Gegenteil! Wir hatten sehr viel Spaß bei der Diskussion der Themen.</p>
<p>Ich würde mich über Feedback über Inhalt, Gestaltung, Qualität, Länge, etc. im <a href="http://podcast.codecentric.de/2010/08/04/codecentric-competence-center-podcast-1/#respond">Kommentarbereich des Podcasts</a> freuen. Wer möchte, kann den Podcast auch auf  iTunes <a href="http://www.itunes.com/podcast?id=386155317">abonnieren und bewerten</a>.</p>
<p style="text-align: center;"><a href="http://www.itunes.com/podcast?id=386155317"><img class="aligncenter" title="iTunes Logo" src="http://podcast.codecentric.de/files/2010/08/iTunes.png" alt="" width="126" height="118" /></a></p>
<div class="dzone_button" style="float: right; margin: 10px 0;">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&url=http%3A%2F%2Fblog.codecentric.de%2F2010%2F08%2Fcodecentric-startet-ihren-ersten-podcast%2F&title=codecentric+startet+ihren+ersten+Podcast" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div><img src="http://feeds.feedburner.com/~r/codecentric/~4/wRuASSOy7Yw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/08/codecentric-startet-ihren-ersten-podcast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2010/08/codecentric-startet-ihren-ersten-podcast/</feedburner:origLink></item>
		<item>
		<title>PDF Generierung mit iText</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/gQE9ghhMjPg/</link>
		<comments>http://blog.codecentric.de/2010/08/pdf-generierung-mit-itext/#comments</comments>
		<pubDate>Sun, 08 Aug 2010 08:59:32 +0000</pubDate>
		<dc:creator>Daniel Reuter</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[iText]]></category>
		<category><![CDATA[OpenOffice]]></category>
		<category><![CDATA[PDF]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4701</guid>
		<description><![CDATA[Rückblick: In unserem letztem Sprint Planning Meeting stand die Aufgabe einer PDF-Generierung an. Wir hatten eine grobe Layout-Vorlage vom Kunden bekommen und die Service-Klassen zur Bereitstellung der benötigten Klassen waren ebenfalls schon vorhanden. Dennoch schätzten wir das zugehörige Ticket erstaunlich &#8230; <a href="http://blog.codecentric.de/2010/08/pdf-generierung-mit-itext/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Rückblick: In unserem letztem Sprint Planning Meeting stand die Aufgabe einer PDF-Generierung an. Wir hatten eine grobe Layout-Vorlage vom Kunden bekommen und die Service-Klassen zur Bereitstellung der benötigten Klassen waren ebenfalls schon vorhanden. Dennoch schätzten wir das zugehörige Ticket erstaunlich hoch. Kein Entwickler im Team hatte Erfahrung mit <a href="http://www.itextpdf.com/">iText</a>, gleichzeitig hatte jedoch jeder gruselige iText-Geschichten von anderen Entwickler gehört. Ein Zitat schwebte uns im Ohr: &#8220;Wenn du mit iText arbeitest, liest du früher oder später die <a href="http://www.adobe.com/devnet/pdf/pdf_reference.html">Spezifikation des PDF-Formats</a>.&#8221;<br />
<span id="more-4701"></span></p>
<p>Nach einiger Recherche im Internet und mehreren Interviews anderer Projekt-Teams von codecentric möchte ich heute einen aus meiner Sicht sehr einfachen, robusten und vor allem schnellen Weg vorstellen, PDFs mit iText zu generieren. Das oben genannte Ticket wurde mit diesem Ansatz in einem Viertel der Zeit umgesetzt und die Angst der Team-Mitglieder vor iText ist deutlich gesunken.</p>
<p>iText bietet viele Möglichkeiten, PDFs komplett über die API zu erzeugen; mit allen Linien, Bildern, festen Texten, Farben uvm. Dieser Ansatz wird jedoch schnell sehr komplex und erzeugt sehr langen und fehleranfälligen Quellcode. Einfacher ist hier die Erzeugung eines &#8220;Vordrucks&#8221; mit definierten Inhaltsfeldern. Dieser Vordruck wird in Form eines PDFs mit Formularfeldern gespeichert. Dieses Template-PDF kann jederzeit, z.B. im <a href="http://get.adobe.com/de/reader/">Adobe Reader</a>, betrachtet werden und könnte so z.B. auch schon vor der Befüllung mit Daten mit dem Kunden abgestimmt werden.</p>
<h4>Teil 1 – PDF-Formular erzeugen</h4>
<p>PDF-Formulare lassen sich sehr einfach mit <a href="http://de.openoffice.org/">OpenOffice</a> erzeugen. In meinem Beispiel habe ich OpenOffice Draw verwendet, der Ansatz funktioniert aber gleicherweise mit OpenOffice Writer oder Calc. Im jeweiligen Programm einfach ein neues Dokument anlegen und anschließend nach Belieben mit Texten, Farben oder Linien gestalten. Sobald das Layout fertig ist, müssen die Inhaltsfelder definiert werden. Dabei ist es hilfreich, wenn die Symbolleisten für <em>Formular-Entwurf</em> und <em>Formular-Steuerelemente</em> ausgewählt sind (<em>Ansicht -&gt; Symbolleisten</em>). Mit diesen neuen Icons kann man unter anderem den <em>Formular-Entwurfsmodus</em> aktivieren. Jetzt kann z.B. aus den Formular-Steuerelementen ein Textfeld ausgewählt und in das Dokument eingefügt werden. Über einen Rechtsklick lassen sich die Eigenschaften des Textfelds definieren. Folgende Einstellungen sind interessant:</p>
<ul>
<li>Name : Dieser Name wird später im Java Code zum Befüllen des Feldes referenziert.</li>
<li>Rahmen : Default ist <em>3D-Look</em> – Normalerweise wird wohl <em>ohne Rahmen</em> besser passen.</li>
<li>Hintergrundfarbe, Ausrichtung, Schrift : Hier kann das Layout bestimmt werden. Layout-Angaben im Java Code sind damit überflüssig.</li>
<li>Text-Typ: Normalerweise <em>einzeilig</em>, möchte man jedoch im Java Code Text mit Umbrüchen einfüllen muss hier <em>mehrzeilig</em> ausgewählt werden.</li>
</ul>
<p>Sobald die Formular-Felder keinen Rahmen haben, kann man diese im Dokument nicht mehr einfach erkennen. Hier hilft der Formular-Navigator.</p>
<p>Nach dem Layout und der Erstellung der Formular-Felder kann das Dokument in eine PDF-Vorlage exportiert werden. Die geht mittels <em>Datei &#8211;&gt; Exportieren als PDF</em>. Im folgenden Dialog muss <em>PDF-Formular erzeugen</em> markiert sein.</p>
<div id="attachment_4738" class="wp-caption aligncenter" style="width: 160px"><a href="http://blog.codecentric.de/wp-content/uploads/2010/07/openoffice.png" rel="lightbox"><img class="size-thumbnail wp-image-4738" src="http://blog.codecentric.de/wp-content/uploads/2010/07/openoffice-150x150.png" alt="OpenOffice" width="150" height="150" /></a><p class="wp-caption-text">Editing a formular in OpenOffice</p></div>
<div class="wp-caption aligncenter" style="width: 58px"><a href="http://blog.codecentric.de/wp-content/uploads/2010/07/pdfTemplateExample.odg"><img class="alignnone size-full wp-image-4747" src="http://blog.codecentric.de/wp-content/uploads/2010/07/OpenOfficeIcon.png" alt="" width="48" height="48" /></a><p class="wp-caption-text">OpenOffice - PDF Template</p></div>
<div class="wp-caption aligncenter" style="width: 60px"><a href="http://blog.codecentric.de/wp-content/uploads/2010/07/pdfTemplateExample.pdf"><img class="alignnone size-full wp-image-4749" src="http://blog.codecentric.de/wp-content/uploads/2010/07/pdf-icon.png" alt="" width="50" height="50" /></a><p class="wp-caption-text">Generated PDF Template</p></div>
<h4>Teil 2 – PDF-Formular mit iText befüllen</h4>
<p>Zum Befüllen des PDF-Formulars nutze ich in meinem Beispiel iText in der Version 2.1.7, da in späteren Versionen eine verschärfte <a href="http://itextpdf.com/terms-of-use/">Lizenz</a> verwendet wurde.<br />
Zunächst wird das PDF-Formular eingelesen&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">PdfReader pdfTemplate <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PdfReader<span style="color: #009900;">&#40;</span>pdfTemplateFile<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>&#8230; und ein <em>Stamper</em> mit einem OutputStream erzeugt.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #003399;">ByteArrayOutputStream</span> out <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ByteArrayOutputStream</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
PdfStamper stamper <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PdfStamper<span style="color: #009900;">&#40;</span>pdfTemplate, out<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Damit im erzeugten PDF keine Formularfelder mehr enthalten sind, muss dem Stamper dies über folgendem Aufruf mitgeteilt werden.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">stamper.<span style="color: #006633;">setFormFlattening</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Zum Abschluß können jetzt die Felder gefüllt werden&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">stamper.<span style="color: #006633;">getAcroFields</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setField</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;name&quot;</span>, <span style="color: #0000ff;">&quot;Daniel Reuter&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
stamper.<span style="color: #006633;">getAcroFields</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setField</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;adress&quot;</span>, <span style="color: #0000ff;">&quot;Merscheider Str.1 – 42699 Solingen&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
stamper.<span style="color: #006633;">getAcroFields</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setField</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;dates&quot;</span>, <span style="color: #0000ff;">&quot;2008<span style="color: #000099; font-weight: bold;">\n</span>2009<span style="color: #000099; font-weight: bold;">\n</span>2010<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
stamper.<span style="color: #006633;">getAcroFields</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setField</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;titles&quot;</span>, <span style="color: #0000ff;">&quot;JAX<span style="color: #000099; font-weight: bold;">\n</span>Devoxx<span style="color: #000099; font-weight: bold;">\n</span>JavaOne<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>&#8230;und natürlich die Resourcen geschlossen werden.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">stamper.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
pdfTemplate.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h4>Fazit</h4>
<p>Aus meiner Sicht ein sehr einfacher und leicht verständlicher Ansatz. Sicherlich wird es Szenarien geben, in denen der beschriebene Weg nicht passt. Insbesondere bei dynamischen Layouts stößt man hier an die Grenzen. Dennoch würde ich versuchen, als Grundlage immer ein PDF Template zu verwenden.</p>
<div class="wp-caption aligncenter" style="width: 60px"><br />
<a href="http://blog.codecentric.de/wp-content/uploads/2010/07/pdfResult.pdf"><img class="alignnone size-full wp-image-4749" src="http://blog.codecentric.de/wp-content/uploads/2010/07/pdf-icon.png" alt="" width="50" height="50" /></a><br />
<p class="wp-caption-text">PDF Result</p></div>
<div class="dzone_button" style="float: right; margin: 10px 0;">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&url=http%3A%2F%2Fblog.codecentric.de%2Fen%2F2010%2F08%2Fpdf-generation-with-itext%2F&title=PDF+Generation+with+iText" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div><img src="http://feeds.feedburner.com/~r/codecentric/~4/gQE9ghhMjPg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/08/pdf-generierung-mit-itext/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2010/08/pdf-generierung-mit-itext/</feedburner:origLink></item>
		<item>
		<title>Agile Enterprise – Auswirkungen auf die IT</title>
		<link>http://feedproxy.google.com/~r/codecentric/~3/l8M0ulXWKSc/</link>
		<comments>http://blog.codecentric.de/2010/08/agile-enterprise-auswirkungen-auf-die-it/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 18:36:44 +0000</pubDate>
		<dc:creator>Mirko Novakovic</dc:creator>
				<category><![CDATA[Agilität]]></category>
		<category><![CDATA[Agile Enterprise]]></category>
		<category><![CDATA[Agile Software Development]]></category>
		<category><![CDATA[Agile Software Factory]]></category>
		<category><![CDATA[scrum agile xp jeff sutherland scrummaster certification]]></category>

		<guid isPermaLink="false">http://blog.codecentric.de/?p=4892</guid>
		<description><![CDATA[Gerade eben habe ich in der Computer Woche einen Artikel mit dem Thema &#8220;Sind ERP-Systeme für das Business zu langsam?&#8221; gelesen und dort einen interessanten Begriff entdeckt: Agile Enterprise. Immerhin formuliert von einem Partner und Leiter der Management Beratung bei &#8230; <a href="http://blog.codecentric.de/2010/08/agile-enterprise-auswirkungen-auf-die-it/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Gerade eben habe ich in der <a href="http://www.computerwoche.de/" target="_self">Computer Woche</a> einen Artikel mit dem Thema &#8220;Sind ERP-Systeme für das Business zu langsam?&#8221; gelesen und dort einen interessanten Begriff entdeckt: <strong>Agile Enterprise</strong>. Immerhin formuliert von einem Partner und Leiter der Management Beratung bei Ernst &amp; Young.</p>
<p>Da wir uns starkt mit agiler Software Entwicklung beschäftigen, habe ich mich gefragt, was ein &#8220;Agiles Unternehmen&#8221; ausmacht. Also habe ich mal Google befragt und ein wenig nachgelesen. Eine gute Zusammenfassung findet man bei <a href="http://www.businessdictionary.com/definition/agile-enterprise.html" target="_blank">Business Dictionary</a>:</p>
<p><span id="more-4892"></span></p>
<blockquote><p>Fast moving, <strong>flexible</strong> and robust firm capable of rapid response to <strong>unexpected challenges</strong>, events, and opportunities. Built on policies and processes that facilitate <strong>speed and change</strong>, it aims to achieve <strong>continuous competitive advantage</strong> in serving its customers. Agile enterprises use diffused authority and <strong>flat organizational structure</strong> to speed up information flows among different departments, and develop close, <strong>trust-based relationships</strong> with their customers and suppliers.</p></blockquote>
<p>Grundsätzlich zusammengefasst sind &#8220;Agile Unternehmen&#8221; also die Unternehmen, die besonders schnell und flexibel auf sich ändernde Marktbedingungen reagieren können. In den meisten Artikeln, die ich gefunden habe werden Selbstorganisation und Interaktion zwischen Mitarbeitern und Abteilungen als Basis für agile Unternehmen gesehen. Aber was bedeutet das jetzt für die IT?</p>
<p>Aber zurück zum Artikel. Es geht um große ERP Systeme und das die meisten Unternehmen Schwierigkeiten haben auf die steigende Flexibilität und Geschwindigkeit des Business zu reagieren. Grund sind die hohe Komplexität der Systeme, teilweise schlechte Produktqualität, ein hohes Maß an Customizing an des Systemen und teilweise auch das Alter dieser Monolithen. Bleibt die Aussage: &#8220;<strong>ERP bremst Business!</strong>&#8220;.</p>
<p>Soweit so gut, viele der Aussagen sind bis dahing für mich durchaus nachvollziehbar und sehen wir auch täglich in unseren Projekten. Nicht nur bei ERP Systemen, sondern bei vielen Standardsoftware &#8220;Monstern&#8221; &#8211; beispielsweise auch im Bereich der Versicherungskernsysteme. Ich habe mich immer gefragt, warum man zunächst viele Millionen in Lizenzkosten investiert, dann merkt, dass der &#8220;Standard&#8221; eigentlich nicht zu den eigenen Prozessen passt und man nur 20% der Funktionen benötigt. Deshalb führt man auch erst mal ein mehrjähriges Customizing Projekt durch. Meistens hat man die Software danach soweit angepasst, das sie nicht mehr Release fähig ist oder jedes Upgrade wieder mit hohen Anpassungsaufwänden verbunden ist. Aber das beste kommt noch: ca. 20% muss man jedes Jahr für die Wartung der Standard Software zahlen &#8211; sprich: Alle 5 Jahre hat man die Software noch mal gekauft.</p>
<p>Leider liefert der Artikel nicht wirklich interessante Lösungsszenarien. Zunächst wird bemängelt, dass die Strategien der ERP Hersteller die großen Versprechen von SOA nicht gehalten haben &#8211; insbesondere, weil die SOA von den Herstellern fast ausschließlich technisch betrachtet wurden.</p>
<p>Eine mögliche Lösung wird in der Cloud und in Software as a Service gesehen &#8211; da hat mich der Artikel dann auch entgültig abgehangen. Wenn ich also mein &#8220;Monster&#8221; nicht mehr selber betreibe, sondern in der  &#8220;Wolke&#8221;, dann sind meine Business Probleme weg und ich bin auf einmal flexibel und schnell!? Da scheinen einige der der Experten doch eher im &#8220;Nebel&#8221; zu stehen.</p>
<p>Da ich mich seit einigen Wochen damit beschäftige das &#8220;<a href="http://holykaw.alltop.com/the-real-reason-apple-is-so-innovative" target="_blank">Why</a>&#8221; für unsere Agile Software Factory zu finden, hat mir dieser Artikel wirklich sehr geholfen.</p>
<p>Aus meiner Sicht liegt die Lösung für das Problem doch klar auf der Hand:</p>
<p>Wenn Agile Enterprise heißt, dass mann innovativ sein (<a href="http://de.wikipedia.org/wiki/Zeitorientierte_Wettbewerbsstrategien" target="_blank">First Mover</a>) und schnell reagieren (Fast Follower) muss, dann kann die Lösung doch nicht in &#8220;Standard&#8221; und &#8220;Monolithen&#8221; liegen. Standard ist definitiv nicht innovativ und Monolithen sind in der Regel komplex und wenig flexibel anzupassen.</p>
<p>Aus meiner Sicht muss man bei der Umsetzung der Geschäftsprozesse auf individuelle Software setzen. Die genutzten Komponenten können aber sehr wohl Standard sein. Was ich damit meine ist, dass ich niemandem empfehlen würde eine Buchhaltungssoftware inidividuell selber zu bauen &#8211; hier ist durch gesetzliche Vorgaben etc. wenig Innovation und Individualität zu erwarten. Allerdings können sich die Prozesse rund um die Buchhaltung sehr wohl stark unterscheiden und zu einem Wettbewerbsvortei werden. Kunden können über Web und Mobile direkt eingebunden werden, Geschäftsvorfälle können automatisiert werden und andere, eigene Systeme können sich direkt integrieren. Insbesondere kann man &#8220;Insellösungen&#8221; vermeiden und dem Benutzer eine einheitliche Oberfläche und schnelle Bearbeitung in einem System anbieten.</p>
<p>Um schnell und flexibel zu sein, mit unbekannten Anforderungen umgehen zu können und das Risiko von inidividueller Entwicklung zu reduzieren, muss man auf agile Vorgehensweisen setzen. Mit schwerfälligen Wasserfallmethoden und Projekten mit Laufzeiten von mehreren Monaten oder Jahren bis man dem Business etwas Lauffähiges anbieten kann, wird man heute nicht mehr konkurrenzfähig sein.</p>
<p>Genau das ist unsere Agile Software Factory: Ein etablierters Vorgehensmodell auf Basis von Scrum und XP mit vielen Best Practices (&#8220;Agile&#8221;) und dem Einsatz von standardisierten Komponenten und Frameworks (&#8220;Factory&#8221;).</p>
<p>Bei den Komponeten setzen wir meistens auf Open Source, da die verwendeten Standards und offene Quellen zu einer verbesserten Integrierbarkeit und schnelleren Entwicklung führen &#8211; zudem ist man weniger von der &#8220;Politik&#8221; einzelner Hersteller abhängig. <a href="http://www.alfresco.com/" target="_blank">Alfresco</a> im Bereich ECM, <a href="http://www.pentaho.com/" target="_blank">Pentaho</a> für Business Intelligence, <a href="http://www.liferay.com/">Liferay</a> als Portal Lösung, <a href="http://www.opencms.org" target="_blank">OpenCms</a> als CMS  oder <a href="http://www.compiere.com/" target="_blank">Compiere</a> im Bereich ERP und CRM sind nur Beispiele für Open Source Komponenten, die wir in die Anwendungen unserer Kunden integrieren. Die individuellen Prozesse und Anwendungen werden dabei auch auf Basis von etablierten Best Practices mit Open Source Frameworks wie <a href="http://www.springsource.org/" target="_blank">Spring</a>, <a href="http://www.hibernate.org" target="_blank">Hibernate</a>, <a href="http://www.jboss.org/drools" target="_blank">Drools</a>, <a href="http://www.jboss.org/jbpm" target="_blank">jBpm</a> oder <a href="http://www.mulesoft.org/" target="_blank">Mule</a> entwickelt. Immer auf Basis leichtgewichtiger, evolutionärer Architekturen!</p>
<p>Die agile Vorgehensweise sorgt dafür, dass das Business alle 2-4 Wochen neue und benötigte Funktionen zur Verfügung gestellt bekommt &#8211; und das in hoher Qualität durch automatisierte Unit-, Regressions- und Systemtest, sowie kontinuierlicher Integration, Pair-Programming und automatisierter Code- und Designüberprüfungen.</p>
<p>Mein Fazit: Wenn wir als IT auf sich schneller ändernde Business Anforderungen reagieren wollen (&#8220;Agile Enterprise&#8221;), dann müssen wir uns von großen &#8220;Standardsoftware Mostern&#8221; und langlaufenden Projekten trennen. Die Lösung für mich sind agile Projekte &#8211; allerdings auf Basis von standardisierten Anwendungsbausteinen und Frameworks.</p>
<div class="dzone_button" style="float: right; margin: 10px 0;">
<iframe src="http://widgets.dzone.com/links/widgets/zoneit.html?t=2&url=http%3A%2F%2Fblog.codecentric.de%2Fen%2F2010%2F08%2Fagile-enterprise-consequences-for-it%2F&title=Agile+Enterprise+%26%238211%3B+consequences+for+IT" height="25" width="155" scrolling="no" frameborder="0"></iframe>
</div><img src="http://feeds.feedburner.com/~r/codecentric/~4/l8M0ulXWKSc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.codecentric.de/2010/08/agile-enterprise-auswirkungen-auf-die-it/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.codecentric.de/2010/08/agile-enterprise-auswirkungen-auf-die-it/</feedburner:origLink></item>
	</channel>
</rss>
