Les plans de déploiement Weblogic

« Il faudrait pouvoir changer le nom de la DataSource en fonction des environnements »
« Ouh la la, c’est compliqué, il faut décompresser l’archive de l’application MonApp.ear et les 5 fichiers .war et les 8 fichiers .jar des ejb. Ça prendra 3 semaines minimum, et sans la documentation! »

(La fonctionnalité « plans de déploiement » décrite dans cette article est disponible à partir de WebLogic 9)

Lors de l’article précédent, 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’est suffisante pour paramétrer cette application dans différents environnements projets (Recette, Pré-Production ou Production). Il n’est pas envisageable que pour chaque environnement, il faille ouvrir l’archive, modifier le fichier XML avec les nouveaux paramètres et pour finir de la refermer.
L’idée des plans de déploiement est de laisser l’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’ensemble des nouveaux paramètres à surcharger.

Reprenons l’application MyWebApplicationEAR décrite dans la première partie et appliquons un plan de déploiement pour modifier quelques paramètres.

Préparation de l’environnement de travail

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

Génération du template du plan

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’ear passé en paramètre.

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...
<4 avr. 2008 18 h 03 CEST> <Info> <J2EE Deployment SPI> <BEA-260072> <Saved configuration for application, MyWebApplicationEAR.ear>

MyWebApplicationEAR
+---app
|       MyWebApplicationEAR.ear
|
---plan
        plan.xml

Le fichier template du plan (plan.xml) a été créé dans le répertoire plan

Structure du fichier plan.xml

A ce niveau du processus, le fichier plan.xml contient uniquement la définition des différents modules qui composent l’archive EAR. On retrouve donc:

  • un module MyWebApplicationEAR.ear, de type EAR, avec 3 descripteurs de déploiement (weblogic-application.xml, application.xml et ds-jdbc.xml)
  • un module MyWebApplication.war, de type WAR, avec 2 descripteurs de déploiement (web.xml et weblogic.xml)
<?xml version='1.0' encoding='UTF-8'?>
<deployment-plan xmlns="http://www.bea.com/ns/weblogic/90"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-deployment-plan.xsd"
 global-variables="false">
  <application-name>MyWebApplicationEAR.ear</application-name>

  <!-- Descripteurs portés par l'EAR -->

  <module-override>
    <module-name>MyWebApplicationEAR.ear</module-name>
    <module-type>ear</module-type>
    <module-descriptor external="false">
      <root-element>weblogic-application</root-element>
      <uri>META-INF/weblogic-application.xml</uri>
    </module-descriptor>
    <module-descriptor external="false">
      <root-element>application</root-element>
      <uri>META-INF/application.xml</uri>
    </module-descriptor>
    <module-descriptor external="false">
      <root-element>jdbc-data-source</root-element>
      <uri>META-INF/ds-jdbc.xml</uri>
    </module-descriptor>
  </module-override>

  <!-- Descripteurs portés par le WAR-->
  <module-override>
    <module-name>MyWebApplication.war</module-name>
    <module-type>war</module-type>
    <module-descriptor external="false">
      <root-element>weblogic-web-app</root-element>
      <uri>WEB-INF/weblogic.xml</uri>
    </module-descriptor>
    <module-descriptor external="false">
      <root-element>web-app</root-element>
      <uri>WEB-INF/web.xml</uri>
    </module-descriptor>
  </module-override>
  <config-root xsi:nil="true"></config-root>
</deployment-plan>

Paramétrage du plan en utilisant la console d’administration

Notre plan est vide, il faut maintenant indiquer les paramètres à modifier. Dans un premier temps, le plus simple est d’utiliser la console d’administration du domaine.

  1. Déployer l’application en sélectionnant le répertoire DeployementPlan/MyWebApplicationEAR.
  2. Accepter l’ensemble des valeurs par défaut (Next, Next, Finish)
  3. Activer les modifications.

Remarque : On voit que le fichier plan.xml est indiqué comme ‘Deployment Plan’

Paramétrage pour un environnement de Recette.

  1. Sélectionner le module MyWebApplicationDS
  2. 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.
  3. 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 ‘ReleaseConfiguration’ et non ‘Apply Changes’.

Structure du fichier plan.xml

Si on examine les modifications faites par la Console Weblogic sur le fichier plan.xml, on peut noter:

  • l’apparition d’un ensemble de nœuds gardé par <variable-definition/>. Il contient un ensemble de couples de variables (name, value) qui correspondent aux paramètres modifiés
