<?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/"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:media="http://search.yahoo.com/mrss/"
> <channel><title>Blog Xebia France &#187; Weblogic</title> <atom:link href="http://blog.xebia.fr/tag/weblogic/feed/" rel="self" type="application/rss+xml" /><link>http://blog.xebia.fr</link> <description>J2EE, Agilité et SOA</description> <lastBuildDate>Wed, 08 Feb 2012 09:23:16 +0000</lastBuildDate> <language>fr</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <copyright>CC BY-NC-ND 2.0 http://creativecommons.org/licenses/by-nc-nd/2.0/fr/</copyright> <managingEditor>blog-france@xebia.com (Xebia France)</managingEditor> <webMaster>blog-france@xebia.com (Xebia France)</webMaster> <ttl>1440</ttl> <image> <url>http://blog.xebia.fr/videos/xebia-podcast.png</url><title>Blog Xebia France</title><link>http://blog.xebia.fr</link> <width>144</width> <height>144</height> </image> <itunes:new-feed-url>http://blog.xebia.fr/feed/podcast/</itunes:new-feed-url> <itunes:subtitle>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agi[...]</itunes:subtitle> <itunes:summary>Les podcasts de Xebia France vous permettent de suivre l&#039;actualité autour de Java, de l&#039;agilité, des technologies Web et bien d&#039;autres. Xebia France est une entreprise spécialisée dans les technologies Java et JEE en environnement agile.</itunes:summary> <itunes:keywords>Xebia, Java, JEE, SOA, Agile, Méthodes, Agiles</itunes:keywords> <itunes:category text="Technology" /> <itunes:category text="Technology"> <itunes:category text="Software How-To" /> </itunes:category> <itunes:category text="Technology"> <itunes:category text="Tech News" /> </itunes:category> <itunes:author>Xebia France</itunes:author> <itunes:owner> <itunes:name>Xebia France</itunes:name> <itunes:email>blog-france@xebia.com</itunes:email> </itunes:owner> <itunes:block>no</itunes:block> <itunes:explicit>no</itunes:explicit> <itunes:image href="http://blog.xebia.fr/videos/xebia-podcast.png" /> <item><title>WebLogic Persistent Store</title><link>http://blog.xebia.fr/2008/08/06/weblogic-persistent-store/</link> <comments>http://blog.xebia.fr/2008/08/06/weblogic-persistent-store/#comments</comments> <pubDate>Wed, 06 Aug 2008 06:43:48 +0000</pubDate> <dc:creator>Benoit Moussaud</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[JMS]]></category> <category><![CDATA[Weblogic]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/?p=553</guid> <description><![CDATA[Le serveur d&#8217;applications Weblogic permet de déclarer des serveurs JMS. À chaque serveur JMS est associé un Persistent Store, emplacement destiné à persister les messages JMS en cas d&#8217;interruptions de service entre la publication d&#8217;un message et sa consommation. Deux supports possibles : File Persistence Store, un répertoire accessible par le serveur Weblogic composé d&#8217;un [...]]]></description> <content:encoded><![CDATA[<p>Le serveur d&#8217;applications Weblogic permet de déclarer des serveurs JMS. À chaque serveur JMS est associé un Persistent Store, emplacement destiné à persister les messages JMS en cas d&#8217;interruptions de service entre la publication d&#8217;un message et sa consommation. Deux supports possibles :</p><ul><li>File Persistence Store, un répertoire accessible par le serveur Weblogic composé d&#8217;un ou plusieurs fichiers de structures binaires (.DAT)</li><li>JDBC Persistence Store, ensemble de tables contenues dans une base de données relationnelle et accessible à travers une &#8216;DataSource&#8217;. La structure des tables et leur contenu sont exclusiment gérés par le serveur d&#8217;applications.</li></ul><p>Le <a
href="http://edocs.bea.com/wls/docs92/config_wls/store.html#compare" title="choix de l'un des deux types de stockage" >choix de l&#8217;un des deux types de stockage</a> est principalement dicté par des contraintes d&#8217;architecture et d&#8217;exploitation; les avantages de l&#8217;un sont les inconvénients de l&#8217;autre.</p><p>Jusqu&#8217;à la version 8 de Weblogic, il était impossible de pouvoir les administrer, en particulier pouvoir les ouvrir, analyser ou dumper leur contenu.</p><p>À partir de la version 9, le serveur d&#8217;applications propose un outil : weblogic.store.Admin</p><pre class="brush: java; title: ; notranslate">
java -classpath ${WLS_DIR}/servir/lib/weblogic.jar weblogic.store.Admin
</pre><p>Les commandes principales sont : <a
href="http://blog.xebia.fr/2008/08/06/weblogic-persistent-store/#Open">open</a>, <a
href="http://blog.xebia.fr/2008/08/06/weblogic-persistent-store/#Dump">dump</a> et <a
href="http://blog.xebia.fr/2008/08/06/weblogic-persistent-store/#Compact">compact</a>.</p><h3><a
name="Open"></a>Open</h3><p>La première opération à effectuer est de se connecter au Persistent Store, soit par <em>openfile</em>, soit par <em>openjdbc</em>. Le reste des commandes resteront identiques vis-à-vis du type de store.<br
/> <code><br
/> <strong>storeadmin-> openfile -store FileStore_auto_1 -dir FileStore_auto_1</strong><br
/> &lt;Jul 25, 2008 4:03:48 PM MEST&gt; &lt;Info&gt; &lt;Store&gt; &lt;BEA-280050&gt; &lt;Persistent store "FileStore_auto_1" opened: directory="FileStore_auto_1" writePolicy="Cache-Flush" blockSize=512 direc  tIO=false driver="NIO"&gt;<br
/> INFO: Store FileStore_auto_1 opened successfully<br
/> storeadmin->list<br
/> INFO: Currently open stores :<br
/> FileStore_auto_1<br
/> <strong>storeadmin-></strong><br
/> </code></p><h3><a
name="Dump"></a>Dump</h3><p>Cette commande permet d&#8217;obtenir le contenu du store et de le transférer dans un fichier<br
/> <code><br
/> <strong>storeadmin-> dump -store FileStore_auto_1 -out /tmp/dump_FileStore_auto_1.log</strong><br
/> INFO: Dump from FileStore_auto_1 to /tmp/dump_FileStore_auto_1.log.xml successful<br
/> </code></p><p>Le contenu du fichier indique le nombre total de messages, le nombre de création, lecture, mise à jour et suppression avec le détail par connexion.</p><pre class="brush: xml; title: ; notranslate">
&lt;PersistentStore Name=&quot;FileStore_auto_1&quot; Open=&quot;true&quot;&gt;
  &lt;IOLayer&gt;
    &lt;FileStore Directory=&quot;FileStore_auto_1&quot; WritePolicy=&quot;Cache-Flush&quot; BlockSize=&quot;452&quot; SupportOSDirectIO=&quot;false&quot; HeapVersion=&quot;2&quot;&gt;&lt;/FileStore&gt;
  &lt;/IOLayer&gt;
  &lt;Statistics&gt;
    &lt;NumObjects&gt;36737&lt;/NumObjects&gt;
    &lt;Creates&gt;0&lt;/Creates&gt;
    &lt;Reads&gt;0&lt;/Reads&gt;
    &lt;Updates&gt;0&lt;/Updates&gt;
    &lt;Deletes&gt;0&lt;/Deletes&gt;
    &lt;PhysicalWrites&gt;0&lt;/PhysicalWrites&gt;
    &lt;PhysicalReads&gt;0&lt;/PhysicalReads&gt;
  &lt;/Statistics&gt;
