<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>javathreads.de &#187; JBoss</title>
	<atom:link href="http://javathreads.de/tag/jboss/feed/" rel="self" type="application/rss+xml" />
	<link>http://javathreads.de</link>
	<description>Blog rund um Java und Web Entwicklung</description>
	<lastBuildDate>Wed, 02 Nov 2011 10:37:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JBoss AS unter Linux automatisch beim Booten starten</title>
		<link>http://javathreads.de/2009/02/jboss-as-unter-linux-automatisch-beim-booten-starten/</link>
		<comments>http://javathreads.de/2009/02/jboss-as-unter-linux-automatisch-beim-booten-starten/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 19:00:25 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[JBoss AS]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=837</guid>
		<description><![CDATA[Ich habe eine kleine Weile gebraucht um eine kleine Anleitung f&#252;r ein Startscript zu finden, dass den JBoss AS unter Linux beim Booten automatisch startet. Der Platz an dem ich den richtigen Hinweis schlie&#223;lich gefunden habe war auch sehr einleuchtend und ich h&#228;tte auch direkt drauf kommen k&#246;nnen: das JBoss Wiki.
Damit andere nicht auch so [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe eine kleine Weile gebraucht um eine kleine Anleitung f&#252;r ein Startscript zu finden, dass den JBoss AS unter Linux beim Booten automatisch startet. Der Platz an dem ich den richtigen Hinweis schlie&#223;lich gefunden habe war auch sehr einleuchtend und ich h&#228;tte auch direkt drauf kommen k&#246;nnen: das <a href="http://www.jboss.org/community/docs/DOC-12305">JBoss Wiki</a>.<br />
Damit andere nicht auch so lange suchen wie ich und ich diese Info selbst garantiert auch noch einmal ben&#246;tige soll dieser Artikel hier dienen.<br />
Noch als Information vorab: Bei mir liegt der JBoss AS im Verzeichnis <span class="code">/opt</span> und ich habe den Namen des ausgepackten JBoss AS (<span class="code">jboss-4.2.2.GA.zip</span>) in <span class="code">jboss422</span> umbenannt. Somit bezieht sich dieses Startscript auf den JBoss mit dem Verzeichnis <span class="code">/opt/jboss422</span>.</p>
<p>Damit der JBoss nicht unter dem User &#8216;root&#8217; l&#228;uft empfiehlt es sich einen eigenen User &#8216;jboss&#8217; anzulegen und mit diesem den JBoss zu starten. Dazu muss diesem User der JBoss auch geh&#246;ren:</p>
<div class="codebox">
<pre><span style="color: #008000; ">#</span><span style="color: #008000; "> User 'jboss' hinzuf&#252;gen</span><span style="color: #008000; ">
</span><span style="color: #000000; ">useradd jboss

</span><span style="color: #008000; ">#</span><span style="color: #008000; "> Diesem User das JBoss AS Verzeichnis geben</span><span style="color: #008000; ">
</span><span style="color: #000000; ">chown </span><span style="color: #000000; ">-</span><span style="color: #000000; ">R jboss:users </span><span style="color: #000000; ">/</span><span style="color: #000000; ">opt</span><span style="color: #000000; ">/</span><span style="color: #000000; ">jboss422</span><span style="color: #000000; ">/</span></pre>
</div>
<p>Hier das eigentliche Startscript welches bei mir den Namen <span class="code">jboss422</span> vergeben bekommen hat und unter den meisten Linux Distributionen im Verzeichnis <span class="code">/etc/init.d/</span> abgelegt wird. Wie schon erw&#228;hnt liegt mein JBoss 4.2.2 im Verzeichnis <span class="code">/opt/jboss422</span>, so dass dieser Pfad auch im Startscript verwendet wird:</p>
<div class="codebox">
<pre><span style="color: #008000; ">#</span><span style="color: #008000; ">! /bin/sh</span><span style="color: #008000; ">
</span><span style="color: #000000; ">
start(){
  echo </span><span style="color: #800000; ">&quot;</span><span style="color: #800000; ">Starting jboss..</span><span style="color: #800000; ">&quot;</span><span style="color: #000000; ">
  sudo </span><span style="color: #000000; ">-</span><span style="color: #000000; ">u jboss bash </span><span style="color: #000000; ">-</span><span style="color: #000000; ">c </span><span style="color: #800000; ">&quot;</span><span style="color: #800000; ">/opt/jboss422/bin/run.sh --host 0.0.0.0 &gt; /dev/null 2&gt; /dev/null &amp;</span><span style="color: #800000; ">&quot;</span><span style="color: #000000; ">
  </span><span style="color: #008000; ">#</span><span style="color: #008000; ">/opt/jboss422/bin/run.sh --host 0.0.0.0 &gt; /dev/null 2&gt; /dev/null &amp;</span><span style="color: #008000; ">
</span><span style="color: #000000; ">}

stop(){
  echo </span><span style="color: #800000; ">&quot;</span><span style="color: #800000; ">Stopping jboss..</span><span style="color: #800000; ">&quot;</span><span style="color: #000000; ">
  sudo </span><span style="color: #000000; ">-</span><span style="color: #000000; ">u jboss bash </span><span style="color: #000000; ">-</span><span style="color: #000000; ">c </span><span style="color: #800000; ">'</span><span style="color: #800000; ">/opt/jboss422/bin/shutdown.sh -S &amp;</span><span style="color: #800000; ">'</span><span style="color: #000000; ">
  </span><span style="color: #008000; ">#</span><span style="color: #008000; ">/opt/jboss422/bin/shutdown.sh -S &amp;</span><span style="color: #008000; ">
</span><span style="color: #000000; ">}

restart(){
  stop
  </span><span style="color: #008000; ">#</span><span style="color: #008000; "> give stuff some time to stop before we restart</span><span style="color: #008000; ">
</span><span style="color: #000000; ">  sleep </span><span style="color: #000000; ">60</span><span style="color: #000000; ">
  </span><span style="color: #008000; ">#</span><span style="color: #008000; "> protect against any services that can't stop before we restart (warning this kills all Java instances running as 'jboss' user)</span><span style="color: #008000; ">
</span><span style="color: #000000; ">  sudo </span><span style="color: #000000; ">-</span><span style="color: #000000; ">u jboss killall java
  start
}

case </span><span style="color: #800000; ">&quot;</span><span style="color: #800000; ">$1</span><span style="color: #800000; ">&quot;</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    restart
    ;;
  </span><span style="color: #000000; ">*</span><span style="color: #000000; ">)
  echo </span><span style="color: #800000; ">&quot;</span><span style="color: #800000; ">Usage: jboss {start|stop|restart}</span><span style="color: #800000; ">&quot;</span><span style="color: #000000; ">
  exit </span><span style="color: #000000; ">1</span><span style="color: #000000; ">
esac

exit 0
</span></pre>
</div>
<p>Hat man f&#252;r den ersten Test keinen User &#8216;jboss&#8217; oder m&#246;chte den JBoss unter dem User &#8216;root&#8217; laufen lassen einfach die Zeile <span class="code">sudo -u jboss ..</span> mit # auskommentieren und die darunter gelistete Zeile einkommentieren.</p>
<p>Jetzt fehlt noch das Hinzuf&#252;gen des Startscriptes zu dem Bootprozess, so dass der JBoss mit jedem Serverstart auch automatisch gestartet wird. Der Teil ist optional, denn vielleicht m&#246;chte der ein oder andere den JBoss immer per Hand starten.</p>
<p>Unter Suse wird das Startscript mit dem Kommando <span class="code">chkconfic &lt;scriptname&gt; on</span> hinzuf&#252;gen:<br />
<code>chkconfig jboss422 on</code><br />
Erstellt automatisch die Symlinks und aktiviert das Startscript</p>
<p>Unter Debian wie folgt:<br />
<code>update-rc.d jboss422 defaults</code><br />
Erstellt automatisch die notwendigen Symlinks.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/02/jboss-as-unter-linux-automatisch-beim-booten-starten/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Den JBoss AS mit JMX Services im Auge behalten</title>
		<link>http://javathreads.de/2009/02/den-jboss-as-mit-jmx-services-im-auge-behalten/</link>
		<comments>http://javathreads.de/2009/02/den-jboss-as-mit-jmx-services-im-auge-behalten/#comments</comments>
		<pubDate>Tue, 03 Feb 2009 18:00:38 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[JBoss AS]]></category>
		<category><![CDATA[JMX]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=1022</guid>
		<description><![CDATA[kann man am besten mit der JMX Konsole. Man kann mit dieser recht viel machen und erreichen aber ich will nur kurz einen Blick auf zwei System-MBeans werfen die unter der &#220;berschrift &#8220;jboss.system&#8221; zu finden sind: type=Server und type=ServerInfo. In der JMX Konsole sieht dieser Abschnitt wie folgt aus, wobei sich die beiden genannten MBeans [...]]]></description>
			<content:encoded><![CDATA[<p>kann man am besten mit der JMX Konsole. Man kann mit dieser recht viel machen und erreichen aber ich will nur kurz einen Blick auf zwei System-MBeans werfen die unter der &#220;berschrift &#8220;<strong>jboss.system</strong>&#8221; zu finden sind: <b>type=Server</b> und <b>type=ServerInfo</b>. In der JMX Konsole sieht dieser Abschnitt wie folgt aus, wobei sich die beiden genannten MBeans an drittletzter und letzter Stelle befinden:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/02/jbossjmxkonsole.png" alt="JBoss JMX Konsole - jboss.system" title="JBoss JMX Konsole - jboss.system" width="620" height="205" class="borderGray alignnone size-full wp-image-1023" />
</div>
<p><br/><br />
<strong>Uptime mit Hilfe des Startdatums herausfinden</strong><br />
Mit der MBean <b>Server</b> l&#228;sst sich erfahren wie lange der JBoss am laufen ist bzw. wann er gestartet wurde. Diese Information wird in der Liste der MBean Attributen unter dem Namen &#8220;StartDate&#8221; angezeigt:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/02/jbossjmxserverstartdate.png" alt="JBoss JMX Konsole - type:Server - StartDate" title="JBoss JMX Konsole - type:Server - StartDate" width="620" height="172" class="borderGray alignnone size-full wp-image-1025" />
</div>
<p><br/><br />
<strong>Speicherverbrauch analysieren</strong><br />
Mit der MBean <b>ServerInfo</b> kann man in der Liste der MBean Attribute viele Informationen wie z.B. Total Memory, Host Address oder Java VM Version herausfinden. Interessanter f&#252;r den Betrieb des JBoss AS ist aber vielmehr wie viel Arbeitsspeicher dem JBoss zur Verf&#252;gung gestellt wurde und wie viel davon bereits verbraucht ist.<br />
Gerade w&#228;hrend der Entwicklung arbeitet man viel mit Hot Deployment und ab und an erh&#228;lt man die <span class="code">java.lang.OutOfMemoryError: PermGen space</span> Exception. Um herauszufinden wieviel Perm Gen Space reserviert und bereits ben&#246;tigt wird kann man in der ServerInfo MBean auf die Methode <span class="code">listMemoryPools()</span> klicken und erh&#228;lt unter anderem folgende Ausgabe:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2009/02/jbossjmxserverinfopermgenspace.png" alt="JBoss JMX Konsole - type:Server - listMemoryPools()" title="JBoss JMX Konsole - type:Server - listMemoryPools()" width="620" height="169" class="borderGray alignnone size-full wp-image-1030" />
</div>
<p>Die zwei hier vorgestellten Funktionen sind w&#228;hrend der Entwicklung aber auch w&#228;hrend des Betriebes wirklich n&#252;tzlich. Vor allem die Kombination Serverlaufzeit und Speicherverbrauch ist ein interessanter Faktor. Wird je der ben&#246;tigte Speicher mit l&#228;ngerer Laufzeit immer gr&#246;&#223;er sollte man nochmal &#252;ber seine Anwendung nachdenken ;)</p>
<p>Vielleicht noch als letzte Anmerkung: mit dem auch unter jboss.system liegenden <strong>Log4JService</strong> kann man die unter dem JBoss Verzeichnis <span class="code">server/default/conf/</span> liegende Log4J Konfigurationsdatei <span class="code">jboss-log4j.xml</span> neu konfigurieren und laden. Somit l&#228;sst sich auch w&#228;hrend des Betriebs z.B. das Loglevel anpassen. Aber dazu ein ander mal mehr.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/02/den-jboss-as-mit-jmx-services-im-auge-behalten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JBoss RichFaces 3.3.0 GA mit einer Editor Komponente</title>
		<link>http://javathreads.de/2009/01/jboss-richfaces-330-ga-mit-einer-editor-komponente/</link>
		<comments>http://javathreads.de/2009/01/jboss-richfaces-330-ga-mit-einer-editor-komponente/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 08:00:45 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[JBoss Tools]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[RichFaces]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=956</guid>
		<description><![CDATA[Vor ein paar Tagen wurde die JBoss RichFaces 3.3.0 GA als neue Version mit einigen neuen Komponenten ver&#246;ffentlicht. F&#252;r mich und wahrscheinlich f&#252;r viele andere ist das deswegen so interessant, weil ab sofort in den RichFaces ein Rich Editor (WYSIWYG Editor) enthalten ist. Dieser Editor sieht auf der RichFaces Live Demo Seite wie folgt aus:



Man [...]]]></description>
			<content:encoded><![CDATA[<p>Vor ein paar Tagen wurde die <a href="http://labs.jboss.com/portal/jbossrichfaces/downloads">JBoss RichFaces 3.3.0 GA</a> als neue Version mit einigen neuen Komponenten <a href="http://in.relation.to/Bloggers/RichFaces330GAAvailable">ver&#246;ffentlicht</a>. F&#252;r mich und wahrscheinlich f&#252;r viele andere ist das deswegen so interessant, weil ab sofort in den RichFaces ein Rich Editor (WYSIWYG Editor) enthalten ist. Dieser Editor sieht auf der <a href="http://livedemo.exadel.com/richfaces-demo/welcome.jsf">RichFaces Live Demo Seite</a> wie folgt aus:</p>
<div class="singleImgDiv">
<a href="http://livedemo.exadel.com/richfaces-demo/richfaces/fileUpload.jsf?c=editor"><img src="http://javathreads.de/data/uploads/2009/01/rfeditor.png" alt="" title="RichFaces Rich Editor"  class="borderGray alignnone size-full wp-image-957" /></a>
</div>
<p>Man kann den Funktionsumfang f&#252;r die Formatierungsm&#246;glichkeiten soweit abspecken, dass nur noch das n&#246;tigste f&#252;r den Benutzer m&#246;glich ist:</p>
<div class="singleImgDiv">
<a href="http://livedemo.exadel.com/richfaces-demo/richfaces/fileUpload.jsf?c=editor"><img src="http://javathreads.de/data/uploads/2009/01/rfeditorsimple.png" alt="" title="RichFaces Rich Editor Simple" class="borderGray alignnone size-full wp-image-959" /></a>
</div>
<p>Wer den Editor live ausprobieren m&#246;chte kann dies auf der <a href="http://livedemo.exadel.com/richfaces-demo/richfaces/fileUpload.jsf?c=editor">RichFaces Live Demo</a> direkt tun. Die einfachste Variante den Editor einzubinden und zu verwenden ist:</p>
<div class="code">
<pre>&lt;rich:editor value="#{myBean.editorContent}"/&gt;</pre>
</div>
<p>Die Editor Komponente selbst basiert auf den sehr bekannten <a href="http://tinymce.moxiecode.com/">TinyMCE JavaScript WYSIWYG Editor</a> und bisher musste man, wenn man einen solchen Rich Editor wollte, diesen manuell in sein Projekt einbinden.</p>
<p>Ich werde den Editor die Tage mal ausprobieren und dann wird man sehen ob er sich so einfach einbinden und verwenden l&#228;sst wie es bei den vielen anderen RichFaces Komponenten war.</p>
<p>Neben dem Editor ist noch eine weitere Ajax Komponente hinzugekommen: <a href="http://livedemo.exadel.com/richfaces-demo/richfaces/queue.jsf?c=queue&#038;tab=usage">Ajax Queue</a>. Mit dieser ist es m&#246;glich direkt hintereinander abgesetzte Ajax Request so zu managen, dass der zweite Ajax Request erst abgesetzt wird wenn der erste beendet wurde. Somit kann man parallele Ajax Requests verhindern.</p>
<div class="singleImgDiv">
<a href="http://livedemo.exadel.com/richfaces-demo/richfaces/queue.jsf?c=queue&#038;tab=usage"><img src="http://javathreads.de/data/uploads/2009/01/rfajaxqueue.png" alt="" title="RichFaces Ajax Queue" class="borderGray alignnone size-full wp-image-963" /></a>
</div>
<div class="subHeadline">JBoss RichFaces als JSF Ajax Framework</div>
<p>Wer bisher noch nichts von den RichFaces bzw. das dazugeh&#246;rige Ajax4Jsf geh&#246;rt hat der sollte sich auf der Live Demo Seite die vielen Beispiele mal ansehen. Neben den fertigen Ajax Komponenten wie z.b. die <a href="http://livedemo.exadel.com/richfaces-demo/richfaces/dataTable.jsf?c=dataTable&#038;tab=dataModel">DataTable</a>, <a href="http://livedemo.exadel.com/richfaces-demo/richfaces/inplaceInput.jsf?c=inplaceInput&#038;tab=usage">Inplace Edit</a>, <a href="http://livedemo.exadel.com/richfaces-demo/richfaces/tree.jsf?c=tree&#038;tab=usage">Tree</a> oder <a href="http://livedemo.exadel.com/richfaces-demo/richfaces/fileUpload.jsf?c=fileUpload&#038;tab=usage">File Upload</a> (um nur einige zu nennen) ist vor allem der Ajax4Jsf Teil sehr interessant. Mit diesem lassen mit einfachen Mitteln bzw. Komponenten normale JSF Seiten &#8220;Ajaxifizieren&#8221; (<a href="http://livedemo.exadel.com/richfaces-demo/richfaces/support.jsf?c=support&#038;tab=selects">a4j:support</a>), es lassen sich JavaScript Methoden dynamisch erzeugen (<a href="http://livedemo.exadel.com/richfaces-demo/richfaces/jsFunction.jsf?c=jsFunction&#038;tab=usage">a4j:jsfunction</a>) die mit JSF Managed Beans reden oder Teile der JSF Seite neu Rendern oder man kann den Server mit Hilfe von Ajax Anfragen um z.B. einen Status abzufragen (<a href="http://livedemo.exadel.com/richfaces-demo/richfaces/poll.jsf?c=poll&#038;tab=usage">a4j:poll</a>).<br />
Pers&#246;nlich finde ich genau diesen Ajax4Jsf Teil und die gesamte Einfachheit der Verwendung der RichFaces Komponenten den Grund warum ich die JBoss RichFaces sehr empfehlen kann.</p>
<p>Noch ein letzter Tipp: Wer mit den RichFaces arbeitet sollte sich auf alle F&#228;lle die <a href="http://javathreads.de/2008/08/jboss-tools-300-alpha1-langsam-geht-es-vorwaerts/">JBoss Tools in Eclipse installieren</a> um die direkte RichFaces Unterst&#252;tzung im JSF Editor zu erhalten. Neben Autocomplete bei den Komponenten, dem Rich Editor f&#252;r JSF oder xhtml Seiten erkennt er auch Expressions und kann auf die Methoden und Beans referenzieren.</p>
<p>Viel Spass beim ausprobieren!</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2009/01/jboss-richfaces-330-ga-mit-einer-editor-komponente/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>JBoss AS Server Ports &#228;ndern</title>
		<link>http://javathreads.de/2008/08/jboss-as-server-ports-aendern/</link>
		<comments>http://javathreads.de/2008/08/jboss-as-server-ports-aendern/#comments</comments>
		<pubDate>Tue, 26 Aug 2008 07:30:30 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[JBoss AS]]></category>
		<category><![CDATA[Konfiguration]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=218</guid>
		<description><![CDATA[Es besteht tats&#228;chlich manchmal der Bedarf die Default Server Ports des JBoss Application Servers (AS) zu &#228;ndern. Nachdem man, so wie ich, an den verschiedensten Stellen versucht hat einen Port zu &#228;ndern und au&#223;er Exceptions nichts bei herausgekommen ist entpuppt sich die richtige L&#246;sung doch als sehr einfach und sollte daher kurz notiert werden.
Grunds&#228;tzlich wird [...]]]></description>
			<content:encoded><![CDATA[<p>Es besteht tats&#228;chlich manchmal der Bedarf die Default Server Ports des JBoss Application Servers (AS) zu &#228;ndern. Nachdem man, so wie ich, an den verschiedensten Stellen versucht hat einen Port zu &#228;ndern und au&#223;er Exceptions nichts bei herausgekommen ist entpuppt sich die richtige L&#246;sung doch als sehr einfach und sollte daher kurz notiert werden.</p>
<p>Grunds&#228;tzlich wird von JBoss darauf verwiesen, dass eine einzige JBoss Server Installation mehrere Instanzen verwalten kann. Das geschieht durch die verschiedenen Server Konfigurationsverzeichnisse:</p>
<ul>
<li>$JBOSS_HOME</li>
<ul style="margin-left: 10px;">
<li>server</li>
<ul style="margin-left: 20px;">
<li>default</li>
<li>node1</li>
<li>node2</li>
<li>nodeX</li>
</ul>
</ul>
</ul>
<p>In meinem speziellem Fall war es dennoch nicht anders zu l&#246;sen als eine komplette neue JBoss Installation in einem anderen Verzeichnis. Das Ergebnis war nat&#252;rlich, dass die beiden JBoss AS Installationen Portkonflikte anzeigten und der zuletzt gestartet JBoss AS nur Exceptions ausspuckte.</p>
<p>Es bestehen f&#252;r dieses Problem zwei L&#246;sungen: Entweder man vergibt jedem JBoss eine eigene IP Adresse (<span class="code">./run.sh -b 192.168.1.2</span>) und somit sind die Port Bindings auch voneinander getrennt oder man vergibt jeder JBoss AS Instanz unterschiedliche Ports.<br />
In meinem Fall war die zweite L&#246;sung, verschieden Ports vergeben, die einzige M&#246;glichkeit die zwei JBoss AS Instanzen auf der gleichen Maschine voneinander zu trennen.</p>
<div class="subHeadline">Verschiedene Ports f&#252;r jede JBoss AS Instanz vergeben</div>
<p>Verschiedene Ports zu vergeben gestaltet sich im JBoss AS recht einfach. Man kann nat&#252;rlich alle Ports in jeder einzelnen Konfigurationsdatei manuell von Hand &#228;ndern und hoffen, dass man alles richtig gemacht hat.<br />
Viel empfehlenswerter ist allerdings die Verwendung des <a href="http://www.jboss.org/file-access/default/members/jbossas/freezone/docs/Server_Configuration_Guide/beta422/html/Additional_Services-Services_Binding_Management.html">Service Binding Manager</a>. Mit diesem ist es m&#246;glich weitreichende &#196;nderungen an den einzelnen Konfigurationsdateien Ports zu ver&#228;ndern. In der Default Konfiguration des JBoss AS ist dieser Service Binding Manager nicht aktiv (in den Kommentar eingeschlossen) und es werden die vorgegebenen Ports verwendet.</p>
<p>Um den Service Binding Manager zu verwenden muss die entsprechende Stelle in der <span class="code">jboss-service.xml</span> auskommentiert werden. Die <span class="code">jboss-service.xml</span> befindet sich im <span class="code">conf</span> Verzeichnisses unterhalb eines Server Konfigurationsverzeichnisses. F&#252;r den Default Server somit unter <span class="code">jboss-4.2.2.GA\server\default\conf</span>.</p>
<p>Darin die folgenden Zeilen auskommentieren.</p>
<pre name="code" class="xml">
  <mbean code="org.jboss.services.binding.ServiceBindingManager" name="jboss.system:service=ServiceBindingManager">
    <attribute name="ServerName">ports-01</attribute>
    <attribute name="StoreURL">${jboss.home.url}/docs/examples/binding-manager/sample-bindings.xml</attribute>
    <attribute name="StoreFactoryClassName">org.jboss.services.binding.XMLServicesStoreFactory</attribute
  </mbean>
</pre>
<p>In der <span class="code">spample-bindings.xml</span> Datei sind s&#228;mtliche in JBoss konfigurierbare Ports aufgelistet und k&#246;nnen nach belieben ver&#228;ndert werden bzw. dieses <span class="code">spample-bindings.xml</span> kann schon verwendet werden um den JBoss AS auf komplett anderen Ports laufen zu lassen.<br />
So wird z.B. auch der HTTP Port in dieser Beispielkonfiguration auf 8180 (default ist 8080) konfiguriert:</p>
<pre name="code" class="xml">
<service-bindings>
  <server name="ports-default">
    ...
    <!-- ********************* jbossmq-httpil.sar **************** -->
    <service-config name="jboss.mq:service=InvocationLayer,type=HTTP"
      delegateClass="org.jboss.services.binding.AttributeMappingDelegate">
      <delegate-config portName="URLPort"/>
      <binding port="8180"/>
    </service-config>
    ...
  </server>
</service-bindings>
</pre>
<p>F&#252;r eine genauere Dokumentation der XML Datei und der einzelnen XML Elemente sei auf den <a href="http://www.jboss.org/file-access/default/members/jbossas/freezone/docs/Server_Configuration_Guide/beta422/html/Additional_Services-Services_Binding_Management.html">Server Configuration Guide Kapitel 10.2</a> verwiesen.</p>
<p>Insgesamt eine sch&#246;ne und saubere M&#246;glichkeit Port Bindings zu konfigurieren und wiederzuverwenden.<br />
F&#252;r weiterf&#252;hrende Dokumentation rund um die Konfiguration der Ports und einzelner JBoss AS Instanzen empfehle ich das JBoss Wiki:</p>
<ul>
<li><a href="http://wiki.jboss.org/wiki/ConfiguringMultipleJBossInstancesOnOneMachine">Configuring Multiple JBoss Instances On One Machine</a></li>
<li><a href="http://wiki.jboss.org/wiki/ConfigurePorts">Setting up multiple instances of JBoss on the same machine &#8211; Binding Manager</a></li>
<li><a href="http://wiki.jboss.org/wiki/AS5ServiceBindingManager">Service Binding Manager in JBoss Application Server 5</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2008/08/jboss-as-server-ports-aendern/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Prepared Statement Parameter von Hibernate ausgeben lassen</title>
		<link>http://javathreads.de/2008/08/prepared-statement-parameter-von-hibernate-ausgeben-lassen/</link>
		<comments>http://javathreads.de/2008/08/prepared-statement-parameter-von-hibernate-ausgeben-lassen/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 07:15:14 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[JBoss AS]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[Konfiguration]]></category>
		<category><![CDATA[Log4J]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=43</guid>
		<description><![CDATA[Wer mit Hibernate arbeitet dem f&#228;llt fr&#252;her oder sp&#228;ter auf, dass die eingesetzten Parameter bei ausgef&#252;hrten SQL Statements nicht im Logfile (oder auf der Konsole) zu sehen sind. Vielmehr sehen die SQL Statements zum Beispiel wie folgt aus:

21:10:03,406 INFO  [STDOUT] Hibernate:
    insert
    into
      [...]]]></description>
			<content:encoded><![CDATA[<p>Wer mit Hibernate arbeitet dem f&#228;llt fr&#252;her oder sp&#228;ter auf, dass die eingesetzten Parameter bei ausgef&#252;hrten SQL Statements nicht im Logfile (oder auf der Konsole) zu sehen sind. Vielmehr sehen die SQL Statements zum Beispiel wie folgt aus:</p>
<div class="codebox">
<pre><span style="color: #800000; font-weight: bold; ">21</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">10</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">03</span><span style="color: #000000; ">,</span><span style="color: #800000; font-weight: bold; ">406</span><span style="color: #000000; "> INFO  </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">STDOUT</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> Hibernate:
    </span><span style="color: #0000FF; ">insert</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">into</span><span style="color: #000000; ">
        REGISTERED_USER
        (version, NAME, USER_TYPE, CONF_FK, id)
    </span><span style="color: #0000FF; ">values</span><span style="color: #000000; ">
        (?, ?, ?, ?, ?)</span></pre>
</div>
<p>Das f&#252;r den Entwickler eigentlich interessante, n&#228;mlich die Parameter in der <span class="code">values</span> Zeile, wird wegen der Verwendung von Prepared Statements  nur durch Fragezeichen ausgegeben.</p>
<p>Die allgemein g&#252;ltige L&#246;sung daf&#252;r ist das Log Level f&#252;r Hibernate Kategorie <span class="code">org.hibernate.type</span> auf <span class="code">TRACE</span> zu setzen. In einer <span class="code">log4j.properties</span> Datei reichen die folgenden beiden Angaben um die SQL Statements sowie deren Paramter im Log auszugeben:</p>
<div class="codebox">
log4j.logger.org.hibernate.SQL = TRACE<br />
log4j.logger.org.hibernate.type = TRACE
</div>
<p>Arbeitet man mit der log4j.xml Konfigurationsdatei muss man die Kategorie wie folgt konfigurieren:</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">category </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;org.hibernate.type&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">priority </span><span style="color: #FF0000; ">value</span><span style="color: #0000FF; ">=&quot;TRACE&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">appender-ref </span><span style="color: #FF0000; ">ref</span><span style="color: #0000FF; ">=&quot;CONSOLE&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">category</span><span style="color: #0000FF; ">&gt;</span></pre>
</div>
<p>Die Kategorie <span class="code">org.hibernate.SQL</apn> muss man nicht unbedingt konfigurieren wenn man in der Hibernate Konfiguration, die bei der Nutzung von JPA in der Datei <span class="code">persistence.xml</span> zu finden ist, den Parameter <span class="code">hibernate.show_sql</span> auf <span class="code">true</span> setzt:</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;hibernate.show_sql&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;true&quot;</span><span style="color: #0000FF; ">/&gt;</span></pre>
</div>
<p>&#220;berschreibt man die in der log4j Konfiguration die Kategorie <span class="code">org.hibernate.SQL</span> hat diese Einstellung in der <span class="code">persistence.xml</span> keine Wirkung.</p>
<div class="subHeadline ">Hibernate unter JBoss Seam und JBoss AS zum reden bringen</div>
<p>Arbeitet man mit JBoss Seam unter dem JBoss AS verh&#228;lt es sich grunds&#228;tzlich genauso wie oben beschrieben: </p>
<ul>
<li>Konfiguration des <span class="code">show_sql</span> Flags auf den Wert <span class="code">true</span> in der <span class="code">persistence.xml</span></li>
<li>Die Log4J Konfiguration f&#252;r Hibernate erweitern: Im JBoss AS Installationsordner unter <span class="code">&lt;JBossAs&gt;\server\default\conf</span> die Datei <span class="code">jboss-log4j.xml</span> editieren und die Hibernate Kategorie <span class="code">org.hibernate.type</span> wie oben beschrieben hinzuf&#252;gen</li>
</ul>
<p>Da hier das Log Level auf <span class="code">TRACE</span> gesetzt wird muss man das Level f&#252;r den Appender auch auf <span class="code">TRACE</span> setzen um den entsprechenden Effekt zu erhalten. Es ist nicht unbedingt ratsam den Default Appender, hier <span class="code">CONSOLE</span> auf <span class="code">TRACE</span> zu setzen weil sonst alle f&#252;r diesen Appender konfigurierten Kategorien viel und laut sprechen.<br />
Es bietet sich stattdessen an einen eigenen Hibernate Appender zu erstellen und nur diesen auf <span class="code">TRACE</span> zu setzen. Bei mir sieht die <span class="code">jboss-log4j.xml</span> f&#252;r Hibernate wie folgt aus. Zuerst der Hibernate Appender:</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">appender </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;HIBERNATE&quot;</span><span style="color: #FF0000; "> class</span><span style="color: #0000FF; ">=&quot;org.apache.log4j.ConsoleAppender&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">errorHandler </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">=&quot;org.jboss.logging.util.OnlyOnceErrorHandler&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">param </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;Target&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;System.out&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">param </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;Threshold&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;TRACE&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">

  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">layout </span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">=&quot;org.apache.log4j.PatternLayout&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">param </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;ConversionPattern&quot;</span><span style="color: #FF0000; "> value</span><span style="color: #0000FF; ">=&quot;%d{ABSOLUTE} %-5p [%c{1}] %m%n&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">layout</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">appender</span><span style="color: #0000FF; ">&gt;</span></pre>
</div>
<p>Die Hibernate <span class="code">org.hibernate.type</span> Kategorie Konfiguration:</p>
<div class="codebox">
<pre><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">category </span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">=&quot;org.hibernate.type&quot;</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">priority </span><span style="color: #FF0000; ">value</span><span style="color: #0000FF; ">=&quot;TRACE&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
  </span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">appender-ref </span><span style="color: #FF0000; ">ref</span><span style="color: #0000FF; ">=&quot;HIBERNATE&quot;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; ">
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">category</span><span style="color: #0000FF; ">&gt;</span></pre>
</div>
<p>Eigentlich ziemlich simpel.</p>
<p>F&#252;hrt man nun das am Anfang beschriebene SQL Statement nochmal aus ist auf der Konsole folgendes zu sehen:</p>
<div class="codebox">
<pre><span style="color: #800000; font-weight: bold; ">21</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">30</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">11</span><span style="color: #000000; ">,</span><span style="color: #800000; font-weight: bold; ">756</span><span style="color: #000000; "> INFO  </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">STDOUT</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> Hibernate:
    </span><span style="color: #0000FF; ">insert</span><span style="color: #000000; ">
    </span><span style="color: #0000FF; ">into</span><span style="color: #000000; ">
        REGISTERED_USER
        (version, NAME, USER_TYPE, CONF_FK, id)
    </span><span style="color: #0000FF; ">values</span><span style="color: #000000; ">
        (?, ?, ?, ?, ?)
</span><span style="color: #800000; font-weight: bold; ">21</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">30</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">11</span><span style="color: #000000; ">,</span><span style="color: #800000; font-weight: bold; ">756</span><span style="color: #000000; "> TRACE </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">IntegerType</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> binding </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">0</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">to</span><span style="color: #000000; "> parameter: </span><span style="color: #800000; font-weight: bold; ">1</span><span style="color: #000000; ">
</span><span style="color: #800000; font-weight: bold; ">21</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">30</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">11</span><span style="color: #000000; ">,</span><span style="color: #800000; font-weight: bold; ">756</span><span style="color: #000000; "> TRACE </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">StringType</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> binding </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">Markus</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">to</span><span style="color: #000000; "> parameter: </span><span style="color: #800000; font-weight: bold; ">2</span><span style="color: #000000; ">
</span><span style="color: #800000; font-weight: bold; ">21</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">30</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">11</span><span style="color: #000000; ">,</span><span style="color: #800000; font-weight: bold; ">756</span><span style="color: #000000; "> DEBUG </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">EnumType</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> Binding </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">ADMIN</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">to</span><span style="color: #000000; "> parameter: </span><span style="color: #800000; font-weight: bold; ">3</span><span style="color: #000000; ">
</span><span style="color: #800000; font-weight: bold; ">21</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">30</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">11</span><span style="color: #000000; ">,</span><span style="color: #800000; font-weight: bold; ">756</span><span style="color: #000000; "> TRACE </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">LongType</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> binding </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">41</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">to</span><span style="color: #000000; "> parameter: </span><span style="color: #800000; font-weight: bold; ">4</span><span style="color: #000000; ">
</span><span style="color: #800000; font-weight: bold; ">21</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">30</span><span style="color: #000000; ">:</span><span style="color: #800000; font-weight: bold; ">11</span><span style="color: #000000; ">,</span><span style="color: #800000; font-weight: bold; ">756</span><span style="color: #000000; "> TRACE </span><span style="color: #FF0000; ">[</span><span style="color: #FF0000; ">LongType</span><span style="color: #FF0000; ">]</span><span style="color: #000000; "> binding </span><span style="color: #FF0000; ">'</span><span style="color: #FF0000; ">41</span><span style="color: #FF0000; ">'</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">to</span><span style="color: #000000; "> parameter: </span><span style="color: #800000; font-weight: bold; ">5</span></pre>
</div>
<p>Und kaum hat man diese wenigen Konfigurationselemente hinzugef&#252;gt spricht Hibernate schon eine viel deutlichere und sch&#246;nere Sprache f&#252;r uns.</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2008/08/prepared-statement-parameter-von-hibernate-ausgeben-lassen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Eine EJB als JMX MBean f&#252;r JBoss AS erstellen</title>
		<link>http://javathreads.de/2008/06/eine-ejb-als-jmx-mbean-fuer-jboss-as-erstellen/</link>
		<comments>http://javathreads.de/2008/06/eine-ejb-als-jmx-mbean-fuer-jboss-as-erstellen/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 14:52:24 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JEE 5]]></category>
		<category><![CDATA[JMX]]></category>
		<category><![CDATA[MBean]]></category>

		<guid isPermaLink="false">http://javathreads.de/?p=69</guid>
		<description><![CDATA[Die Java Management Extensions (JMX) sind eine sehr gute Wahl um Aufgaben zentraler Natur zu steuern, eine Anwendung von au&#223;en zu beeinflussen oder zu &#252;berwachen. So k&#246;nnten zum Beispiel das Logverhalten ver&#228;ndert oder administrative Anwendungsfunktionen ausgef&#252;hrt werden ohne den Betrieb der Anwendung zu st&#246;ren.
Um JMX zu nutzen werden sogenannte MBeans (Managed Beans) erstellt welche &#252;ber [...]]]></description>
			<content:encoded><![CDATA[<p>Die <a href="http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/">Java Management Extensions</a> (JMX) sind eine sehr gute Wahl um Aufgaben zentraler Natur zu steuern, eine Anwendung von au&#223;en zu beeinflussen oder zu &#252;berwachen. So k&#246;nnten zum Beispiel das Logverhalten ver&#228;ndert oder administrative Anwendungsfunktionen ausgef&#252;hrt werden ohne den Betrieb der Anwendung zu st&#246;ren.</p>
<p>Um JMX zu nutzen werden sogenannte MBeans (Managed Beans) erstellt welche &#252;ber einen Adapter, wie zum Beispiel einen HTTP Adapter, &#252;ber den Web Browser zug&#228;nglich gemacht werden. Mit Java 5 kommt auch noch die M&#246;glichkeit auf die JConsole zu verwenden um auf MBeans zuzugreifen. Mehr zu den Grundlagen der Java Management Extension auch in der online Ausgabe <a href="http://www.galileodesign.de/openbook/javainsel5/javainsel23_000.htm">Java ist auch eine Insel &#8211; Kapitel 23</a>.</p>
<div class="singleImgDiv"><img src='http://www.webthreads.de/article-data/uploads/2008/01/jbossjmxmbeanview.png' alt='JBoss JMX MBean View' class="borderGray"/></div>
<p>Der JBoss AS (Application Server) steuert seine Konfigurationen &#252;ber einen eigenen JMX Bus und bietet dazu eine Menge an MBeans an &#8211; siehe dazu auch aus dem <a href="http://docs.jboss.org/jbossas/jboss4guide/r2/html/">JBoss AS Guide</a> &#8211; Kapitel 2 &#8211; <a href="http://docs.jboss.org/jbossas/jboss4guide/r2/html/ch2.chapter.html">The JBoss JMX Microkernel</a>. Weil die JMX Unterst&#252;tzung eine Kernkomponente f&#252;r den JBoss ist bietet er einfache M&#246;glichkeiten an diese Infrastruktur f&#252;r die eigenen Zwecke zu verwenden. Wie man diese am einfachsten verwenden und selbst eine JMX MBean schreiben kann soll im folgenden gezeigt werden.</p>
<p>Dieser Artikel ist in die folgenden Abschnitten unterteilt:</p>
<ul>
<li><a href="#verschArtenMBeans">Verschiedene Arten der JBoss MBean Services</a></li>
<li><a href="#jbossServicePojo">JBoss Service POJO</a></li>
<li><a href="#mgmtIfXml">JMX Konsole &#8211; Management Interface mit XML beschreiben</a></li>
</ul>
<p><span id="more-69"></span></p>
<div class="subHeadline"><a name="verschArtenMBeans" class="noLink">Verschiedene Arten der JBoss MBean Services</a></div>
<p>M&#246;chte man eine JMX Bean f&#252;r die eigene Anwendung, welche auf dem <a href="http://www.jboss.org/products/jbossas">JBoss AS</a> (Application Server) l&#228;uft, schreiben so bietet JBoss mehrere M&#246;glichkeiten an. Folgende drei M&#246;glichkeiten bestehen eine MBean f&#252;r die JMX Konsole zu implementieren und zu registrieren:</p>
<ul>
<li>JBoss Standard MBean</li>
<li>JBoss XMBean</li>
<li>JBoss Servie POJO</li>
</ul>
<p>Obwohl ich nur auf die dritte und letzte M&#246;glichkeit eingehen m&#246;chte, werden vorab die beiden anderen Varianten kurz erw&#228;hnt, so dass man diese einordnen kann.</p>
<div class="subHeadline">JBoss Standard MBean</div>
<p>F&#252;r die erste Variante implementiert man einen JBoss MBean Service (auch Standard MBean genannt). Dazu erstellt man ein Interface welches sich von <span class="code">org.jboss.system.ServiceMBean</span> sowie eine Klasse die dieses Interfaces implementiert. Diese MBean Service Klasse ist selbst von der Klasse org.jboss.system.ServiceMBeanSupport abgeleitet ist. Diese Klasse wird nun in der Datei jboss-service.xml als MBean konfiguriert und so dem JBoss AS bekannt gemacht.<br />
Ein kleines &#8220;Hello World Service&#8221; Tutorial f&#252;r das Erstellen eines solchen JBoss MBean Services findet sich im <a href="http://wiki.jboss.org/wiki/ExampleHelloWorldService">JBoss Wiki</a>.</p>
<div class="subHeadline"> JBoss XMBean</div>
<p>Die zweite Variante basiert auf der eben vorgestellten, nur dass die MBean &#252;ber das JBoss XMBean Framework seine Metadaten beschreibt. An dieser Stelle kommt die M&#246;glichkeit einfache POJOs als MBeans zu verwenden ins Spiel und es ist nicht mehr notwendig das oben beschriebene Interface ServiceMBean zu implementieren oder andere Regeln in der MBean Klasse einzuhalten. Allerdings wird f&#252;r diese sogenannte <a href="http://wiki.jboss.org/wiki/XMBean">XMBean</a> Deployment Descriptor in Form eines XML Dokuments ben&#246;tigt. Aus diesem Grund hei&#223;t diese MBean XMBean.<br />
In diesem Deplyoment Descriptor k&#246;nnen s&#228;mtliche Attribute, Methoden und deren Parameter beschrieben werden. Ein weiter Vorteil war die M&#246;glichkeit Interceptor-Methoden zu implementieren. Diese konnte man zum Beispiel f&#252;r <a href="http://wiki.jboss.org/wiki/XMBeansforSecurity">Sicherheits&#252;berpr&#252;fungen</a> bei Methodenaufrufe verwenden. Eine sch&#246;ne ausf&#252;hrliche Beschreibung der XMBean findet sich auf dem Blog von <a href="http://vladimirvivien.com/blogs/ot/2007/06/part-2-creating-advanced-jboss-4.html">organig thoughts</a>.</p>
<p>Die hier eben kurz erw&#228;hnten Wege eine JBoss MBean bzw. XMBean (beides sind JMX MBean) zu erstellen k&#246;nnen auch noch einmal in der offiziellen JBoss <a href="http://www.redhat.com/docs/manuals/jboss/jboss-eap-4.2/doc/Server_Configuration_Guide/">Server Configuration Guide</a> im Kapitel 3.4.3 mit dem Titel &#8220;<a href="http://www.redhat.com/docs/manuals/jboss/jboss-eap-4.2/doc/Server_Configuration_Guide/Using_JMX_as_a_Microkernel-Writing_JBoss_MBean_Services.html">Writing JBoss MBean Services</a>&#8221; nachgelesen werden.</p>
<p>Die dritte Variante ist die in diesem Artikel eigentlich fokussierte Variante mit dem Namen JBoss Service POJOs.</p>
<div class="subHeadline"><a name="jbossServicePojo" class="noLink">JBoss Service POJO</a></div>
<p>Die einfachste Variante eine JBoss MBean f&#252;r die JMX Konsole zu erstellen ergibt sich durch die JBoss eigene <span class="code">@org.jboss.annotation.ejb.Service Annotation</span>. Diese Annotation <span class="code">@Service</span> definiert im JBoss einen Service der als Singleton, also nur mit einer Instanz (Singleton), verf&#252;gbar ist. So ergibt sich der erste Schritt daraus, einen solchen Service zu erstellen.</p>
<pre name="code" class="java">
import org.jboss.annotation.ejb.Service;

@Service(objectName="MyApplication:service=MyService")
public class MyServiceMBean {

}
</pre>
<p>Noch einmal: die Besonderheit an dieser Service Bean besteht darin, dass auf dem Server nur eine Instanz davon besteht. Im Gegensatz zu EJB Services ist ein MBean Service nicht gepoolt, beh&#228;lt seinen Status (stateful) und hat application-scope. Letztlich ist dies aber eine normale Session Bean, von der lediglich nur eine Instanz besteht. Man arbeitet somit in dem Context der Anwendung und kann auf alle konfigurierten Resourcen, wie z.b. den EntityManager oder andere EJBs, zugreifen.</p>
<p>Um diese Service EJB nun noch JMX f&#228;hig zu machen und sie an einem MBean Server anmelden zu k&#246;nnen, muss nun noch ein Management Interface erstellt und der Service Bean durch die <span class="code">@org.jboss.annotation.ejb.Management</span> Annotation bekannt gemacht werden.</p>
<p>Hier das Management Interface, welche die Getter und Setter f&#252;r das Attribut &#8220;<span class="code">lastWrittenText</span>&#8221; sowie die Service-Methode <span class="code">printOut()</span> deklariert, die sp&#228;ter &#252;ber die JMX Konsole aufgerufen werden k&#246;nnen.</p>
<pre name="code" class="java">
public interface MyManagementInterface {

  public String getLastWrittenText();
  public void setLastWrittenText(String lastWrittenText);

  void printOut(String text);
}
</pre>
<p>Die erstellte Service MBean &#8220;<span class="code">MyServiceMBean</span>&#8221; muss dieses Interface nun noch implementieren und zudem das gleiche Interface durch die <span class="code">@Management</span> Annotation bekannt machen. Erst durch diese <span class="code">@Management</span> Annotation wird der JBoss aus den beschriebenen Attributen und Methoden eine Service MBean erstellen und registrieren. Im folgenden der vollst&#228;ndige Source Code f&#252;r den POJO Service  &#8220;<span class="code">MyServiceMBean</span>&#8220;:</p>
<pre name="code" class="java">
import org.jboss.annotation.ejb.Management;
import org.jboss.annotation.ejb.Service;

@Service(objectName="MyApplication:service=MyService")
@Management(MyManagementInterface.class)
public class MyServiceMBean implements MyManagementInterface {

  private String lastWrittenText;

  public void printOut(String text) {
    System.out.println("Given text: " + text);
    lastWrittenText = text;
  }

  public String getLastWrittenText() {
    return lastWrittenText;
  }

  public void setLastWrittenText(String lastWrittenText) {
    this.lastWrittenText = lastWrittenText;
  }
}
</pre>
<p>In dem Code ist zu sehen, das bei der <span class="code">@Service</span> Annotation noch ein Objektname zu finden ist. Dieser dort definierte Name erscheint nach dem Starten des JBoss und dem erfolgreichem deployen der Anwendung in der JMX Konsole (Aufzurufen durch <span class="code">http://localhost:8080/jmx-console/</span>). Im folgenden Screenshot findet man die definierten Namen wieder:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2008/06/0806_jbosstest_jmx_myservice.gif" alt="" title="JBoss JMX Konsole - POJO Service MBean" class="borderGray alignnone size-full wp-image-81" />
</div>
<p>Selektiert man diesen Service gelangt man in die Service View, in der man alle Attribute und Methoden des Services sehen und aufrufen kann. In diesem Beispiel soll die Methode <span class="code">printOut(String)</span> aufgerufen werden:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2008/06/0806_jbosstest_jmx_mbean.gif" alt="" title="JBoss Service MBean View" class="borderGray alignnone size-full wp-image-82" />
</div>
<p>Nach der Eingabe des Methodenparameters &#8220;<span class="code">test string</span>&#8221; und dem anschlie&#223;enden Klicken des Buttons &#8220;invoke&#8221; erscheint auch, wie erwartet, der &#252;bergebene Text in der Server Konsole:</p>
<div class="codebox" style="margin-top: 5px; margin-bottom: 25px;">
&#8230;<br />
23:08:51,882 INFO  [Server] JBoss (MX MicroKernel) [4.2.2.GA (build: SVNTag=JBoss_4_2_2_GA date=200710221139)] Started in 21s:386ms<br />
22:09:12,668 INFO  [STDOUT] Given text: test string
</div>
<div class="subHeadline"><a name="mgmtIfXml" class="noLink">JMX Konsole &#8211; Management Interface mit XML beschreiben</a></div>
<p>Leider hat man durch die Verwendung der Annotationen keine M&#246;glichkeit die Service Bean, Attribute, Methoden oder Paramter zu beschreiben, wie es bei der urspr&#252;nglichen XMBean Variante noch als gro&#223;er Vorteil angepriesen wurde.<br />
Die gute Nachricht ist, dass auch hier eine M&#246;glichkeit besteht diese Beschreibungen zu liefern. Der Nachteil an der Sache ist, man muss wieder auf eine XML Beschreibung zur&#252;ckgreifen. Und zwar kommt wieder der XML Deployment Descriptor der XMBeans ins Spiel. Man kann genau diesen in der <span class="code">@Service</span> Annotation angeben.</p>
<pre name="code" class="java">
@Service(objectName="MyApplication:service=MyService",
		 xmbean="resource:META-INF/myService-xmbean.xml")
public class MyServiceMBean  implements MyManagementInterface {
  ...
}
</pre>
<p>Wichtig ist, dass die <span class="code">@Management</span> Annotation entfernt werden muss weil nun wieder der XMBeans Deployment Descriptor die Beschreibung der MBean &#252;bernimmt. In diesem Beispiel hei&#223;t der Deployment Descriptor <span class="code">myService-xmbean.xml</span> und liegt im <span class="code">META-INF</span> Ordner, direkt neben der <span class="code">persistence.xml</span> Datei. Wenn die Datei nicht gefunden wird schmei&#223;t der JBoss AS w&#228;hrend des Startens Exceptions, so dass der Fehler schnell bemerkt wird.</p>
<p>Der XMBeans Deployment Descriptor <span class="code">myService-xmbean.xml</span> sieht f&#252;r die oben gelistete POJO Service Klasse wie folgt aus:</p>
<p><code></p>
<pre name="code" class="xml">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE mbean PUBLIC "-//JBoss//DTD JBOSS XMBEAN 1.0//EN"
  "http://www.jboss.org/j2ee/dtd/jboss_xmbean_1_0.dtd"&gt;

<mbean>
  <description>javathreads.de - MyService MBean Beschreibung</description>

  <class>de.webthreads.tippit.mgmt.MyServiceMBean</class>

  <!-- Attributes -->
  <attribute access="read-write" getMethod="getLastWrittenText" setMethod="setLastWrittenText">
    <description>Der zuletzt ausgegebene Text wird hier gehalten.</description>
    <name>LastWrittenText</name>
    <type>java.lang.String</type>
  </attribute>

  <!-- Operations -->
  <operation>
    <description>Methode um einen Text auf der Konsole auszugeben.</description>
    <name>printOut</name>
<parameter>
      <description>Der Text der ausgegeben werden soll.</description>
      <name>text</name>
      <type>java.lang.String</type>
    </parameter>
    <return-type>void</return-type>
  </operation>
</mbean>
</pre>
<p></code></p>
<p>In der XML Datei sind die Beschreibungen f&#252;r das Attribut sowie der Methode zu sehen. Die DTD des <span class="code">mbean</span> Elements sieht wie folgt aus:</p>
<div style="text-align:center">
<a href="http://www.redhat.com/docs/manuals/jboss/jboss-eap-4.2/doc/Server_Configuration_Guide/JBoss_JMX_Implementation_Architecture-JBoss_XMBeans.html"><img src="http://javathreads.de/data/uploads/2008/07/xmbean_1_2_dtd.jpg" alt="" title="jboss_xmbean_1_2.dtd" class="borderImgGray alignnone size-full wp-image-132" /></a>
</div>
<p>Schaut man sich jetzt die JMX Konsole an sind die Beschreibungen nun auch vorhanden, wie man im folgenden Screenshot sehen kann:</p>
<div class="singleImgDiv">
<img src="http://javathreads.de/data/uploads/2008/06/0806_jbosstest_jmx_servicebean-xmbean.gif" alt="" title="JBoss Service MBean View - XMBean mit Beschreibungen" class="borderGray alignnone size-full wp-image-83" />
</div>
<p>Ich habe in diesem Screenshot mal die Abh&#228;ngkigkeit zur XMBean hervorgehoben. Vergleicht man diese Zeile mit dem Screenshot der JMX MBean View der MBean, die mit der <span class="code">@Management</span> erstellt wurde, so sieht man dort die Zeile: <span class="code">MBean Java Class: de.javathreads.jbosstest.mgmt.MyManagementInterface</span></p>
<p>Auch so kann man also erkennen welcher Weg gegangen wurde um eine MBean f&#252;r die JMX Konsole zu erstellen.</p>
<div class="subHeadline">Fazit</div>
<p>Insgesamt war das Erstellen einer solchen Service MBean im JBoss so einfach, dass ich es hier kurz dokumentieren musste =). Der Weg dahin hat doch etwas l&#228;nger gedauert aber dadurch bin ich &#252;ber einige interessante Seiten gestolpert, wie zum Beispiel das <a href="http://wiki.jboss.org/wiki/Wiki.jsp?page=FAQJBossJMX">JBoss Wiki &#8211; JMX FAQ</a> oder das wirklich gute Tutorial von <a href="http://trailblazer.demo.jboss.com/EJB3Trail/serviceobjects/jmx/">JBoss Trailblazer</a>. Nach dem lesen und googeln habe ich es ausprobiert und es hat tats&#228;chlich (fast) auf Anhieb funktioniert.<br />
Und jetzt w&#228;hrend ich diesen Artikel fast zu Ende geschrieben habe entdecke ich noch eine <a href="http://www.tutego.com/blog/javainsel/2007/02/service-ejbs-bei-jboss-ejb-31-ruft.html">Blitzanleitung</a> auf dem Blog von Christian Ullenboom (Author von Java ist auch eine Insel) mit einer Schnelleinf&#252;hrung..</p>
<p>Und gerade weil das Erstellen eines solchen JMX MBean Service eigentlich so einfach ist sollten diese Erkenntnisse hier festgehalten werden.</p>
<div style="margin-top: 20px">
Updates<br />
[27.06.] <em>Aufgrund einer Nachfrage im Kommentar wurde der Abschnitt &#8220;<a href="#verschArtenMBeans">Verschiedene Arten der JBoss MBean Services</a>&#8221; und der letzte Abschnitt &#8220;<a href="#mgmtIfXml">Management Interface mit XML Beschreiben</a>&#8221; nachtr&#228;glich in diesem Artikel eingef&#252;gt.</em><br />
[21.07.] <em>XMBean DTD Grafik und Link zur JBoss Doku hinzugef&#252;gt.</em>
</div>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2008/06/eine-ejb-als-jmx-mbean-fuer-jboss-as-erstellen/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>JBoss Portal Bridge &#8211; JSF in Portlets</title>
		<link>http://javathreads.de/2008/02/jboss-portal-bridge-jsf-in-portlets/</link>
		<comments>http://javathreads.de/2008/02/jboss-portal-bridge-jsf-in-portlets/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 21:22:36 +0000</pubDate>
		<dc:creator>Markus Kühle</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[JBoss Portal]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[JSR 301]]></category>
		<category><![CDATA[RichFaces]]></category>
		<category><![CDATA[Seam]]></category>

		<guid isPermaLink="false">http://javathreads.de/2008/02/jboss-portal-bridge-jsf-in-portlets/</guid>
		<description><![CDATA[Wer JSF Anwendungen in einem Portlet in einem Portal laufen lassen m&#246;chte der kommt an dem JSR 301 nicht vorbei. Der JSR 301 ist die Portlet Bridge Spezifikation f&#252;r Java Server Faces (JSF), welches die Semantik eines Portlets nach JSR 168 (Portlet Spezifikation) und JSR 286 (Portlet Spezifikation 2.0) beschreibt.

F&#252;r den JSR 301 bestehen schon [...]]]></description>
			<content:encoded><![CDATA[<p>Wer JSF Anwendungen in einem Portlet in einem Portal laufen lassen m&#246;chte der kommt an dem <a href="http://jcp.org/en/jsr/detail?id=301">JSR 301</a> nicht vorbei. Der JSR 301 ist die Portlet Bridge Spezifikation f&#252;r Java Server Faces (JSF), welches die Semantik eines Portlets nach <a href="http://jcp.org/en/jsr/detail?id=168">JSR 168</a> (Portlet Spezifikation) und <a href="http://jcp.org/en/jsr/detail?id=286">JSR 286</a> (Portlet Spezifikation 2.0) beschreibt.</p>
<div class="singleImgDiv"><a href="http://labs.jboss.com/portletbridge/" title="JBoss Portlet Bridge"><img src='http://javathreads.de/data/uploads/2008/02/jbossportletbridgelogo.png' alt='JBoss Portal Bridge Logo' /></a></div>
<p><span id="more-12"></span>F&#252;r den JSR 301 bestehen schon mehrere Implementierungen vorhanden, wie zum Beispiel die <a href="https://jsfportletbridge.dev.java.net/">OpenPortal JSF Portlet Bridge</a> oder die <a href="http://myfaces.apache.org/portlet-bridge/index.html">MyFaces Portlet Bridge</a>.<br />
Nun hat auch JBoss eine eigene <a href="http://labs.jboss.com/portletbridge/">Portlet Bridge Implementierung</a> ver&#246;ffentlicht, die es erm&#246;glichen soll einfach beliebige Web Frameworks in Portlets einzubinden. In der ersten 1.0.0 Beta Version werden <a href="http://www.jboss.com/products/seam">JBoss Seam</a> und <a href="http://labs.jboss.com/jbossrichfaces/">JBoss RichFaces</a> direkt unterst&#252;tzt.</p>
<p>In einer Demo ist das Seam Beispiel &#8220;<a href="http://livedemo.exadel.com/portal/portal/default/seamBookingPortlet">Hotel Booking</a>&#8221; in einem JBoss Portal zu sehen.</p>
<div class="singleImgDiv"><a href="http://livedemo.exadel.com/portal/portal/default/seamBookingPortlet" title="JBoss Portlet Bridge - Seam Hotel Booking Demo"><img src='http://javathreads.de/data/uploads/2008/02/jbossportletbridge.jpg' alt='JBoss Portlet Bridge - Seam Hotel Booking Beispiel' /></a></div>
<p>In einem weiteren Demo kann man die <a href="https://www.redhat.com/apps/WebForm/richfaces_demo.html">RichFaces Demo Seite</a> komplett in einem Portlet abrufen und ausf&#252;hren. Das am&#252;sante hier ist, dass man an die <a href="http://livedemo.exadel.com/richfaces-demo/">offizielle RichFaces Demo Seite</a> nur noch &#252;ber ein Login austesten darf w&#228;hrend &#252;ber die Portlet Bridge Demo Seite die RichFaces Demos noch &#246;ffentlich zug&#228;nglich sind. Aber generell finde ich es schade, dass man sich f&#252;r die RichFaces Demo Seite erst anmelden muss..</p>
<div class="singleImgDiv"><a href="http://livedemo.exadel.com/portal/portal/default/default" title="JBoss Portlet Bridge - RichFaces Demo"><img src='http://javathreads.de/data/uploads/2008/02/jbossportletbridgerichfacesdemo.jpg' alt='JBoss Portal Bridge - RichFaces Demo' /></a></div>
<p>F&#252;r die Dokumentation hat JBoss wieder ein eigenes <a href="http://labs.jboss.com/wiki/JBossPortletBridge">Portlet Bridge Wiki</a> angelegt. Dort sind schon einige Seiten erstellt worden unter anderem ist auch die Seite &#8220;<a href="http://labs.jboss.com/wiki/WikiJBPBGettingStarted">Getting Started</a>&#8221; zu finden. Ein Beispiel wie die Konfiguration in der faces-config.xml, portlet.xml und web.xml f&#252;r die Einbindung aussieht ist auch im Wiki auf der Seite <a href="http://labs.jboss.com/wiki/WikiJBPBConfig">WikiJBPBConfig</a> zu sehen.<br />
F&#252;r Fragen aller Art steht auch noch ein eigenes <a href="http://www.jboss.com/index.html?module=bb&#038;op=viewforum&#038;f=273">Forum</a> zur Verf&#252;gung.</p>
<p>(via <a href="http://blog.jboss-portal.org/2008/02/jboss-portlet-bridge-100-beta-released.html">JBoss Portal Blog</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://javathreads.de/2008/02/jboss-portal-bridge-jsf-in-portlets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