<deployment-plan xmlns="http://www.bea.com/ns/weblogic/90"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...>

  <application-name>MyWebApplicationEAR</application-name>
  <!-- Bloc Variable Definition -->
  <variable-definition>
    <variable>
      <name>JDBCDriverParams_PasswordEncrypted_12040376123280</name>
      <value>{3DES}QZJ2MfqOliA=</value>
    </variable>
    <variable>
      <name>JDBCConnectionPoolParams_MaxCapacity_12040378132185</name>
      <value>10</value>
    </variable>
    <variable>
      <name>JDBCProperty_user_Value_12040378358436</name>
      <value>recette</value>
    </variable>
    <variable>
      <name>SessionDescriptor_timeoutSecs_12040384414060</name>
      <value>360</value>
    </variable>
  </variable-definition>
  .....
</deployment-plan>
  • la modification des nœuds . Pour chaque variable qui concerne le module, une expression XPath est définie pour permettre au serveur d’application d’effectuer la substitution avec la nouvelle valeur.
<deployment-plan xmlns="http://www.bea.com/ns/weblogic/90"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...>
....
   <module-descriptor external="false">
      <root-element>jdbc-data-source</root-element>
      <uri>META-INF/ds-jdbc.xml</uri>
      <variable-assignment>
        <name>JDBCDriverParams_PasswordEncrypted_12040376123280</name>
        <xpath>/jdbc-data-source/jdbc-driver-params/password-encrypted</xpath>
      </variable-assignment>
      <variable-assignment>
        <name>JDBCConnectionPoolParams_MaxCapacity_12040378132185</name>
        <xpath>/jdbc-data-source/jdbc-connection-pool-params/max-capacity</xpath>
      </variable-assignment>
      <variable-assignment>
        <name>JDBCProperty_user_Value_12040378358436</name>
        <xpath>/jdbc-data-source/jdbc-driver-params/properties/property/[name="user"]/value</xpath>
      </variable-assignment>
    </module-descriptor>
....
</deployment-plan>

A partir de ce plan créé pour un environnement de type ‘Recette’ (plan-recette.xml), il est facile de le décliner pour d’autres environnement, ex la ‘Production’ (plan-production.xml). Les changements sont :

  • les propriétés UserName et Password (Production/Production) et
  • la propriété Maximum Capacity=20.
DeployementPlanMyWebApplicationEAR

+---app
|       MyWebApplicationEAR.ear
|
---plan
        plan-production.xml
        plan-recette.xml

(Note: le fichier plan.xml a été renommé en ‘plan-recette.xml’).

Utilisation du plan

Une fois les plans créés, il est très facile avec WLST de déployer l’application sur l’environnement cible avec son plan de déploiement.
Note : Une fois les fichiers de plan de déploiement créés, il n’est pas nécessaire de conserver une arborescence ./app et ./plan comme établi en début d’article.

Exemple: déploiement de l’application MyWebApplicationEAR en mode production.