....
&lt;/PersistentStore&gt;
</pre><p>Il existe une option à la commande dump qui permet d&#8217;avoir non seulement les statistiques, mais également le contenu des éléments, ici les messages JMS<br
/> <code><br
/> <strong>storeadmin->dump -store FileStore_auto_1 -out /tmp/dump_FileStore_auto_1.log.deep -deep</strong><br
/> INFO: Dump from FileStore_auto_1 to /tmp/dump_FileStore_auto_1.log.deep.xml successful<br
/> </code><br
/> <strong>Attention</strong> : la taille de ce fichier peut être extrêmement importante, c&#8217;est une projection XML de données stockées en mode binaire&nbsp;!</p><pre class="brush: xml; title: ; notranslate">
&lt;Connection Name=&quot;weblogic.messaging.wlsbJMSServer_auto_1.header&quot; Kind=&quot;normal&quot; Typecode=&quot;3&quot;&gt;
  &lt;Statistics&gt;
    &lt;NumObjects&gt;0&lt;/NumObjects&gt;
    &lt;Creates&gt;0&lt;/Creates&gt;
    &lt;Reads&gt;0&lt;/Reads&gt;
    &lt;Updates&gt;0&lt;/Updates&gt;
    &lt;Deletes&gt;0&lt;/Deletes&gt;
  &lt;/Statistics&gt;
  &lt;Records&gt;
    &lt;Record TypeCode=&quot;3&quot; SlotNum=&quot;1798&quot; HandleNum=&quot;2490510606351&quot; FileNum=&quot;0&quot; BlockNum=&quot;148446&quot; NumBlocks=&quot;15&quot;&gt;
      &lt;RecordContents&gt;    0: 0001 0000 0101 0000 0000 0000 0006 0000   ................
   16: 0000 0000 ba74 0000 0000 0005 0801 0000   .....t..........
   32: 0000 0017 e64a 0000 0000 0000 1bce 7fff   .....J..........
   48: ffff 0008 1e2d 0204 0000 0000 0000 0030   .....-.........0
   64: 0000 0002 0066 0011 5245 504f 5254 494e   .....f..REPORTIN
   80: 4744 4154 4154 5950 4500 6800 0000 0200   GDATATYPE.h.....
   96: 6600 074d 5347 5459 5045 0068 0000 0001   f..MSGTYPE.h....
  112: 0c00 0001 1b59 bea7 0e00 0000 0000 0c63   .....Y.........c
  128: ce00 0000 0002 0000 1bce aced 0005 7372   ..............sr
  144: 0037 636f 6d2e 6265 612e 776c 692e 7265   .7com.bea.wli.re
  160: 706f 7274 696e 672e 6a6d 7370 726f 7669   porting.jmsprovi
  176: 6465 722e 7275 6e74 696d 652e 5265 706f   der.runtime.Repo
  192: 7274 4d65 7373 6167 6576 850c c3d6 d6bf   rtMessagev......
  208: 8502 0004 5b00 0a62 696e 5061 796c 6f61   ....[..binPayloa
</pre><h3><a
name="Compact"></a>Compact</h3><p>L&#8217;ajout et la suppression d&#8217;éléments dans le store peuvent engendrer de la fragmentation. L&#8217;outil permet d&#8217;effectuer un compactage d&#8217;un PersistenceStore <strong>non-ouvert</strong>.<br
/> <code><br
/> <strong>storeadmin-> close -store FileStore_auto_1</strong><br
/> INFO: Store FileStore_auto_1 closed successfully<br
/> <strong>storeadmin-> compact -dir FileStore_auto_1 -tempdir /var/weblogic/</strong><br
/> &lt;Jul 25, 2008 4:26:16 PM MEST&gt; &lt;Info&gt; &lt;Store&gt; &lt;BEA-280050&gt; &lt;Persistent store "FILESTORE_AUTO_1" opened: directory="/var/weblogic/STOREADMIN_46757" writePolicy="Cache-Flush" blockSize=512 directIO=false driver="NIO"&gt;<br
/> INFO: Original FileStore_auto_1 moved to /var/weblogic/STOREADMIN_46757<br
/> INFO: Compacting store ... FILESTORE_AUTO_1<br
/> INFO: Store FILESTORE_AUTO_1 opened successfully<br
/> &lt;Jul 25, 2008 4:26:21 PM MEST&gt; &lt;Info&gt; &lt;Store&gt; &lt;BEA-280050&gt; &lt;Persistent store "STOREADMIN_FILESTORE_AUTO_1" opened: directory="FileStore_auto_1" writePolicy="Cache-Flush" blockSize=512 directIO=false driver="NIO"&gt;<br
/> INFO: Store STOREADMIN_FILESTORE_AUTO_1 created and opened successfully<br
/> INFO: Copy from FILESTORE_AUTO_1 to STOREADMIN_FILESTORE_AUTO_1 successful<br
/> INFO: Store FILESTORE_AUTO_1 closed successfully<br
/> INFO: Store STOREADMIN_FILESTORE_AUTO_1 closed successfully<br
/> INFO: Renamed STOREADMIN_FILESTORE_AUTO_1 to FILESTORE_AUTO_1<br
/> INFO: ... Compacted store FILESTORE_AUTO_1<br
/> INFO: Compact of FileStore_auto_1 successful : pre-compact files in /var/weblogic/STOREADMIN_46757<br
/> <strong>storeadmin-></strong><br
/> </code></p><p>Un dernier conseil : il est déconseillé de lancer cet outil alors que le serveur d&#8217;applications est en pleine charge: cela peut provoquer des effets de bords indésirables, du temps de réponse en berne à la corruption irréparable du Persistence Store.</p><p>Référence: <a
href="http://edocs.bea.com/wls/docs92/config_wls/store.html#wp1149755" title="Administering a Persistent Store " >Administering a Persistent Store </a></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/08/06/weblogic-persistent-store/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Les plans de déploiement Weblogic</title><link>http://blog.xebia.fr/2008/04/17/les-plans-de-deploiement-weblogic/</link> <comments>http://blog.xebia.fr/2008/04/17/les-plans-de-deploiement-weblogic/#comments</comments> <pubDate>Thu, 17 Apr 2008 09:33:25 +0000</pubDate> <dc:creator>Benoit Moussaud</dc:creator> <category><![CDATA[Exploitation]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Administration]]></category> <category><![CDATA[Déploiement]]></category> <category><![CDATA[Weblogic]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/04/17/les-plans-de-deploiement-weblogic/</guid> <description><![CDATA[&#171;&#160;Il faudrait pouvoir changer le nom de la DataSource en fonction des environnements&#160;&#187; &#171;&#160;Ouh la la, c&#8217;est compliqué, il faut décompresser l&#8217;archive de l&#8217;application MonApp.ear et les 5 fichiers .war et les 8 fichiers .jar des ejb. Ça prendra 3 semaines minimum, et sans la documentation!&#160;&#187; (La fonctionnalité &#171;&#160;plans de déploiement&#160;&#187; décrite dans cette article [...]]]></description> <content:encoded><![CDATA[<p><em>&laquo;&nbsp;Il faudrait pouvoir changer le nom de la DataSource en fonction des environnements&nbsp;&raquo;</em><br
/> <em>&laquo;&nbsp;Ouh la la, c&#8217;est compliqué, il faut décompresser l&#8217;archive de l&#8217;application MonApp.ear et les 5 fichiers .war et les 8 fichiers .jar des ejb. Ça prendra 3 semaines minimum, et sans la documentation!&nbsp;&raquo;</em></p><p><em><strong>(La fonctionnalité &laquo;&nbsp;plans de déploiement&nbsp;&raquo; décrite dans cette article est disponible à partir de WebLogic 9)</strong></em></p><p>Lors de l&#8217;<a
href="http://blog.xebia.fr/2008/03/11/packagez-vos-sources-de-donnees-avec-weblogic/" title="article précédent" >article précédent</a>, nous avions montré comment packager un pool de connexions JDBC avec un EAR. Il semble évident que si cette solution est intéressante, elle n&#8217;est suffisante pour paramétrer cette application dans différents environnements projets (Recette, Pré-Production ou Production). Il n&#8217;est pas envisageable que pour chaque environnement, il faille ouvrir l&#8217;archive, modifier le fichier XML avec les nouveaux paramètres et pour finir de la refermer.<br
/> L&#8217;idée des plans de déploiement est de laisser l&#8217;archive telle quelle et de lui associer au moment du déploiement les nouveaux paramètres. Un plan de déploiement est un fichier XML qui reprend l&#8217;ensemble des nouveaux paramètres à surcharger.</p><p>Reprenons l&#8217;application MyWebApplicationEAR décrite dans la première partie et appliquons un plan de déploiement pour modifier quelques paramètres.</p><h3><a
name="Prparationdelenvironnementdetr"></a>Préparation de l&#8217;environnement de travail</h3><pre class="brush: plain; title: ; notranslate">
mkdir DeployementPlan
mkdir DeployementPlan/MyWebApplicationEAR
mkdir DeployementPlan/MyWebApplicationEAR/app
cp MyWebApplicationEAR.ear DeployementPlan/app
#vérifions la structure de répertoire
find DeployementPlan
./MyWebApplicationEAR
./MyWebApplicationEAR/app
./MyWebApplicationEAR/app/MyWebApplicationEAR.ear
</pre><h3><a
name="Gnrationdutemplateduplan"></a>Génération du template du plan</h3><p>WebLogic fournit un outil qui permet de générer un template de plan de déploiement basé sur les différents éléments de l&#8217;ear passé en paramètre.</p><pre class="brush: plain; title: ; notranslate">
cd D:xebia-blogdeploymentplan
java -classpath ${WLS_HOME}/server/lib/weblogic jar weblogic.PlanGenerator -root MyWebApplicationEAR
Generating plan for application MyWebApplicationEARappMyWebApplicationEAR.ear
Export option is: dependencies
Exporting properties...
Saving plan to D:xebia-blogdeploymentplanMyWebApplicationEARplanplan.xml...
&lt;4 avr. 2008 18 h 03 CEST&gt; &lt;Info&gt; &lt;J2EE Deployment SPI&gt; &lt;BEA-260072&gt; &lt;Saved configuration for application, MyWebApplicationEAR.ear&gt;
MyWebApplicationEAR
+---app
|       MyWebApplicationEAR.ear
|
---plan
        plan.xml
</pre><p>Le fichier template du plan (plan.xml) a été créé dans le répertoire plan</p><h3><a
name="Structuredufichierplanxml"></a>Structure du fichier plan.xml</h3><p>A ce niveau du processus, le fichier plan.xml contient uniquement la définition des différents modules qui composent l&#8217;archive EAR. On retrouve donc:</p><ul><li>un module MyWebApplicationEAR.ear, de type EAR, avec 3 descripteurs de déploiement (weblogic-application.xml, application.xml et ds-jdbc.xml)</li><li>un module MyWebApplication.war, de type WAR, avec 2 descripteurs de déploiement (web.xml et weblogic.xml)</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;?xml version='1.0' encoding='UTF-8'?&gt;
&lt;deployment-plan xmlns=&quot;http://www.bea.com/ns/weblogic/90&quot;
 xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
 xsi:schemaLocation=&quot;http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-deployment-plan.xsd&quot;
 global-variables=&quot;false&quot;&gt;
  &lt;application-name&gt;MyWebApplicationEAR.ear&lt;/application-name&gt;
  &lt;!-- Descripteurs portés par l'EAR --&gt;
  &lt;module-override&gt;
    &lt;module-name&gt;MyWebApplicationEAR.ear&lt;/module-name&gt;
    &lt;module-type&gt;ear&lt;/module-type&gt;
    &lt;module-descriptor external=&quot;false&quot;&gt;
      &lt;root-element&gt;weblogic-application&lt;/root-element&gt;
      &lt;uri&gt;META-INF/weblogic-application.xml&lt;/uri&gt;
    &lt;/module-descriptor&gt;
    &lt;module-descriptor external=&quot;false&quot;&gt;
      &lt;root-element&gt;application&lt;/root-element&gt;
      &lt;uri&gt;META-INF/application.xml&lt;/uri&gt;
    &lt;/module-descriptor&gt;
    &lt;module-descriptor external=&quot;false&quot;&gt;
      &lt;root-element&gt;jdbc-data-source&lt;/root-element&gt;
      &lt;uri&gt;META-INF/ds-jdbc.xml&lt;/uri&gt;
    &lt;/module-descriptor&gt;
  &lt;/module-override&gt;
  &lt;!-- Descripteurs portés par le WAR--&gt;
  &lt;module-override&gt;
    &lt;module-name&gt;MyWebApplication.war&lt;/module-name&gt;
    &lt;module-type&gt;war&lt;/module-type&gt;
    &lt;module-descriptor external=&quot;false&quot;&gt;
      &lt;root-element&gt;weblogic-web-app&lt;/root-element&gt;
      &lt;uri&gt;WEB-INF/weblogic.xml&lt;/uri&gt;
    &lt;/module-descriptor&gt;
    &lt;module-descriptor external=&quot;false&quot;&gt;
      &lt;root-element&gt;web-app&lt;/root-element&gt;
      &lt;uri&gt;WEB-INF/web.xml&lt;/uri&gt;
    &lt;/module-descriptor&gt;
  &lt;/module-override&gt;
  &lt;config-root xsi:nil=&quot;true&quot;&gt;&lt;/config-root&gt;
&lt;/deployment-plan&gt;
</pre><h3><a
name="Paramtrageduplanenutilisantlac"></a>Paramétrage du plan en utilisant la console d&#8217;administration</h3><p>Notre plan est vide, il faut maintenant indiquer les paramètres à modifier. Dans un premier temps, le plus simple est d&#8217;utiliser la console d&#8217;administration du domaine.</p><ol><li>Déployer l&#8217;application en sélectionnant le répertoire <code>DeployementPlan/MyWebApplicationEAR</code>.</li><li>Accepter l&#8217;ensemble des valeurs par défaut (Next, Next, Finish)</li><li>Activer les modifications.</li></ol><p>Remarque : On voit que le fichier plan.xml est indiqué comme &#8216;Deployment Plan&#8217;</p><div
align="center"> <object
classid='clsid:\D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0' data='http://blog.xebia.fr/wp-content/uploads/2008/04/deploy-700x406.swf' height='407' type='application/x-shockwave-flash2-preview' width='700' ><param
name='data' value='http://blog.xebia.fr/wp-content/uploads/2008/04/deploy-700x406.swf'/><param
name='loop' value='false'/><param
name='menu' value='false'/><param
name='movie' value='http://blog.xebia.fr/wp-content/uploads/2008/04/deploy-700x406.swf'/><param
name='quality' value='high'/><param
name='scale' value='exactfit'/><param
name='src' value='http://blog.xebia.fr/wp-content/uploads/2008/04/deploy-700x406.swf'/><param
name='type' value='application/x-shockwave-flash2-preview'/><embed
height='407' pluginspage='https://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash' quality='high' src='http://blog.xebia.fr/wp-content/uploads/2008/04/deploy-700x406.swf' type='application/x-shockwave-flash2-preview' width='700' /></object></div><h3><a
name="Paramtragepourunenvironnementd"></a>Paramétrage pour un environnement de Recette.</h3><ol><li>Sélectionner le module MyWebApplicationDS</li><li>Dans le menu Configuration / ConnectionPool, modifier les propriétés UserName et Password (Recette/Recette) et Maximum Capacity=10 et Web Session Timeout (in seconds) = 360.</li><li>Après les différentes phases de sauvegarde, les modifications sont inscrites directement dans le fichier plan/plan.xml, les fichiers de configuration du domaine Weblogic (config/config.xml et consorts) restent inchangés. La console WebLogic indique cette différence par un bouton <strong>&#8216;ReleaseConfiguration&#8217;</strong> et non <strong>&#8216;Apply Changes&#8217;</strong>.</li></ol><div
align="center"> <object
classid='clsid:\D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0' data='http://blog.xebia.fr/wp-content/uploads/2008/04/config-plan-700x400.swf' height='407' type='application/x-shockwave-flash2-preview' width='700' ><param
name='data' value='http://blog.xebia.fr/wp-content/uploads/2008/04/config-plan-700x400.swf'/><param
name='loop' value='false'/><param
name='menu' value='false'/><param
name='movie' value='http://blog.xebia.fr/wp-content/uploads/2008/04/config-plan-700x400.swf'/><param
name='quality' value='high'/><param
name='scale' value='exactfit'/><param
name='src' value='http://blog.xebia.fr/wp-content/uploads/2008/04/config-plan-700x400.swf'/><param
name='type' value='application/x-shockwave-flash2-preview'/><embed
height='407' pluginspage='https://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash' quality='high' src='http://blog.xebia.fr/wp-content/uploads/2008/04/config-plan-700x400.swf' type='application/x-shockwave-flash2-preview' width='700' /></object></div><h3><a
name="Structuredufichierplanxml"></a>Structure du fichier plan.xml</h3><p>Si on examine les modifications faites par la Console Weblogic sur le fichier plan.xml, on peut noter:</p><ul><li>l&#8217;apparition d&#8217;un ensemble de nœuds gardé par &lt;variable-definition/&gt;. Il contient un ensemble de couples de variables (name, value) qui correspondent aux paramètres modifiés</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;deployment-plan xmlns=&quot;http://www.bea.com/ns/weblogic/90&quot;
   xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; ...&gt;
  &lt;application-name&gt;MyWebApplicationEAR&lt;/application-name&gt;
  &lt;!-- Bloc Variable Definition --&gt;
  &lt;variable-definition&gt;
    &lt;variable&gt;
      &lt;name&gt;JDBCDriverParams_PasswordEncrypted_12040376123280&lt;/name&gt;
      &lt;value&gt;{3DES}QZJ2MfqOliA=&lt;/value&gt;
    &lt;/variable&gt;
    &lt;variable&gt;
      &lt;name&gt;JDBCConnectionPoolParams_MaxCapacity_12040378132185&lt;/name&gt;
      &lt;value&gt;10&lt;/value&gt;
    &lt;/variable&gt;
    &lt;variable&gt;
      &lt;name&gt;JDBCProperty_user_Value_12040378358436&lt;/name&gt;
      &lt;value&gt;recette&lt;/value&gt;
    &lt;/variable&gt;
    &lt;variable&gt;
      &lt;name&gt;SessionDescriptor_timeoutSecs_12040384414060&lt;/name&gt;
      &lt;value&gt;360&lt;/value&gt;
    &lt;/variable&gt;
  &lt;/variable-definition&gt;
  .....
&lt;/deployment-plan&gt;
</pre><ul><li>la modification des nœuds <module-descriptor/>. Pour chaque variable qui concerne le module, une expression <a
href="http://fr.wikipedia.org/wiki/XPath" title="XPath" >XPath</a> est définie pour permettre au serveur d&#8217;application d&#8217;effectuer la substitution avec la nouvelle valeur.</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;deployment-plan xmlns=&quot;http://www.bea.com/ns/weblogic/90&quot;
   xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; ...&gt;
....
   &lt;module-descriptor external=&quot;false&quot;&gt;
      &lt;root-element&gt;jdbc-data-source&lt;/root-element&gt;
      &lt;uri&gt;META-INF/ds-jdbc.xml&lt;/uri&gt;
      &lt;variable-assignment&gt;
        &lt;name&gt;JDBCDriverParams_PasswordEncrypted_12040376123280&lt;/name&gt;
        &lt;xpath&gt;/jdbc-data-source/jdbc-driver-params/password-encrypted&lt;/xpath&gt;
      &lt;/variable-assignment&gt;
      &lt;variable-assignment&gt;
        &lt;name&gt;JDBCConnectionPoolParams_MaxCapacity_12040378132185&lt;/name&gt;
        &lt;xpath&gt;/jdbc-data-source/jdbc-connection-pool-params/max-capacity&lt;/xpath&gt;
      &lt;/variable-assignment&gt;
      &lt;variable-assignment&gt;
        &lt;name&gt;JDBCProperty_user_Value_12040378358436&lt;/name&gt;
        &lt;xpath&gt;/jdbc-data-source/jdbc-driver-params/properties/property/[name=&quot;user&quot;]/value&lt;/xpath&gt;
      &lt;/variable-assignment&gt;
    &lt;/module-descriptor&gt;
....
&lt;/deployment-plan&gt;
</pre><p>A partir de ce plan créé pour un environnement de type &#8216;Recette&#8217; (<a
href="http://blog.xebia.fr/wp-content/uploads/2008/04/plan-recette.xml" title="plan-recette.xml" >plan-recette.xml</a>), il est facile de le décliner pour d&#8217;autres environnement, ex la &#8216;Production&#8217; (<a
href="http://blog.xebia.fr/wp-content/uploads/2008/04/plan-production.xml" title="plan production">plan-production.xml</a>). Les changements sont :</p><ul><li>les propriétés UserName et Password (Production/Production) et</li><li>la propriété Maximum Capacity=20.</li></ul><pre class="brush: plain; title: ; notranslate">
DeployementPlanMyWebApplicationEAR
+---app
|       MyWebApplicationEAR.ear
|
---plan
        plan-production.xml
        plan-recette.xml