deploy(appName='MyWebApplicationEAR',path='/vers/monfichier/ear/MyWebApplicationEAR.ear', planPath=/vers/mon/plan/MyWebApplicationEAR/plan/plan-production.xml')

Vérification avec l’application MyWebApplication:

Les plans de déploiement peuvent également servir à mettre à jour les paramètres de l’application si celle-ci est déjà déployée dans le serveur WebLogic

  • Soit avec la console d’administration, deployement –> update

Exemple:


updateApplication(''MyWebApplicationEAR','/vers/mon/plan/MyWebApplicationEAR/plan/plan-production-tuning.xml')

Conclusion

Les plans de déploiement :

  • répondent à un besoin longtemps exprimé par les utilisateurs: pouvoir modifier le paramétrage d’une application sans à nécessiter de lourdes procédures d’extraction des descripteurs de déploiement enfouis dans les archives J2EE (.ear/.jar/.war).
  • permettent de séparer clairement les rôles: d’un côté les développeurs créent l’application, de l’autre le ‘déployeur’ ou l’administrateur adapte l’application à l’environnement cible.

Documentation BEA,Deploying Applications to WebLogic Server

6 Responses

  • Je projet jndi-resources devrait t’intéresser
    http://code.google.com/p/jndi-resources/

    Il aborde la même problématique mais cross serveur d’app. Pour l’instant il ne supporte que tomcat et jboss. Mais c’est conçu pour facilement ajouter le support d’autres serveurs (pourvu que l’on connaisse son mode fonctionnement spécifique). Tu es le bienvenu pour ajouter le support de weblogic !

  • Bonjour,

    L’article est très clair, cependant j’ai une question, est-il possible de modifié d’autres paramètres que ceux repris dans les descripteurs de déploiement?

    En fait j’ai d’autre fichier qui aurait besoin d’être édités.

    Merci d’avance

  • @Nicolas les paramètres modifiables concernent ceux que l’on a dans les descripteurs de déploiement génériques J2EE & spécifiques Weblogic au niveau web, ejb et application( nœud uri) . A quels autres fichiers pensez-vous ?

  • Hi Benoit,

    This is a great article!! I’ve tried several things after going thru your blog but failed.

    Can we use a deployment plan to set an application use a work manager with constraints attached to it??

    I’ve already created the work manager & constraints thru the admin console (Global Work Manager).

    Now i want the application to use it. how do i set the dispatch policy in the plan?

  • Hi Jim, Thanks to take time read it (in French) and post a comment.
    >>Can we use a deployment plan to set an application use a work manager with constraints attached to it??
    I think With a Deployment plan you can only make assign existing item ( such as wl-dispatch-policy, max/min thread constrains or request class) not create them in the server. Keep in mind that the deployement plan only allows you to modifiy DD.
    >>Now i want the application to use it. how do i set the dispatch policy in the plan?
    This is an exemple, assign a new context root and a dispatch policy to a servlet.

    <?xml version='1.0' encoding='UTF-8'?>
    <deployment-plan xmlns="http://www.bea.com/ns/weblogic/deployment-plan" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/ns/weblogic/deployment-plan http://www.bea.com/ns/weblogic/deployment-plan/1.0/deployment-plan.xsd" global-variables="false">
      <application-name>Application2</application-name>
      <variable-definition>
        <variable>
          <name>WeblogicWebApp_ContextRoots</name>
          <value>"application2"</value>
        </variable>
        <variable>
          <name>Application_WorkManager</name>
          <value>"waiting.room.2.dispatch.policy"</value>
        </variable>
        <variable>
          <name>WorkManager_waiting.room.2.dispatch.policy_Name_12247535261400</name>
          <value>waiting.room.2.dispatch.policy</value>
        </variable>
        <variable>
          <name>WorkManager_waiting.room.2.dispatch.policy_RequestClassName_12247536926870</name>
          <value></value>
        </variable>
        <variable>
          <name>WorkManager_waiting.room.2.dispatch.policy_MaxThreadsConstraintName_12247536926871</name>
          <value>MaxThreadsConstraint-App2</value>
        </variable>
      </variable-definition>
      <module-override>
        <module-name>WaitingRoomService.war</module-name>
        <module-type>war</module-type>
        <module-descriptor external="false">
          <root-element>weblogic-web-app</root-element>
          <uri>WEB-INF/weblogic.xml</uri>
          <variable-assignment>
            <name>WeblogicWebApp_ContextRoots</name>
            <xpath>/weblogic-web-app/context-root</xpath>
            <operation>replace</operation>
          </variable-assignment>
          <variable-assignment>
            <name>Application_WorkManager</name>
            <xpath>/weblogic-web-app/wl-dispatch-policy</xpath>
            <operation>replace</operation>
          </variable-assignment>
          <variable-assignment>
            <name>WorkManager_waiting.room.2.dispatch.policy_Name_12247535261400</name>
            <xpath>/weblogic-web-app/work-manager/[name="waiting.room.2.dispatch.policy"]/name</xpath>
          </variable-assignment>
          <variable-assignment>
            <name>WorkManager_waiting.room.2.dispatch.policy_RequestClassName_12247536926870</name>
            <xpath>/weblogic-web-app/work-manager/[name="waiting.room.2.dispatch.policy"]/request-class-name</xpath>
          </variable-assignment>
          <variable-assignment>
            <name>WorkManager_waiting.room.2.dispatch.policy_MaxThreadsConstraintName_12247536926871</name>
            <xpath>/weblogic-web-app/work-manager/[name="waiting.room.2.dispatch.policy"]/max-threads-constraint-name</xpath>
          </variable-assignment>
        </module-descriptor>
        <module-descriptor external="false">
          <root-element>web-app</root-element>
          <uri>WEB-INF/web.xml</uri>
        </module-descriptor>
        <module-descriptor external="true">
          <root-element>wldf-resource</root-element>
          <uri>META-INF/weblogic-diagnostics.xml</uri>
        </module-descriptor>
      </module-override>
      <config-root>D:\Projets\MyProjects\waiting-room\plans</config-root>
    </deployment-plan>
    
    
  • I tried to edit in the web.xml an value, using the aformentioned method. Unfortunately I havent succeeded, can you tell me whether this is possible. I have tried to find an example on the internet but none give an example how to do it for an web.xml.

Laisser un commentaire