</pre><p>(Note: le fichier plan.xml a été renommé en &#8216;plan-recette.xml&#8217;).</p><h3><a
name="Utilisationduplan"></a>Utilisation du plan</h3><p>Une fois les plans créés, il est très facile avec <a
href="http://blog.xebia.fr/2007/05/09/weblogic-scripting-tools/" title="WLST">WLST</a> de déployer l&#8217;application sur l&#8217;environnement cible avec son plan de déploiement.<br
/> Note : Une fois les fichiers de plan de déploiement créés, il n&#8217;est pas nécessaire de conserver une arborescence ./app et ./plan comme établi en début d&#8217;article.</p><p>Exemple: déploiement de l&#8217;application MyWebApplicationEAR en mode production.</p><pre class="brush: plain; title: ; notranslate">
deploy(appName='MyWebApplicationEAR',path='/vers/monfichier/ear/MyWebApplicationEAR.ear', planPath=/vers/mon/plan/MyWebApplicationEAR/plan/plan-production.xml')
</pre><p>Vérification avec l&#8217;application MyWebApplication:</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2008/04/6-mode-production2.png" border="0" alt="" /></div><p>Les plans de déploiement peuvent également servir à mettre à jour les paramètres de l&#8217;application si celle-ci est déjà déployée dans le serveur WebLogic</p><ul><li>Soit avec la console d&#8217;administration, deployement &#8211;> update</li></ul><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2008/04/7-update-resized.png" border="0" alt="" /></div><ul><li>Soit avec la commande WLST <a
href="http://edocs.bea.com/wls/docs100/config_scripting/reference.html#wp1039405" title="updateApplication" >updateApplication</a> ou <a
href="http://edocs.bea.com/wls/docs100/config_scripting/reference.html#wp1024321" title="redeploy" >redeploy</a></li></ul><p>Exemple:</p><pre class="brush: java; title: ; notranslate">
updateApplication(''MyWebApplicationEAR','/vers/mon/plan/MyWebApplicationEAR/plan/plan-production-tuning.xml')
</pre><h3><a
name="Conclusion"></a>Conclusion</h3><p>Les plans de déploiement :</p><ul><li>répondent à un besoin longtemps exprimé par les utilisateurs: pouvoir modifier le paramétrage d&#8217;une application sans à nécessiter de lourdes procédures d&#8217;extraction des descripteurs de déploiement enfouis dans les archives J2EE (.ear/.jar/.war).</li><li>permettent de séparer clairement les rôles: d&#8217;un côté les développeurs créent l&#8217;application, de l&#8217;autre le &#8216;déployeur&#8217; ou l&#8217;administrateur adapte l&#8217;application à l&#8217;environnement cible.</li></ul><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/uploads/2008/04/deploymentplan.png" border="0" alt="" /></div><p><a
href="http://edocs.bea.com/wls/docs91/deployment/plan.html" title="Documentation BEA,Deploying Applications to WebLogic Server" >Documentation BEA,Deploying Applications to WebLogic Server</a></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/04/17/les-plans-de-deploiement-weblogic/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2008/03/31/revue-de-presse-xebia-50/</link> <comments>http://blog.xebia.fr/2008/03/31/revue-de-presse-xebia-50/#comments</comments> <pubDate>Mon, 31 Mar 2008 16:17:34 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[BEA]]></category> <category><![CDATA[GlassFish]]></category> <category><![CDATA[IBM]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Méthodes agiles]]></category> <category><![CDATA[MySQL]]></category> <category><![CDATA[SCRUM]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Weblogic]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/03/31/revue-de-presse-xebia-50/</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII GlassFish et MySQL, premiers signes d&#8217;intégration IBM investit dans EnterpriseDB DomainHealth : Un outil de monitoring pour les serveurs Weblogic (9 &#38; 10) Agilité Certification ScrumMaster, on en parle Le coin de la technique Spring WS 1.5 : un fort [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/03/31/revue-de-presse-xebia-50/#GlassFishMySQL">GlassFish et MySQL, premiers signes d&#8217;intégration</a></li><li><a
href="http://blog.xebia.fr/2008/03/31/revue-de-presse-xebia-50/#IBM">IBM investit dans EnterpriseDB</a></li><li><a
href="http://blog.xebia.fr/2008/03/31/revue-de-presse-xebia-50/#DomainHealth">DomainHealth : Un outil de monitoring pour les serveurs Weblogic (9 &amp; 10)</a></li></ul><p><strong>Agilité</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/03/31/revue-de-presse-xebia-50/#CertificationScrumMaster">Certification ScrumMaster, on en parle</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2008/03/31/revue-de-presse-xebia-50/#SpringWS">Spring WS 1.5 : un fort potentiel à concrétiser</a></li><li><a
href="http://blog.xebia.fr/2008/03/31/revue-de-presse-xebia-50/#SpringJavaConfiguration">Milestone 3 pour Spring Java Configuration</a></li></ul><hr/><h3>Actualité éditeurs / SSII</h3><h4><a
name="GlassFishMySQL"></a>GlassFish et MySQL, premiers signes d&#8217;intégration</h4><p>L&#8217;intégration de MySQL au groupe Sun Microsystem n&#8217;a pas tardé. Alexis Moussine-Pouchkine nous présente dans <a
href="http://blogs.sun.com/alexismp/entry/mysql_et_glassfish_dans_un">MySQL et GlassFish dans un bateau</a> l&#8217;intégration du serveur Open Source Glassfish à la célèbre base de données. On y découvre notamment les tarifs des contrats de support et de maintenance, des éléments décisifs pour les équipes d&#8217;exploitation.</p><h4><a
name="IBM"></a>IBM investit dans EnterpriseDB</h4><p><a
href="http://www.enterprisedb.com/">EnterpriseDB</a> vient d&#8217;<a
href="http://www.enterprisedb.com/about/news_events/press_releases/03_25_08a.do">annoncer</a> une levée de fonds de 10 millions de dollars, dont l&#8217;un des principaux investisseurs n&#8217;est autre que IBM. L&#8217;éditeur de DB2 justifie ce choix en rappellant ses investissements dans le monde open source sur des projets tels que Linux, Eclipse et Apache.</p><p>Ce choix peut peut-être aussi s&#8217;expliquer par le fait qu&#8217;EnterpriseDB édite <a
href="http://www.enterprisedb.com/products/postgres_plus_as.do">Postgres Plus Advanced Server</a>, qui se veut être un concurrent direct des bases de données Oracle. Produit commercial s&#8217;appuyant sur la base de données open source <a
href="http://www.postgresql.org/">Postgresql</a> (sous license BSD), Postgres Plus Advanced Server fournit entre autres des outils de migration pour Oracle.</p><p>Quelques liens :</p><ul><li><a
href="http://ostatic.com/158698-blog/enterprisedb-a-new-stake-from-ibm-and-its-novel-approach">http://ostatic.com/158698-blog/enterprisedb-a-new-stake-from-ibm-and-its-novel-approach</a></li><li><a
href="http://news.dzone.com/news/ibm-buys-enterprisedb">http://news.dzone.com/news/ibm-buys-enterprisedb</a></li><li><a
href="http://developers.slashdot.org/article.pl?sid=08/03/25/207211&amp;from=rss">http://developers.slashdot.org/article.pl?sid=08/03/25/207211&amp;from=rss</a></li><li><a
href="http://www.lemondeinformatique.fr/actualites/lire-ibm-injecte-de-l-argent-dans-enterprisedb-25697.html">http://www.lemondeinformatique.fr/actualites/lire-ibm-injecte-de-l-argent-dans-enterprisedb-25697.html</a></li><li><a
href="http://www.01net.com/editorial/375401/ibm-investit-dans-les-bases-de-donnees-open-source-d-enterprisedb/?rss">http://www.01net.com/editorial/375401/ibm-investit-dans-les-bases-de-donnees-open-source-d-enterprisedb/?rss</a></li></ul><h4><a
name="DomainHealth"></a>DomainHealth : Un outil de monitoring pour les serveurs Weblogic (9 &amp; 10)</h4><p>Dans cet <a
href="http://dev2dev.bea.com/blog/pdone/archive/2008/03/new_open_source.html">article</a> disponible sur le blog dev2dev de BEa, j&#8217;apprend l&#8217;existence d&#8217;un produit Open Source permettant de surveiller la bonne santé des serveurs Weblogic. Il permet entre autres de consulter la taille et l&#8217;utilisation de la Heap de la JVM, l&#8217;utilisation des pool de threads d&#8217;exécution, les datasources, les destinations JMS, les WorkManagers et beaucoup autres choses. Bea fournit déjà un outil similaire, une extension de la console d&#8217;administration qui permet d&#8217;obtenir ce type d&#8217;information basé sur le framework de diagnostiques de Weblogic (WLDF). Cependant, cette extension a quelques défaut que comble &#8216;DomainHealtn&#8217;:</p><ul><li>elle n&#8217;est pas activée par défaut, il faut ajouter un jar complémentaire dans un répertoire et redémmarer le serveur (DomainHealth se compose d&#8217;un simple war à déployer)</li><li>elle ne propose pas de vue d&#8217;ensemble sur une page.</li></ul><p>DomainHealth offre de parcourir les données collectées pendant toute la vie du domaine, quid de la consommation mémoire sur un domaine qui ne redémarre jamais ou très rarement ?</p><p>Bref un outil à tester et à surveiller <a
href="http://sourceforge.net/projects/domainhealth">ici</a> !</p><h3>Agilité</h3><h4><a
name="CertificationScrumMaster"></a>Certification ScrumMaster, on en parle</h4><p>Xebia a organisé les 25 et 26 Mars 2008 une formation ScrumMaster certifiante, dispensée par <a
href="http://jeffsutherland.com/">Jeff Sutherland</a>.<br
/> Premiers retours:</p><ul><li><a
href="http://www.touilleur-express.fr/2008/03/26/im-now-a-scrum-master/">http://www.touilleur-express.fr/2008/03/26/im-now-a-scrum-master/</a></li><li><a
href="http://jefute.blogspot.com/2008/03/formation-scrum-master-la-dfense.html">http://jefute.blogspot.com/2008/03/formation-scrum-master-la-dfense.html</a></li></ul><h3>Le coin de la technique</h3><h4><a
name="SpringWS"></a>Spring WS 1.5 : un fort potentiel à concrétiser</h4><p>Spring WS, arrivé bien après les leaders <a
href="http://incubator.apache.org/cxf/">CXF</a> (ex XFire), <a
href="http://ws.apache.org/axis2/">Axis2</a> et <a
href="https://jax-ws.dev.java.net/">Metro</a> (JAXWS-RI par Sun), se démarque par une approche originale qui préfère le <a
href="http://en.wikipedia.org/wiki/Plain_Old_XML">Plain Old Xml</a> à <a
href="http://en.wikipedia.org/wiki/SOAP">SOAP</a> et cherche à s&#8217;affranchir des <a
href="http://en.wikipedia.org/wiki/Web_Services_Description_Language">WSDL</a>. Cette démarche en fait un bon candidat pour traiter les communications non-soap encore très nombreuses dans nos applications.<br
/> Arjen Poutsma nous présente dans <a
href="http://blog.springsource.com/main/2008/03/28/whats-new-in-spring-web-services-15/">What&#8217;s New in Spring Web Services 1.5?</a> les nouvelles fonctionnalités du framework. On notera en particulier le support de JMS, de <a
href="http://www.ibm.com/developerworks/library/specification/ws-secure/">WS-Security</a> et <a
href="http://en.wikipedia.org/wiki/WS-Addressing">WS-Adressing</a>.<br
/> Les points que nous avons aimé dans Spring-WS :</p><ul><li>L&#8217;ouverture aux communications non-SOAP (situation particulièrement fréquente pour les communications sur JMS)</li><li>L&#8217;intégration à la stack Spring plus poussée que celle de CXF ou d&#8217;Axis2.</li><li>La qualité de l&#8217;intégration à JAXB 2 avec le <a
href="http://static.springframework.org/spring-ws/site/apidocs/index.html?org/springframework/oxm/jaxb/Jaxb2Marshaller.html">Jaxb2Marshaller</a> qui est un modèle d&#8217;utilisation de cette API.</li></ul><p>Les points que nous espérons pour les prochaines versions de Spring-WS :</p><ul><li>Un support naturel et documenté de l&#8217;approche wsdl2java avec un plugin maven similaire au <a
href="http://cwiki.apache.org/CXF20DOC/maven-integration-and-plugin.html">cxf-codegen-plugin</a>.</li><li>Des points d&#8217;extension dans l&#8217;API pour enrichir les messages échangés (ajout du header <tt>JMS_IBM_Character_Set</tt> avec Websphere MQ, appel à <tt>Tibjms.setEncoding(Message, String)</tt> pout Tibco EMS, etc).</li><li>Une documentation plus étoffée.</li></ul><h4><a
name="SpringJavaConfiguration"></a>Milestone 3 pour Spring Java Configuration</h4><p>Google avait défrayé la chronique en révélant <a
href="http://code.google.com/p/google-guice/">Google Guice</a>, le framework d&#8217;injection de dépendances d&#8217;<a
href="http://adwords.google.com/">Adwords</a> dont la configuration est gérée avec du code Java plutôt qu&#8217;avec des fichiers XML.<br
/> SpringSource a répondu avec <a
href="http://blog.springsource.com/main/2008/01/28/spring-25s-comprehensive-annotation-support/">l&#8217;utilisation élargie des annotations dans Spring 2.5</a> (<tt>@Autowired</tt>, etc) et le lancement de <a
href="http://springframework.org/javaconfig">Spring Java Configuration Project</a>. Ce deuxième chantier avance plus lentement, probablement parce que le concurrent Google Guice reste peu utilisé et parce que la tâche s&#8217;avère très délicate.<br
/> Chris Beams nous présente les dernières évolutions dans <a
href="http://blog.springsource.com/main/2008/03/26/spring-java-configuration-whats-new-in-m3/">Spring Java Configuration &#8211; What&#8217;s New in M3</a>.<br
/> Nous avons été sensibles à :</p><ul><li>L&#8217;externalisation des variables (<tt>@ExternalValue</tt>) équivalent au <tt>PropertyPlaceholderConfigurer</tt> des configurations XML. Ce mécanisme, incomplet dans Google guice, est particulièrement important pour gérer les paramètres de configuration dont la valeur change suivant les environnements (développement, intégration, production, etc).</li><li>L&#8217;étoffement de la documentation qui accorde notamment une place à l&#8217;intégration à Maven2.</li></ul><p>Si l&#8217;utilisation de Spring JavaConfig n&#8217;est pas encore d&#8217;actualité, voici une bonne occasion de se pencher sur le <a
href="http://static.springframework.org/spring/docs/2.5.x/reference/xsd-config.html">XML Schema-based configuration</a> introduite en version 2.5 qui allège avantageusement la gestion des configurations XML.</p><p>Ressource complémentaire : <a
href="http://blog.springsource.com/main/2008/03/18/spring-dependency-injection-java-5-including-slides-and-code/">Spring Dependency Injection &amp; Java 5</a> par Alef Arendsen ( <a
href="http://blog.springsource.com/main/wp-content/uploads/2008/03/di_with_spring.pdf">slides</a>, <a
href="http://blog.springsource.com/main/wp-content/uploads/2008/03/carplant.zip">exemple source</a>).</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/03/31/revue-de-presse-xebia-50/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Packagez vos sources de données avec WebLogic</title><link>http://blog.xebia.fr/2008/03/11/packagez-vos-sources-de-donnees-avec-weblogic/</link> <comments>http://blog.xebia.fr/2008/03/11/packagez-vos-sources-de-donnees-avec-weblogic/#comments</comments> <pubDate>Tue, 11 Mar 2008 12:00:13 +0000</pubDate> <dc:creator>Benoit Moussaud</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Weblogic]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2008/03/11/packagez-vos-sources-de-donnees-avec-weblogic/</guid> <description><![CDATA[Cet article inaugure une série autour de fonctions avancées et souvent méconnues apparues dans les dernières versions du serveur d&#8217;application WebLogic. Une application J2EE utilise généralement une ou plusieurs sources de données (datasources). La spécification J2EE permet au mieux de référencer le nom JNDI de la source de données dans le descripteur de déploiement de [...]]]></description> <content:encoded><![CDATA[<p><em>Cet article inaugure une série autour de fonctions avancées et souvent méconnues apparues dans les dernières versions du serveur d&#8217;application WebLogic.</em></p><p>Une application J2EE utilise généralement une ou plusieurs sources de données (<em>datasources</em>).  La spécification J2EE permet au mieux de référencer le nom JNDI de la source de données dans le descripteur de déploiement de l&#8217;application (ou de la web-app). En revanche, le paramétrage complet de la source de données (Type, URL JDBC, Taille du Pool,&#8230;) est une opération spécifique à chaque serveur d&#8217;application. Lorsque vient le temps de la livraison de l&#8217;application en dehors de l&#8217;environnement de développement (Intégration, Recette, &#8230;), les équipes fournissent généralement l&#8217;archive de l&#8217;application à déployer et un document d&#8217;installation au format Word. Il décrit, à l&#8217;aide de nombreuses copies d&#8217;écran, les opérations à effectuer à travers l&#8217;application d&#8217;administration pour déclarer et paramétrer les sources de données avant de procéder au déploiement du fichier MonApplication.ear proprement dit. Cet article montre comment avec le serveur d&#8217;application Weblogic 9+, il est possible d&#8217;associer, à l&#8217;application à déployer, l&#8217;ensemble des ses ressources, en particulier, le paramétrage de ses sources de données.</p><p>Exemple: Pour illustrer mon propos, j&#8217;utiliserai une application web, MyWebApplication, qui affiche des informations sur une connexion JDBC obtenue par une DataSource inscrite dans l&#8217;arbre JDNI. Cette application est classiquement packagée sous forme d&#8217;une archive web, MyWebApplication.war, elle-même encapsulée dans une archive MyWebApplicationEAR.ear.</p><p><a
href='http://blog.xebia.fr/wp-content/uploads/2008/03/mywebapplicationear.ear' title='mywebapplicationear.ear'>télécharger MyWebApplicationEAR.ear</a> et retrouver l&#8217;ensemble des sources dans le repository <a
href="http://code.google.com/p/xebia-france/source/browse">SVN de Xebia France</a>, branche /svn/trunk/wls/deployment.</p><p>Si on déploie cette application et que la source de données MyDataSource n&#8217;est pas correctement installée, par exemple suite à un mauvais paramétrage du nom JNDI, on obtient l&#8217;erreur suivante:</p><pre class="brush: java; title: ; notranslate">
javax.naming.NameNotFoundException:
Unable to resolve 'MyDataSource'. Resolved ''; remaining name 'MyDataSource'
</pre><div
align="center"> <img
src='http://blog.xebia.fr/wp-content/uploads/2008/03/namenotfoundexception.png' alt='NameNotFoundException.png' /></div><p>Depuis la version 9, le serveur d&#8217;application WebLogic offre un moyen de packager les ressources JDBC dans l&#8217;archive ear.</p><p><strong>Etapes</strong></p><p>Dans le fichier META-INF/weblogic-application.xml,spécifique à l&#8217;éditeur, déclarer un module de type JDBC.</p><pre class="brush: xml; title: ; notranslate">
&lt;wls:module&gt;
  &lt;wls:name&gt;MyWebApplicationDS&lt;/wls:name&gt;
  &lt;wls:type&gt;JDBC&lt;/wls:type&gt;
  &lt;wls:path&gt;META-INF/ds-jdbc.xml&lt;/wls:path&gt;
&lt;/wls:module&gt;
</pre><p>Cette configuration indique que le fichier ds-jdbc.xml placé dans le répertoire META-INF de l&#8217;archive contient des élements de configuration de type &#8216;source de données&#8217; (<wls:type>JDBC</wls:type>)</p><ul><li> l&#8217;extension -jdbc.xml est obligatoire (sic !)</li><li> le répertoire de stockage du fichier xml est libre. Il est possible de placer ces modules dans un répertoire autre que &#8216;META-INF/&#8217;, par exemple &#8216;modules/&#8217;.</li><li> si <a
href="http://www.eclipse.org/webtools/">Eclipse WTP</a>est utilisé comme IDE, déposer les modules dans le répertoire META-INF/ et ils seront automatiquement intégrés au packaging de l&#8217;EAR et déployés sur le serveur d&#8217;application.</li></ul><p>Contenu du fichier META-INF/ds-jdbc.xml:</p><pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;jdbc-data-source xmlns=&quot;http://www.bea.com/ns/weblogic/90&quot;
    xmlns:sec=&quot;http://www.bea.com/ns/weblogic/90/security&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xmlns:wls=&quot;http://www.bea.com/ns/weblogic/90/security/wls&quot;
    xsi:schemaLocation=&quot;http://www.bea.com/ns/weblogic/90/domain.xsd&quot;&gt;
    &lt;name&gt;MyDevDataBase&lt;/name&gt;
    &lt;jdbc-driver-params&gt;
        &lt;url&gt;jdbc:oracle:thin:@localhost:1521:xe&lt;/url&gt;
        &lt;driver-name&gt;oracle.jdbc.OracleDriver&lt;/driver-name&gt;
        &lt;properties&gt;
            &lt;property&gt;
                &lt;name&gt;user&lt;/name&gt;
                &lt;value&gt;weblogic&lt;/value&gt;
            &lt;/property&gt;
        &lt;/properties&gt;
        &lt;password-encrypted&gt;weblogic&lt;/password-encrypted&gt;
    &lt;/jdbc-driver-params&gt;
    &lt;jdbc-connection-pool-params&gt;
        &lt;initial-capacity&gt;1&lt;/initial-capacity&gt;
        &lt;max-capacity&gt;5&lt;/max-capacity&gt;
        &lt;capacity-increment&gt;1&lt;/capacity-increment&gt;
        &lt;shrink-frequency-seconds&gt;900&lt;/shrink-frequency-seconds&gt;
        &lt;test-connections-on-reserve&gt;true&lt;/test-connections-on-reserve&gt;
        &lt;test-table-name&gt;SQL SELECT 1 FROM DUAL&lt;/test-table-name&gt;
    &lt;/jdbc-connection-pool-params&gt;
    &lt;jdbc-data-source-params&gt;
        &lt;jndi-name&gt;MyDataSource&lt;/jndi-name&gt;
        &lt;scope&gt;Global&lt;/scope&gt;
    &lt;/jdbc-data-source-params&gt;
&lt;/jdbc-data-source&gt;
</pre><p>On retrouve l&#8217;ensemble des informations que l&#8217;on pourrait renseigner dans la console d&#8217;administration de WebLogic.</p><p>Si on ajoute ce fichier à l&#8217;archive MyWebApplicationEAR.ear, le déploiement de cet EAR va engendrer la création d&#8217;une nouvelle source de données déployée dans l&#8217;arbre JNDI sous le nom &#8216;MyDataSource&#8217;. Elle sera accessible à toutes les applications déployées dans le serveur (scope=Global).</p><div
align="center"> <img
src='http://blog.xebia.fr/wp-content/uploads/2008/03/screen2.png' alt='Global Mode' /></div><p>Si on se connecte à la console d&#8217;administration, on peut apercevoir quelques différences.<br
/> Le point marquant est que la source de données n&#8217;est pas présente dans l&#8217;arborescence Services &#8211;> JDBC &#8211;> DataSources, comme d&#8217;habitude. Elle n&#8217;est visible que si on sélectionne le &#8216;JDBC Module&#8217;. (Deployments &#8211;> MyWebApplicationEAR &#8211;> MyWebApplicationDS). A partir de là, on accède au paramétrage et aux données de monitoring de la source de données.</p><p>Ce screencast montre les différents éléments déployés dans la console d&#8217;adminstration de Weblogic.</p><div
align="center"> <img
src="http://blog.xebia.fr/wp-content/plugins/flash-video-player/default_video_player.gif" /></div><p>Dans l&#8217;exemple précédent, la source de données est globale à l&#8217;ensemble du serveur d&#8217;application. Il est possible de restreindre la visibilité de cette source de données, seulement à l&#8217;application. Les changements à effectuer sont:</p><ul><li>dans le fichier web.xml (spécifications J2EE)<pre class="brush: xml; title: ; notranslate">
&lt;resource-ref&gt;
    &lt;res-ref-name&gt;MyDataSource&lt;/res-ref-name&gt;
    &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;
    &lt;res-auth&gt;Container&lt;/res-auth&gt;
&lt;/resource-ref&gt;
</pre></li><li>dans le fichier META-INF/ds-jdbc.xml<pre class="brush: xml; title: ; notranslate">
&lt;jdbc-data-source&gt;
  .....
  &lt;jdbc-data-source-params&gt;
        &lt;jndi-name&gt;MyDataSource&lt;/jndi-name&gt;
        &lt;scope&gt;Application&lt;/scope&gt;
    &lt;/jdbc-data-source-params&gt;
&lt;/jdbc-data-source&gt;
</pre></li></ul><p><br/></p><div
align="center"> <img
src='http://blog.xebia.fr/wp-content/uploads/2008/03/screen3.png' alt='Application Mode' /></div><p><strong>Et la sécurité ?</strong><br
/> La première remarque est généralement: &laquo;&nbsp;Le mot de passe est en clair dans le fichier XML !&nbsp;&raquo;. C&#8217;est exact ! Si l&#8217;objectif de ce packaging est de pouvoir installer rapidement un environnement de développement ou une plateforme de démonstration, ce n&#8217;est pas gênant. Sinon, il est toujours possible de crypter le mot de passe dans le fichier XML avec le commande weblogic.security.Encrypt. Attention ! le cryptage du mot de passe dépend du domaine sur lequel l&#8217;application va être déployée (le domaine est d&#8217;ailleurs précisé par la propriété -Dweblogic.RootDirectory).</p><pre class="brush: plain; title: ; notranslate">
java -classpath ${WLS_HOME}/server/lib/weblogic.jar -Dweblogic.RootDirectory=./mywlsdomain weblogic.security.Encrypt weblogic
{3DES}QdEw5GGOy4GM/8QwBmTEbg==
</pre><p>Il ne reste qu&#8217;à copier ce mot de passe crypté dans la balise password-encrypted.</p><pre class="brush: xml; title: ; notranslate">
&lt;password-encrypted&gt;{3DES}QdEw5GGOy4GM/8QwBmTEbg==&lt;/password-encrypted&gt;
</pre><p>Référence: http://e-docs.bea.com/wls/docs90/admin_ref/utils.html#encrypt</p><p><strong>Et en cas de mauvais paramétrage ?</strong><br
/> Modifions l&#8217;url de la source de données (ex changement de port 1521 &#8211;> 1525) et déployons l&#8217;archive. Echec du déploiement! Le serveur conserve l&#8217;environnement cohérent et refuse d&#8217;effectuer le déploiement.</p><pre class="brush: plain; title: ; notranslate">
&lt;26 févr. 2008 12 h 11 CET&gt; &lt;Warning&gt; &lt;Deployer&gt; &lt;BEA-149004&gt; &lt;Failures were detected while initiating distribute task for application 'MyWebApplicationEAR'.&gt;
&lt;26 févr. 2008 12 h 11 CET&gt; &lt;Warning&gt; &lt;Deployer&gt; &lt;BEA-149078&gt; &lt;Stack trace for message 149004
weblogic.application.ModuleException:
at weblogic.jdbc.module.JDBCModule.prepare(JDBCModule.java:289)
at weblogic.application.internal.flow.ModuleListenerInvoker.prepare(ModuleListenerInvoker.java:93)
at weblogic.application.internal.flow.DeploymentCallbackFlow$1.next(DeploymentCallbackFlow.java:360)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:26)
at weblogic.application.internal.flow.DeploymentCallbackFlow.prepare(DeploymentCallbackFlow.java:56)
Truncated. see log file for complete stacktrace
weblogic.common.ResourceException: weblogic.common.ResourceException: Could not create pool connection.
The DBMS driver exception was: Exception d'E/S: The Network Adapter could not establish the connection
at weblogic.jdbc.common.internal.ConnectionEnvFactory.createResource(ConnectionEnvFactory.java:236)
at weblogic.common.resourcepool.ResourcePoolImpl.makeResources(ResourcePoolImpl.java:1073)
at weblogic.common.resourcepool.ResourcePoolImpl.makeResources(ResourcePoolImpl.java:995)
at weblogic.common.resourcepool.ResourcePoolImpl.start(ResourcePoolImpl.java:214)
at weblogic.jdbc.common.internal.ConnectionPool.doStart(ConnectionPool.java:1042)
Truncated. see log file for complete stacktrace
&gt;
</pre><p>Si on observe le cycle de vie d&#8217;une application, du développement à la mise en production, on s&#8217;aperçoit que le mécanisme exposé est intéressant mais pas suffisant. En effet, il existe de grandes différences d&#8217;infrastructure et de contraintes entre les environnements typé &#8216;Développement&#8217; et les environnements typés &#8216;Production&#8217;: Charge nominale supportée, Haute disponibilité, Typologie réseau (DMZ, Intranet&#8230;),&#8230; Ces différences impliquent un paramétrage différent du serveur d&#8217;application. Dans un prochain article, nous verrons comment utiliser les plans de déploiement pour configurer l&#8217;application et l&#8217;adapter facilement à ces différents environnements.</p><p>Documentation Officielle BEA <a
href="http://e-docs.bea.com/wls/docs90/jdbc_admin/packagedjdbc.html">http://e-docs.bea.com/wls/docs90/jdbc_admin/packagedjdbc.html</a></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2008/03/11/packagez-vos-sources-de-donnees-avec-weblogic/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Revue de Presse Xebia</title><link>http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/</link> <comments>http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/#comments</comments> <pubDate>Mon, 12 Nov 2007 15:22:31 +0000</pubDate> <dc:creator>Xebia France</dc:creator> <category><![CDATA[Revue de presse]]></category> <category><![CDATA[BEA]]></category> <category><![CDATA[IBM]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[Seam]]></category> <category><![CDATA[Weblogic]]></category> <category><![CDATA[Websphere]]></category> <category><![CDATA[Wicket]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/</guid> <description><![CDATA[La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia. Actualité éditeurs / SSII Weblogic Server 10.3 Le coin de la technique Release de Seam 2.0 Un vent de Websphere 7 chez IBM Apache Wicket 1.3.0-rc1 is released! Actualité éditeurs / SSII Weblogic Server 10.3 Cette nouvelle mouture du serveur d&#8217;application de BEA reste [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://blog.xebia.fr/wp-content/uploads/2007/06/revuedepresse.png" alt="Revue de Presse Xebia" style="margin: 1em 1em 1em 1em; float: right;" /><br
/> <em>La revue de presse de l&#8217;actualité Java/J2EE hebdomadaire proposée par Xebia.</em></p><p><strong>Actualité éditeurs / SSII</strong></p><ul><li><a
href="http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/#WeblogicServer10">Weblogic Server 10.3</a></li></ul><p><strong>Le coin de la technique</strong></p><ul><li><a
href="http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/#Seam">Release de Seam 2.0</a></li><li><a
href="http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/#Websphere">Un vent de Websphere 7 chez IBM</a></li><li><a
href="http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/#ApacheWicket">Apache Wicket 1.3.0-rc1 is released!</a></li></ul><hr
/><h3>Actualité éditeurs / SSII</h3><h4><a
name="WeblogicServer10"></a>Weblogic Server 10.3</h4><p>Cette nouvelle mouture du serveur d&#8217;application de BEA reste conforme aux spécifications J2EE 5 tout en ajoutant le support de Java SE 6. Donc peu de nouveautés technico-fonctionnelles, l&#8217;accent a été mis sur les performances. Cette version vient de sortir en mode &#8216;<a
href="http://commerce.bea.com/showproduct.jsp?family=WLS&amp;major=10.3Tech&amp;minor=-1">Tech Preview</a>&#8216;. La version 10.3 deviendrat-elle une version aussi performante et stable qu&#8217;est (ou fût) la version 8.1SP5+ ?</p><h3>Le coin de la technique</h3><h4><a
name="Seam"></a>Release de <a
href="http://sourceforge.net/project/showfiles.php?group_id=22866&amp;package_id=163777&amp;release_id=551158">Seam 2.0</a></h4><p>Pour rappel, Seam permet de mettre en des applications par le biais des technologies JSF, EJB 3, AJAX, BPM&#8230; Sa nouvelle version arrive avec ses lots <a
href="http://in.relation.to/Bloggers/WhatsNewInSeam2">de corrections et d&#8217;améliorations</a> parmi lesquelles :</p><ul><li>possibilité d&#8217;écrire des composants Seam en Groovy</li><li>intégration de GWT pour le rendering de page ou bien encore inclure des composants GWT dans une page JSF</li><li>les composants Seam peuvent faire l&#8217;office de Web Service</li><li>intégration de Hibernate Search</li><li>syntaxe des EL améliorée</li></ul><h4><a
name="Websphere"></a>Un vent de Websphere 7 chez IBM</h4><p>IBM nous prépare à Websphere 7, ses EJB3, sa persistance JPA et ses web services JAX-WS 2.0  en publiant le redbook <a
href="http://www.redbooks.ibm.com/abstracts/sg247497.html">Designing and Coding Applications for Performance and Scalability in WebSphere Application Server</a> et en annonçant <a
href="https://www14.software.ibm.com/iwm/web/cc/earlyprograms/rational/RAD75OpenBeta/index.shtml">Rational Application Developer 7.5 Open Beta</a>.</p><p>RAD 7.5, dont la beta sera disponible mi-décembre, apporte le support de support de Java EE 5 (EJB 3, JPA, JAX-WS, etc). La sortie de cette version, en avance sur Websphere 7, rassurera les clients RAD qui avaient été déçus par le décalage de plusieurs mois entre la sortie de WAS 6.1 et celle de RAD 7 (la v7 de RAD apportait le support de Java 5 et le WAS 6.1 runtime environment).</p><p><em>Designing and Coding Applications for Performance and Scalability in WebSphere Application Server</em> est un RedBook de transition de l&#8217;ère des EJB 2.1 vers les nouveaux EJB 3.0 qui seront supportés par le futur Websphere 7 :</p><p>On y retrouve hélas quelques exemples légèrement <em>défraîchis</em> qui font penser à des copier/coller des redbooks précédents :</p><ul><li>Le chapitre sur l&#8217;utilisation des mécanismes de synchronisation (p99) mériteraient d&#8217;être réécrit en s&#8217;inspirant du très intéressant Google Tech Talk <a
href="http://video.google.com/videoplay?docid=8394326369005388010&amp;hl=en">Advanced Topics in Programming Languages: The Java Memory Model</a> de Jeremy Manson qui nous expliquent comment les blocs <tt>synchronized</tt> devraient être remplacé par les verrous introduis avec la librairie <tt>java.util.concurrent.locks</tt></li><li>Les exemples qui utilisent <tt>Vector</tt> et <tt>Hashtable</tt> pourraient avantageusement être mis à jour pour parler de <tt>List</tt>/<tt>ArrayList</tt> et de <tt>Map</tt>/<tt>HashMap</tt></li><li>Le paragraphe sur Struts et ses <tt>ActionForm</tt> pourrait être remplacé par son équivalent avec Struts2 ou être supprimé si IBM ne souhaite pas mettre en avant Struts2.</li></ul><p>A côté de ces anachronismes mineurs, IBM nous livre les grands axes de la stratégie Websphere :</p><ul><li>SCA/SDO sont toujours des technologies clefs. Ce redbook nous explique avec clarté et raison leur rôle et leur position par rapport à EJB3/JPA : <em>If you are developing a traditional (non SOA) application and only have relational data and are only developing in Java, then EJB 3.0 is a good choice. (p 449)</em>.</li><li>Java Connector Architecture (JCA) est désormais la technologie standard et unifiée pour accéder aux Enterprise Information Systems (EIS) comme CICS et IMS dont les connecteurs Java propriétaires ont été remplacés par des Resources Adapter JCA [1]. Le support de l&#8217;API JCA permet une intégration élégante à SpringFramework [2].</li><li>EJB3, JPA et JAX-WS sont les successeurs respectifs d&#8217;EJB 2.1, d&#8217;EJB CMP et de JAX-RPC ; ils sont disponibles avec WAS 6.1 sous forme de <em>feature pack</em> additionnels [3] ; Websphere 7 les embarquera en standard. Ce redbook sera une bonne introduction pour ceux qui n&#8217;ont pas encore eu le temps de découvrir ces nouvelles technologies.</li></ul><p>Pour conclure, RAD 7.5 et ce redbook sont principalement des <em>previews</em> des technologies JavaEE 5 (EJB3, JPA, JAX-WS, etc) que nous attendons avec impatience et qui seront disponible avec Websphere 7.</p><p>D&#8217;ici à y voir les prémices d&#8217;une grande opération de <em>teasing</em> pour préparer l&#8217;imminente arrivée de Websphere 7 &#8230; <img
class="emoticon" src="/confluence/images/icons/emoticons/wink.gif" alt="" align="absmiddle" border="0" height="20" width="20"></p><p>[1] Voir <a
href="http://www-306.ibm.com/software/data/ims/ims/components/tm-resource-adapter.html">IMS TM Resource Adapter</a> et <a
href="http://www-306.ibm.com/software/htp/cics/ctg/">CICS Transaction Gateway</a>.<br
/> [2] Voir <a
href="http://www.javaworld.com/javaworld/jw-08-2005/jw-0822-cics.html">Access CICS applications with Spring</a> par Thierry Templier pour JavaWorld.<br
/> [3] Voir <a
href="https://www14.software.ibm.com/iwm/web/cc/earlyprograms/websphere/was61ejb3/">WebSphere® Application Server Version 6.1 Feature Pack for EJB 3.0</a> et <a
href="http://www-1.ibm.com/support/docview.wss?rs=180&amp;uid=swg21264563">Feature Pack for Web Services for WebSphere Application Server V6.1</a></p><h4><a
name="ApacheWicket"></a><a
href="http://wicket.apache.org/wicket-130-rc1.html">Apache Wicket 1.3.0-rc1</a> is released!</h4><p> Le projet Wicket avance et entre en release candidates. Cela signifie que seulement des corrections de bugs seront faites jusque la sortie finale de la version 1.3.<br
/> Au programme de cette release :</p><ul><li>un <a
href="http://cwiki.apache.org/WICKET/migrate-13.html">guide de migration</a> à partir de la version 1.2 : l&#8217;API a évolué/changé et donc pas mal de changements sont à prévoir.</li><li>beaucoup de bugs ont été corrigés, et les évolutions sont nombreuses. <a
href="http://wicket.apache.org/wicket-130-rc1.html#wicket-1.3.0-rc1-Reportingbugs">Voici la liste</a>.</li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/11/12/revue-de-presse-xebia-31/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>JConsole et WebLogic 9</title><link>http://blog.xebia.fr/2007/06/28/jconsole-et-weblogic-9/</link> <comments>http://blog.xebia.fr/2007/06/28/jconsole-et-weblogic-9/#comments</comments> <pubDate>Thu, 28 Jun 2007 13:57:49 +0000</pubDate> <dc:creator>Benoit Moussaud</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[jconsole]]></category> <category><![CDATA[JMX]]></category> <category><![CDATA[t3]]></category> <category><![CDATA[Weblogic]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/06/28/jconsole-et-weblogic-9/</guid> <description><![CDATA[JConsole est un outil disponible à partir du JDK 5.0 qui repose sur l&#8217;API JMX pour afficher et suivre les métriques d&#8217;une machine virtuelle Java. Les différentes catégories sont : L&#8217;état de la mémoire et des garbages collections. Les threads, liste et activité, comme sur un Thread Dump. Les chargement des classes . Les suivi [...]]]></description> <content:encoded><![CDATA[<p>JConsole est un outil disponible à partir du JDK 5.0 qui repose sur l&#8217;API <span ><a
href="http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement" >JMX</a></span> pour afficher et suivre les métriques d&#8217;une machine virtuelle Java.<br
/> Les différentes catégories sont :</p><ul><li>L&#8217;état de la <span ><a
href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html#memory" >mémoire</a></span> et des garbages collections.</li><li>Les <span ><a
href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html#thread" >threads</a></span>, liste et activité, comme sur un Thread Dump.</li><li>Les chargement des <span ><a
href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html#class_loading" >classes </a></span>.</li><li>Les <span ><a
href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html#MBeans" >suivi</a></span> et la gestion des MBeans.</li><li>Des informations générales sur la JVM (ClassPath, Library Path, Argument de la JVM, &#8230;).</li></ul><p>Il existe deux façons de connecter une JConsole sur une machine virtuelle Java 5 :</p><h3><a
name="JConsoleetWebLogic9-Enlocal"></a>En local</h3><p>Le mode local nécessite que la JConsole et la machine virtuelle soient sur la même machine. Il suffit alors d&#8217;ajouter au démarrage de la machine virtuelle la propriété : <code>-Dcom.sun.management.jmxremote.</code><br
/> Note : A partir du JDK 6, cette propriété est positionnée par défaut, donc toutes les JVM pourront être monitorées &#8216;Out Of the Box&#8217;.</p><p>L&#8217;exécutable de la JConsole est situé dans &lt;JAVA_HOME&gt;/bin. Au démarrage, la JConsole affiche l&#8217;ensemble des JVM accessibles.</p><h3><a
name="JConsoleetWebLogic9-Adistance"></a>A distance</h3><p>JMX définit le protocole RMI comme protocole d&#8217;échange. Par défaut, on considère qu&#8217;il existe deux implémentations de RMI :</p><ul><li>JRMP (Java Remote Method Protocol)</li><li>IIOP (Internet Inter-Orb Protocol)</li></ul><p>Le serveur d&#8217;applications BEA Weblogic propose une implémentation supplémentaire (et plus performante), le <span ><a
href="http://edocs.bea.com/wls/docs92/rmi/rmi_t3.html" >protocole T3</a></span>.</p><p>La suite de ce billet détaille la configuration à mettre en place pour chacun des trois protocoles, et les avantages et inconvénients de chacun.</p><h4><a
name="JConsoleetWebLogic9-JRMP"></a>JRMP</h4><p>Pour accéder à une JVM par JRMP, il faut ajouter les propriétés suivantes :</p><p>[CODE]<br
/> -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345<br
/> -Dcom.sun.management.jmxremote.ssl=false<br
/> -Dcom.sun.management.jmxremote.authenticate=false<br
/> [/CODE]</p><p>Note : Les paramètres com.sun.management.jmxremote.ssl=false et com.sun.management.jmxremote.authenticate=false introduisent une large faille de sécurité sur la JVM (ni authentification, ni cryptage des données échangées). La mise en place d&#8217;une authentification est possible en définissant une liste d&#8217;utilisateurs dans le fichier &lt;Java_Home&gt;/jre/lib/management/jmxremote.password. Tout est détailé sur &#8216;Luis-Miguel Alventosa&#8217;s Blog&#8217; : <a
href="http://blogs.sun.com/lmalventosa/entry/jmx_authentication_authorization">Authentication and Authorization in JMX RMI connectors</a>. Le cryptage par SSL est possible mais très lourd à mettre en place (génération de certificats)</p><p>Avec la JConsole, il existe alors deux moyens de se connecter :</p><ul><li>Soit par l&#8217;onglet &#8216;Remote&#8217; en précisant le nom ou l&#8217;adresse IP de la machine et le port spécifié par la propriété com.sun.management.jmxremote.port.</li><li>Soit par l&#8217;onglet &#8216;Advanced&#8217; en spécifiant l&#8217;URL suivante : service:jmx:rmi:///jndi/rmi://192.168.199.131:7001:12345/jmxrmi. La construction de l&#8217;URL est en partie expliquée dans la javadoc de la classe <span ><a
href="http://java.sun.com/j2se/1.5.0/docs/api/javax/management/remote/JMXServiceURL.html" >JMXServiceURL</a></span>. Les champs User Name et Password restent vides.</li></ul><p><b>Avantages</b> : Simplicité de mise en œuvre et de connexion (Onglet &#8216;Remote&#8217;).<br
/> <b>Inconvénient</b> : Sécurité.</p><h4><a
name="JConsoleetWebLogic9-IIOP"></a>IIOP</h4><p>Java RMI Over IIOP permet de s&#8217;interfacer avec les ORB, spécifiés par CORBA (Common Object Request Broker Architecture). Les serveurs d&#8217;applications certifiés J2EE se doivent de supporter le protocole IIOP (RMI/IIOP). Pour connecter une JConsole sur un serveur d&#8217;applications WebLogic 9.x avec le protocole IIOP, il est nécessaire d&#8217;activer ce protocole et de déclarer un utilisateur afin de s&#8217;authentifier. La procédure est décrite <span ><a
href="http://e-docs.bea.com/wls/docs90/ConsoleHelp/taskhelp/channels/EnableAndConfigureIIOP.html" >ici</a></span>. La JVM nécessite d&#8217;être démarrée avec l&#8217;option :</p><p><code>-Dcom.sun.management.jmxremote</code></p><p>Dans la JConsole, il est faut utiliser l&#8217;onglet &#8216;Advanced&#8217; et indiquer l&#8217;url suivante :<br
/> <code>service:jmx:rmi:///jndi/iiop://192.168.199.131:7001/weblogic.management.mbeanservers.runtime</code></p><p><b>Avantage</b> : -<br
/> <b>Inconvénients</b> : Compliqué à paramétrer, complexité liée au protocole IIOP.</p><h4><a
name="JConsoleetWebLogic9-T3"></a>T3</h4><p>J2EE 1.0 n&#8217;imposait pas le support d&#8217;IIOP. BEA a alors mis au point T3, un protocole propriétaire plus performant. Depuis, le protocole T3 est le protocole par défaut pour accéder aux différents objets distants hébergés sur un serveur d&#8217;applications WebLogic. Puisque T3 implémente RMI, il est possible de brancher la JConsole à une JVM avec T3.</p><p>Tout d&#8217;abord il faut :</p><ul><li>Ajouter le jar weblogic.jar au lancement de la JConsole.</li><li>Indiquer les <span ><a
href="http://java.sun.com/j2se/1.5.0/docs/api/javax/management/remote/JMXConnectorFactory.html">&#8216;ClientProviders&#8217;</a></span> fournis par BEA (propriété jmx.remote.protocol.provider.pkgs).</li></ul><p>[CODE]<br
/> set JAVA_HOME=D:\bea\alsb21\jdk150_04<br
/> %JAVA_HOME%\bin\jconsole.exe<br
/> -J-Djmx.remote.protocol.provider.pkgs=weblogic.management.remote -J-Djava.class.path=%JAVA_HOME%\lib\jconsole.jar;D:\bea\alsb21\weblogic91\server\lib\weblogic.jar;%JAVA_HOME%\lib\tools.jar</pre><p>[/CODE]</p><p>Pour se connecter, il faut utiliser le mode 'advanced' et indiquer :</p><ul><li>JMXURL : <code>service:jmx:t3://192.168.199.131:7001/jndi/weblogic.management.mbeanservers.runtime</code></li><li>UserName : weblogic</li><li>Password : ********</li></ul><p>Il faut que l'utilisateur possède les droits d'administration.</p><p> <a
href='http://blog.xebia.fr/wp-content/uploads/2007/06/jmx-connection-failed.jpg' title='JMX Connection Failed'><img
src='http://blog.xebia.fr/wp-content/uploads/2007/06/jmx-connection-failed.miniature.jpg' alt='JMX Connection Failed' /></a></p><p>Après activation des logs et analyse j'ai remarqué que les <em>credentials</em> (UserName et Password) n'étaient pas transférés au moment du lookup de l'objet MBeanServer. Pour y remédier, il suffit d'écrire un nouveau 'ClientProvider' du protocole T3 qui va effectuer cette manipulation : transfert de la propriété 'jmx.remote.credentials' vers 'java.naming.security.principal' et 'java.naming.security.credentials'.</p><p>[JAVA]<br
/> package fr.xebia.jmx.remote.t3;</p><p>import java.io.IOException;<br
/> import java.util.HashMap;<br
/> import java.util.Map;</p><p>import javax.management.remote.JMXConnector;<br
/> import javax.management.remote.JMXServiceURL;</p><p>public class ClientProvider extends<br
/> weblogic.management.remote.t3.ClientProvider {</p><p> public JMXConnector newJMXConnector(JMXServiceURL jmxserviceurl, Map map)<br
/> throws IOException {<br
/> Map newMap = checkCredentials(map);<br
/> return super.newJMXConnector(jmxserviceurl, newMap);<br
/> }</p><p> @SuppressWarnings("unchecked")<br
/> private Map checkCredentials(Map map) {<br
/> if (!map.containsKey("java.naming.security.principal")<br
/> &#038;&#038; !map.containsKey("java.naming.security.credentials")) {<br
/> if (map.containsKey("jmx.remote.credentials")) {<br
/> Map newMap = new HashMap();<br
/> newMap.putAll(map);<br
/> String[] cred = (String[]) map.get("jmx.remote.credentials");<br
/> newMap.put("java.naming.security.principal", cred[0]);<br
/> newMap.put("java.naming.security.credentials", cred[1]);<br
/> return newMap;<br
/> }<br
/> }<br
/> return map;<br
/> }<br
/> }</p><p>[/JAVA]</p><p>Il faut ensuite ajuster la ligne de commande (ajout de la classe fr.xebia.jmx.remote.t3.ClientProvider au classpath et modification de la propriété jmx.remote.protocol.provider.pkgs).</p><p>[CODE]<br
/> set JAVA_HOME=D:\bea\alsb21\jdk150_04<br
/> %JAVA_HOME%\bin\jconsole.exe<br
/> -J-Djmx.remote.protocol.provider.pkgs=fr.xebia.jmx<br
/> -J-Djava.class.path=t3jconsole.jar,%JAVA_HOME%\lib\jconsole.jar;D:\bea\alsb21\weblogic91\server\lib\weblogic.jar;%JAVA_HOME%\lib\tools.jar<br
/> [/CODE]</p><p>Avec les mêmes informations rentrées dans l'onglet 'Advanced', vous serez maintenant connecté à votre serveur d'applications WebLogic 9 avec la JConsole en utilisant le protocole T3.</p><p><b>Avantage</b> : Pas de paramétrage supplémentaire (l'activation du protocole IIOP et la déclaration du user IIOP nécessitent un redémarrage du serveur).<br
/> <b>Inconvénient</b> : Il est impossible de brancher la JConsole avant que le serveur soit 'Running', donc pas de suivi du démarrage du serveur.</p><h3><a
name="JConsoleetWebLogic9-Conclusion"></a>Conclusion</h3><p>La JConsole permet rapidement de voir le comportement mémoire, le CPU et les traitements d'un serveur d'applications. Désormais, pensez à ajouter le '-Dcom.sun.management.jmxremote' sur l'ensemble de vos JVM 5.0 afin de permettre un diagnostic rapide en cas de problème.</p><h3><a
name="JConsoleetWebLogic9-Références"></a>Références</h3><ul><li><span ><a
href="http://www.labo-sun.com/resource-fr-articles-1180-1-java-reseau-jmx-et-jconsole.htm" >JMX et JConsole</a></span> au labo Sun de Sup Info.</li><li><span ><a
href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html" >Using jconsole</a></span> sur le site de Sun.</li><li><span ><a
href='http://blog.xebia.fr/wp-content/uploads/2007/06/t3jconsole.zip' title='Fichier T3Console.Jar (.java et .class)'>Fichier T3Console.Jar (.java et .class)</a></span></li></ul> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/06/28/jconsole-et-weblogic-9/feed/</wfw:commentRss> <slash:comments>9</slash:comments> </item> <item><title>WebLogic Scripting Tools</title><link>http://blog.xebia.fr/2007/05/09/weblogic-scripting-tools/</link> <comments>http://blog.xebia.fr/2007/05/09/weblogic-scripting-tools/#comments</comments> <pubDate>Wed, 09 May 2007 12:33:05 +0000</pubDate> <dc:creator>Benoit Moussaud</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[JMX]]></category> <category><![CDATA[MBean]]></category> <category><![CDATA[Weblogic]]></category> <category><![CDATA[WLST]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/05/09/weblogic-scripting-tools/</guid> <description><![CDATA[Dans un post précédent, j&#8217;ai expliqué comment exposer un MBean avec Spring dans WebLogic Server 8.1. Je vais vous montrer comment interagir avec ce MBean avec WLST. WebLogic Scripting Tool (WLST) est un outil en ligne de commande qui permet de surveiller et gérer des instances WebLogic Server. Cet outil de scripting est basé sur [...]]]></description> <content:encoded><![CDATA[<p>Dans un post <a
href="http://blog.xebia.fr/2007/02/21/exposer-un-mbean-avec-spring-dans-weblogic-server-81/">précédent</a>, j&#8217;ai expliqué comment exposer un MBean avec Spring dans WebLogic Server 8.1. Je vais vous montrer comment interagir avec ce MBean avec WLST.</p><p>WebLogic Scripting Tool (WLST) est un outil en ligne de commande qui permet de surveiller et gérer des instances WebLogic Server. Cet outil de scripting est basé sur le langage Jython[1], une implémentation du langage Python 100% Java. A l&#8217;origine, cet outil a été développé pour WebLogic 8.1.x. Il est disponible en version 5.4 [2] sur le site CodeShare, le repository des projets open source liés au monde des serveurs WebLogic. A partir de la version 9.0 de WebLogic Server, WLST a été intégré à la distribution et est complètement supporté par BEA.</p><p>Avec WLST il est possible :</p><ul><li>De parcourir la configuration d&#8217;un domaine et ses paramètres runtime.</li><li>D&#8217;éditer la configuration d&#8217;un domaine et de sauvegarder ces modifications.</li><li>D&#8217;accéder à l&#8217;ensemble des MBean du serveur (MBean WebLogic, MBean WebLogic Integration, Mbean WebLogic Portal, MBean défini par les utilisateurs).</li><li>D&#8217;automatiser les procédures de déploiement d&#8217;application et de configuration.</li></ul><p>Procédure d&#8217;installation de WLST pour WebLogic 8.1 :</p><ol><li>Télécharger wlst_v64.zip</li><li>Extraire l&#8217;archive dans un répertoire (ex c:\wlst)</li><li>Créer un script de lancement (ex c:\wlst\wlst.cmd)</li><p><code>title WLST<br
/> set WL_HOME=D:\bea\bea815\weblogic81<br
/> Set JAVA_HOME=D:\bea\bea815\jdk142_08<br
/> set WLST_HOME=c:\wlst<br
/> set CLASSPATH=%WLST_HOME%\wlst.jar;%WLST_HOME%\jython.jar;%WL_HOME%\server\lib\weblogic.jar<br
/> %JAVA_HOME%\bin\java  weblogic.WLST %*<br
/> </code></p><li>Lancer le script wlst.cmd</li></ol><p>Note : pour les utilisateurs d&#8217;un serveur WebLogic 9.x, le script de lancement se trouve dans le répertoire %WL_HOME%\common\bin\wlst.cmd</p><p>Au lancement vous devez obtenir :<br
/> <code>Initializing WebLogic Scripting Tool (WLST) ...<br
/> Welcome to WebLogic Server Administration Scripting Shell<br
/> Type help() for help on available commands<br
/> wls:/(offline)&gt;</code></p><p>La première étape est de se connecter à un serveur. Cette action s&#8217;effectue avec la commande connect(login, password, url). Si votre domaine comporte un serveur d&#8217;admin et des serveurs managés, il est préférable de se connecter au serveur d&#8217;administration qui vous donnera l&#8217;accès à l&#8217;ensemble des serveurs du domaine.<br
/> <code>wls:/(offline)&gt; connect('weblogic','weblogic','t3://localhost:7001')<br
/> Connecting to weblogic server instance running at t3://localhost:7001 as username weblogic ...<br
/> Successfully connected to Admin Server 'myserver' that belongs to domain 'wlsdomain'.<br
/> wls:/wlsdomain/config&gt;</code></p><p>A partir de là, vous pouvez parcourir l&#8217;ensemble du domaine avec les commandes ls() et cd().<br
/> <code>wls:/wlsdomain/config&gt; ls();<br
/> drw-   ApplicationManager<br
/> drw-   Applications<br
/> drw-   BasicRealms<br
/> drw-   BridgeDestination<br
/> drw-   BridgeDestinationCommon<br
/> drw-   CachingRealms<br
/> drw-   Clusters<br
/> drw-   ConversationService<br
/> drw-   CustomRealm<br
/> …..<br
/> -rw-   AdministrationMBeanAuditingEnabled false<br
/> -rw-   AdministrationPort                         9002<br
/> -rw-   AdministrationPortEnabled               false<br
/> -rw-   ArchiveConfigurationCount	      5<br
/> -r--   CachingDisabled                            true<br
/> ...<br
/> </code>La commande affiche les différents paramètres avec leur mode d&#8217;accès (r:read, w:write, d: répertoire). Le contenu d&#8217;un élément de type d peut etre accédé avec la commande cd()<br
/> <code>wls:/wlsdomain/config&gt; cd ('Servers')<br
/> wls:/wlsdomain/config/Servers&gt; ls()<br
/> drw-   myserver<br
/> wls:/wlsdomain/config/Servers&gt; cd('ExecuteQueues/weblogic.kernel.Default')<br
/> wls:/wlsdomain/config/Servers/myserver/ExecuteQueues/weblogic.kernel.Default&gt;</code></p><p>L&#8217;appel à la commande ls() affiche l&#8217;ensemble des paramètres liés à la queue d&#8217;exécution &#8216;weblogic.kernel.Default&#8217;.</p><p>Les commandes get() et set() permettent de manipuler les paramètres des Mbean. En effet, les fonctions offertes par les différentes consoles d&#8217;administration de WebLogic Platform ne sont en réalité que des appels à des Mbeans fournis par le serveur WebLogic. Tout ce vous pouvez faire avec la console, vous pouvez le faire avec WLST.</p><p>Exemple de modification de la valeur &#8216;ThreadCount&#8217;.<br
/> <code>wls:/wlsdomain/config/Servers/myserver/ExecuteQueues/weblogic.kernel.Default&gt; get('ThreadCount')<br
/> 15<br
/> wls:/wlsdomain/config/Servers/myserver/ExecuteQueues/weblogic.kernel.Default&gt; set('ThreadCount','20')<br
/> wls:/wlsdomain/config/Servers/myserver/ExecuteQueues/weblogic.kernel.Default&gt; get('ThreadCount')<br
/> 20</code></p><p>L&#8217;une des grandes forces de WLST est sa capacité à exécuter des scripts afin de rendre automatisable l&#8217;ensemble des opérations d&#8217;administration.<br
/> Dans le répertoire d&#8217;installation de WLST, créer un fichier texte : ex1.py</p><pre class="brush: python; title: ; notranslate">
connect('weblogic','weblogic','t3://localhost:7001')
cd ('/Servers/myserver/ExecuteQueues/weblogic.kernel.Default')
print &quot;Afficher le nombre de thread:&quot;+str(get('ThreadCount'))
set('ThreadCount','25')
disconnect()
</pre><p>Lancez une autre instance de l&#8217;interpréteur WLST et exécuter le script ex1.py<br
/> <code>wls:/(offline)&gt; execfile('ex1.py')<br
/> Connecting to weblogic server instance running at t3://localhost:7001 as username weblogic ...<br
/> Successfully connected to Admin Server 'myserver' that belongs to domain 'wlsdomain'.<br
/> Afficher le nombre de thread:20<br
/> Disconnected from weblogic server: myserver<br
/> wls:/(offline)&gt;</code><br
/> Si vous retournez sur le précédent interpréteur WLST et exécutez la commande get(&#8216;ThreadCount&#8217;), la valeur &#8217;25&#8242; devrait apparaître.</p><p>Le script suivant ex2.py exécute la même opération que ex1.py en définissant une fonction python. Attention, en python, l&#8217;indentation fait partie du langage !</p><pre class="brush: python; title: ; notranslate">
def modifierThreadCount(executequeue, valeur):
cd ('/Servers/myserver/ExecuteQueues/'+executequeue)
print &quot;Afficher le nombre de thread:&quot;+str(get('ThreadCount'))
set('ThreadCount',valeur)
connect('weblogic','weblogic','t3://localhost:7001')
modifierThreadCount('weblogic.kernel.Default',15)
disconnect()
</pre><p><code>wls:/(offline)&gt; execfile('ex2.py')</code></p><p>Revenons à notre MBean développé précédemment. WLST permet de manipuler non seulement les MBeans BEA mais également nos propres MBeans. Le script suivant recherche les MBeans à partir d&#8217;un nom (), de lire et modifier les attributs.</p><pre class="brush: python; title: ; notranslate">
def manipulation():
#recherche de tous les MBeans qui portent le nom 'testBean', quelque soit le package.
testBeans = mbs.queryMBeans(ObjectName(&quot;*:*,name=testBean&quot;), None)
#parcours de la liste de resultat
for tb in testBeans:
#affichage de l'objectName
objectName = tb.getObjectName()
print 'ObjectName : '+str(objectName)
print 'Lecture des Attributs Age et Name'
age = mbs.getAttribute(objectName,&quot;Age&quot;);
name = mbs.getAttribute(objectName,&quot;Name&quot;);
print &quot;Age=&quot;+str(age)+&quot;, Name=&quot;+name
#Modification des valeurs
print &quot;Modification de l'attribut Name&quot;
mbs.setAttribute(objectName,Attribute('Name','J2EE'));
print &quot;La nouvelle valeur de l'attribut Name est &quot;+mbs.getAttribute(objectName,&quot;Name&quot;)
connect('weblogic','weblogic','t3://localhost:7001')
manipulation()
disconnect()
</pre><p>Différentes remarques :</p><ul><li>Ce script est la transposition de la classe de test Java test.xebia.management.JMXClient3</li><li>La recherche n&#8217;est pas limitée au nom d&#8217;un Mbean, il est également possible d&#8217;effectuer des recherches par type</li><li>La variable &#8216;mbs&#8217; est une variable globale définie par WLST, elle correspond à la position courante dans la hiérarchie des MBeans. L&#8217;ensemble des variables est documenté sur cette page[4]</li></ul><p>L&#8217;exécution de ce script donne le résultat suivant :<br
/> <code>wls:/(offline)&gt; execfile('ex3.py')<br
/> Connecting to weblogic server instance running at t3://localhost:7001 as username weblogic ...<br
/> Successfully connected to Admin Server 'myserver' that belongs to domain 'wlsdomain'.<br
/> ObjectName : bean:name=testBean<br
/> Lecture des Attributs Age et Name<br
/> Age=2, Name=xebia<br
/> Modification de l'attribut Name<br
/> La nouvelle valeur de l'attribut Name est J2EE<br
/> Disconnected from weblogic server: myserver<br
/> wls:/(offline)&gt;</code></p><p>L&#8217;ajout de WLST à la plateforme WebLogic est une bonne évolution vers une réelle industrialisation des serveurs d&#8217;applications de la gamme BEA. Il existe un autre mode d&#8217;interaction proposé par WLST : WLST Offline. Il permet de créer et de paramétrer des domaines WebLogic sans être connecté. Ce mode est l&#8217;équivalent de ce que propose le domaine &#8216;Wizard&#8217;.</p><p>Source: <a
href="http://blog.xebia.fr/wp-content/uploads/2007/04/wlst.zip">scripts WLST [zip]</a></p><p><strong>Référence</strong>:</p><p>[1] http://www.jyton.org</p><p>[2] WLST 8.4 pour WLS 8.1</p><p>https://codesamples.projects.dev2dev.bea.com/servlets/Scarab?id=S13</p><p>[3] Documentation 9.x</p><p>http://e-docs.bea.com/wls/docs90/config_scripting/using_WLST.html</p><p>[4] WLST Variable Reference</p><p>http://e-docs.bea.com/wls/docs92/config_scripting/reference.html#wp1178147</p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/05/09/weblogic-scripting-tools/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Exposer un MBean avec Spring dans WebLogic Server 8.1</title><link>http://blog.xebia.fr/2007/02/21/exposer-un-mbean-avec-spring-dans-weblogic-server-81/</link> <comments>http://blog.xebia.fr/2007/02/21/exposer-un-mbean-avec-spring-dans-weblogic-server-81/#comments</comments> <pubDate>Wed, 21 Feb 2007 12:06:57 +0000</pubDate> <dc:creator>Benoit Moussaud</dc:creator> <category><![CDATA[Java / JEE]]></category> <category><![CDATA[J2EE]]></category> <category><![CDATA[JMX]]></category> <category><![CDATA[MBean]]></category> <category><![CDATA[Spring]]></category> <category><![CDATA[Weblogic]]></category> <guid
isPermaLink="false">http://blog.xebia.fr/2007/02/21/exposer-un-mbean-avec-spring-dans-weblogic-server-81/</guid> <description><![CDATA[La spécification liée aux extensions de management, plus connue sous le nom de JMX est l&#8217;un des plus ancienne du JCP. Elle porte le n°3. Cependant, elle n&#8217;a été validée qu&#8217;en Juillet 2000 et communément utilisée que très récemment. Il a fallut attendre les serveurs d&#8217;application J2EE 1.4 ou le JSE 5 pour voir cette [...]]]></description> <content:encoded><![CDATA[<p>La spécification liée aux extensions de management, plus connue sous le nom de JMX est l&#8217;un des plus ancienne du JCP. Elle porte le <a
href="http://jcp.org/en/jsr/detail?id=3">n°3</a>. Cependant, elle n&#8217;a été validée qu&#8217;en Juillet 2000 et communément utilisée que très récemment. Il a fallut attendre les serveurs d&#8217;application J2EE 1.4 ou le JSE 5 pour voir cette technologie devenir massivement diffusée en version 1.2. Auparavant chaque éditeur proposait sa propre implémentation avec des versions incompatibles entre elles.</p><p>Le serveur d&#8217;application WebLogic 8.1 utilise massivement cette technologie pour permettre de configurer et monitorer les serveurs. La console d&#8217;administration n&#8217;est qu&#8217;une interface graphique à ces MBeans (Management Bean). Cependant il peut être intéressant d&#8217;exposer des MBean supplémentaires :</p><ul><li>MBean type &#8216;Facade&#8217; : Aggregation de MBeans existants pour unifier la gestion et limiter les appels</li><li>MBean type &#8216;Composite&#8217; : Exposition de méthodes de haut niveau qui synthétisent un ensemble de MBean et de données techniques</li><li>MBean type &#8216;Applicatifs&#8217; : Interface de gestion non plus au niveau technique (serveur d&#8217;application) mais fonctionelle</li></ul><p>Voici donc les étapes à suivre et les pièges à éviter pour exposer un MBean avec le framework <a
href="http://www.springframework.org">Spring 2.0</a> dans <a
href="http://www.bea.com/framework.jsp?CNT=index.htm&amp;FP=/content/products/weblogic/server/">WebLogic 8.1</a>. L&#8217;environnement de développement est Eclipse 3.2 avec WTP.</p><ul
type="disc"><li>Créons un projet de type &#8216;Dynamic Web Project&#8217; (nom WeblogicSpringMBean) avec le target runtime &#8216;Generic BEA WebLogic Server 8.1&#8242;</li><li>Ajoutons au répertoire WEB-INF/lib, les bibliothèque spring.jar et common-logging.jar.</li><li>Implémentons notre MBean de test (très simple): fr.xebia.management.InfoMBean</li></ul><pre class="brush: java; title: ; notranslate">
package fr.xebia.management;
public class InfoMBean {
	private String name;
	private int age;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
</pre><p>Le framework Spring va nous permettre d&#8217;assembler et d&#8217;exposer ce MBean.</p><ul><li>Créons dans le répertoire WEB-INF le fichier d&#8217;assemblage Spring applicationContext.xml</li><li>Déclarons le bean associé au MBean InfoMBean</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN 2.0//EN&quot;
     &quot;http://www.springframework.org/dtd/spring-beans-2.0.dtd&quot;&gt;
&lt;beans&gt;
 &lt;bean id=&quot;infombean&quot; class=&quot;fr.xebia.management.InfoMBean&quot;&gt;
   &lt;property name=&quot;name&quot; value=&quot;xebia&quot;&gt;&lt;/property&gt;
   &lt;property name=&quot;age&quot; value=&quot;2&quot;&gt;&lt;/property&gt;
 &lt;/bean&gt;
&lt;/beans&gt; </pre><ul><li>Déclarons le server de MBeans de WebLogic</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;bean id=&quot;weblogicMBeanServer&quot;
   class=&quot;org.springframework.jmx.support.WebLogicJndiMBeanServerFactoryBean&quot;/&gt;
</pre><ul><li>Déclarons le bean qui va permettre d&#8217;exposer le bean en tant que MBean (org.springframework.jmx.export.MBeanExporter)</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;bean id=&quot;exporter&quot; class=&quot;org.springframework.jmx.export.MBeanExporter&quot;&gt;
	&lt;property name=&quot;beans&quot;&gt;
		&lt;map&gt;
			&lt;entry key=&quot;bean:name=testBean&quot; value-ref=&quot;infombean&quot; /&gt;
		&lt;/map&gt;
	&lt;/property&gt;
	&lt;property name=&quot;server&quot; ref=&quot;weblogicMBeanServer&quot; /&gt;
&lt;/bean&gt;
</pre><p>Il reste à paramétrer le fichier web.xml pour permettre de charger cette configuration au démarrage du serveur. La servlet org.springframework.web.context.ContextLoaderServlet va se charger, au démarrage, d&#8217;assembler les beans à partir du fichier applicationContext.xml et d&#8217;exposer le MBean.</p><pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE web-app PUBLIC &quot;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&quot;
&quot;http://java.sun.com/dtd/web-app_2_3.dtd&quot;&gt;
&lt;web-app id=&quot;WebApp_ID&quot;&gt;
  &lt;display-name&gt;WebLogicSpringMBean&lt;/display-name&gt;
  &lt;servlet&gt;
	&lt;servlet-name&gt;context&lt;/servlet-name&gt;
	&lt;servlet-class&gt;org.springframework.web.context.ContextLoaderServlet&lt;/servlet-class&gt;
	&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
  &lt;/servlet&gt;
&lt;/web-app&gt;
</pre><p>Si on se base sur les différentes documentations [1] c&#8217;est terminé.<br
/> Dans l&#8217;environnement Eclipse, démarrer le serveur et deployer l&#8217;application (La commande &#8216;Run On Server&#8217; se charge des deux opérations).</p><p><strong>Première Difficulté</strong> : Lors du déploiement de l&#8217;application WeblogicSpringMBean.war, le serveur répond :</p><p><code>javax.servlet.ServletException: Error creating bean with name 'weblogicMBeanServer' defined in ServletContext resource<br
/> [/WEB-INF/applicationContext.xml]: Invocation of init method failed;<br
/> nested exception is org.springframework.jmx.MBeanServerNotFoundException: Could not find WebLogic's MBeanHome object in JNDI;<br
/> nested exception is j<strong>avax.naming.NoPermissionException</strong>: <strong>User <anonymous> does not have permission on weblogic.management.home to perform lookup operation</anonymous></strong>.</code></p><p><strong>Solution</strong> :il faut exécuter la servlet avec le rôle Admin</p><ul><li>Editer le fichier web.xml pour déclarer le rôle admin</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;web-app id=&quot;WebApp_ID&quot;&gt;
	&lt;display-name&gt;WebLogicSpringMBean&lt;/display-name&gt;
	&lt;servlet&gt;
		&lt;servlet-name&gt;context&lt;/servlet-name&gt;
		&lt;servlet-class&gt;org.springframework.web.context.ContextLoaderServlet&lt;/servlet-class&gt;
		&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
		&lt;run-as&gt;
			&lt;role-name&gt;admin&lt;/role-name&gt;
		&lt;/run-as&gt;
	&lt;/servlet&gt;
	&lt;security-role&gt;
		&lt;role-name&gt;admin&lt;/role-name&gt;
	&lt;/security-role&gt;
&lt;/web-app&gt;
</pre><ul><li>Créer dans le répertoire WEB-INF un fichier weblogic.xml qui va associer le rôle admin avec le user weblogic</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;weblogic-web-app&gt;
	&lt;security-role-assignment&gt;
		&lt;role-name&gt;admin&lt;/role-name&gt;
		&lt;principal-name&gt;weblogic&lt;/principal-name&gt;
	&lt;/security-role-assignment&gt;
&lt;/weblogic-web-app&gt;
</pre><ul><li>Redéployer l&#8217;application</li></ul><p>Ecrivons un client de test pour interroger notre MBean. Pour des soucis de commodités, nous allons le coder dans le même projet que notre MBean. Le code suivant permet retrouver tous les MBean dont le nom est &#8216;testBean&#8217;.</p><pre class="brush: java; title: ; notranslate">
public static void main(String[] args) throws Exception {
	Environment env = new Environment();
	env.setProviderUrl(&quot;t3://localhost:7001&quot;);
	env.setSecurityPrincipal(&quot;weblogic&quot;);
	env.setSecurityCredentials(&quot;weblogic&quot;);
	Context ctx = env.getInitialContext();
	System.out.println(&quot;Recherche du MBeanHome&quot;);
	MBeanHome home  = (MBeanHome) ctx.lookup(MBeanHome.LOCAL_JNDI_NAME);
	RemoteMBeanServer server = home.getMBeanServer();
	System.out.println(&quot;Recherche de tous les MBeans dont le nom est 'testBean' [*:*,name=testBean]&quot;);
	Set results = server.queryMBeans(new ObjectName(&quot;*:*,name=testBean&quot;),
			null);
	for (Iterator iter = results.iterator(); iter.hasNext();) {
		ObjectInstance oi = (ObjectInstance) iter.next();
		ObjectName objectName = oi.getObjectName();
		System.out.println(objectName);
	}
}
</pre><p>Sur la sortie console on obtient :</p><p><code> Recherche du MBeanHome<br
/> Recherche de tous les MBeans dont le nom est 'testBean' [*:*,name=testBean]<br
/> bean:name=testBean<br
/> </code></p><p>Donc notre MBean est exposé sur le serveur WebLogic.</p><p>Rajoutons une ligne de code pour obtenir la valeur de l&#8217;attribut MBean (JMXClient2.java)</p><pre class="brush: java; title: ; notranslate">
for (Iterator iter = results.iterator(); iter.hasNext();) {
  ObjectInstance oi = (ObjectInstance) iter.next();
  ObjectName objectName = oi.getObjectName();
  System.out.println(objectName);
  System.out.println(server.getAttribute(objectName, &quot;Name&quot;));
  System.out.println(server.getAttribute(objectName, &quot;Age&quot;));
}
</pre><p><strong>Deuxième Difficulté</strong> : Sur l&#8217;appel de la méthode server.getAttribute(), le serveur lance une Exception :</p><p><code>javax.management.ReflectionException: The target object class class javax.management.modelmbean.ModelMBeanOperationInfo could not be found.</code></p><p>Cette exception indique un problème lié au code de WebLogic géré par le classloader système qui doit accéder à une classe chargée par le classloader de l&#8217;application Web. Le classloader d&#8217;un module J2EE (jar,war,ear) <em>dérive</em> du classloader système, et non l&#8217;inverse.</p><p><strong>Solution</strong> : D&#8217;après le Bug Tracker de Spring [2], il faut, pour exposer notre MBean, utiliser une bibliothèque tierce packagée dans l&#8217;application Web: Le projet Apache Common Modeler [3]</p><ul><li>Copions le fichier commons-modeler-2.0.jar dans le répertoire WEB-INF/lib</li><li>Dérivons la classe org.springframework.jmx.export.MBeanExporter et surchargeons la méthode createModelMBean()</li></ul><pre class="brush: java; title: ; notranslate">
package fr.xebia.management;
import javax.management.MBeanException;
import javax.management.modelmbean.ModelMBean;
import org.springframework.jmx.export.MBeanExporter;
public class CommonModelerBeanExporter extends MBeanExporter {
	protected ModelMBean createModelMBean() throws MBeanException {
		return new org.apache.commons.modeler.BaseModelMBean();
	}
}
</pre><ul><li>Modifions l&#8217;assemblage Spring pour utiliser cette classe à la place MBeanExporter</li></ul><pre class="brush: xml; title: ; notranslate">
&lt;bean id=&quot;exporter&quot; class=&quot;fr.xebia.management.CommonModelerBeanExporter&quot;&gt;
	&lt;property name=&quot;beans&quot;&gt;
		&lt;map&gt;
			&lt;entry key=&quot;bean:name=testBean&quot; value-ref=&quot;infombean&quot; /&gt;
		&lt;/map&gt;
	&lt;/property&gt;
	&lt;property name=&quot;server&quot; ref=&quot;weblogicMBeanServer&quot; /&gt;
&lt;/bean&gt;
</pre><p>Apres avoir redéployé l&#8217;application, le client de test JMXClient2.java permet d&#8217;afficher la valeur de l&#8217;attribut &#8216;Name&#8217; et &#8216;Age&#8217; du MBean</p><p><code>class test.xebia.management.JMXClient2<br
/> Recherche du MBeanHome<br
/> Recherche de tous les MBeans dont le nom est 'testBean' [*:*,name=testBean]<br
/> bean:name=testBean<br
/> 2<br
/> </code></p><p>Les valeurs affichées sont celles indiqués dans le fichier d&#8217;assemblage Spring.</p><p>Le client de test JMXClient3 modifie la valeur des attribut du MBean.</p><p><code>class test.xebia.management.JMXClient3<br
/> Recherche du MBeanHome<br
/> Recherche de tous les MBeans dont le nom est 'testBean' [*:*,name=testBean]<br
/> bean:name=testBean<br
/> Modification de l'attribut Name=J2EE<br
/> Modification de l'attribut Age=4<br
/> </code></p><p>Si on relance le client de test JMXClient2, on doit obtenir les valeur J2EE et 4: L&#8217;instance du MBean est unique sur le server WebLogic.</p><p><code>class test.xebia.management.JMXClient2<br
/> Recherche du MBeanHome<br
/> Recherche de tous les MBeans dont le nom est 'testBean' [*:*,name=testBean]<br
/> bean:name=testBean<br
/> J2EE<br
/> 4<br
/> </code></p><p>Le projet Eclipse est disponible : <a
href='http://blog.xebia.fr/wp-content/uploads/2007/04/weblogicspringmbean.zip' title='weblogicspringmbean.zip'>weblogicspringmbean.zip</a>. Il n&#8217;inclut pas le fichier spring.jar.</p><p>Avec le support en natif par la JVM, la technologie JMX va devenir de plus en plus présente dans les applications J2EE pour offrir une gestion à deux niveaux :</p><ul><li>gestion technique : paramétrage de niveaux de log, accès à des statistiques (Pools de Connexion, Transaction, &#8230;)</li><li>gestion fonctionnelle : par exemple, l&#8217;application va pouvoir exposer elle-même des indicateurs à destinations des utilisateurs et pilotes fonctionnels. Aujourd&#8217;hui, ces indicateurs sont généralement calculés à grands coups de requêtes dans la base de données.</li></ul><p>Un prochain post montrera comment accéder à ce bean en utilisant le langage WLST (WebLogic Scripting Tool).</p><p><strong>Référence</strong>:</p><p>[1] <a
href="http://static.springframework.org/spring/docs/2.0.x/reference/jmx.html">Documentation Spring 2.0 JMX</a><br
/> [2] <a
href="http://opensource2.atlassian.com/projects/spring/browse/SPR-1395?page=all">JIRA Spring</a><br
/> [3] <a
href="http://jakarta.apache.org/commons/modeler/">Apache Common Modeler</a></p> ]]></content:encoded> <wfw:commentRss>http://blog.xebia.fr/2007/02/21/exposer-un-mbean-avec-spring-dans-weblogic-server-81/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> </channel> </rss>
