{"id":661,"date":"2019-10-03T09:19:12","date_gmt":"2019-10-03T07:19:12","guid":{"rendered":"https:\/\/corsaire-consulting.fr\/blog\/?p=661"},"modified":"2019-10-03T09:19:12","modified_gmt":"2019-10-03T07:19:12","slug":"readyapp-framework","status":"publish","type":"post","link":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/2019\/10\/03\/readyapp-framework\/","title":{"rendered":"ReadyApp Framework"},"content":{"rendered":"<p>Introduit dans la version 12.2.1.3.0 de WebLogic Server, le framework \u00ab\u00a0ReadyApp\u00a0\u00bb permet de g\u00e9rer plus finement l&rsquo;acc\u00e8s aux applications h\u00e9berg\u00e9es dans un domaine WebLogic.<\/p>\n<p>La <a href=\"https:\/\/docs.oracle.com\/en\/middleware\/fusion-middleware\/weblogic-server\/12.2.1.4\/depgd\/managing.html#GUID-C98443B1-D368-4CA4-A7A4-97B86FFD3C28\" target=\"_blank\" rel=\"noopener noreferrer\">documentation<\/a> est assez claire et permet de mettre en oeuvre la fonctionnalit\u00e9.<\/p>\n<p>Je souhaiterai apporter ici quelques pr\u00e9cisions qui permettrons, j&rsquo;esp\u00e8re, d&rsquo;utiliser cette fonctionnalit\u00e9 \u00e0 bon escient.<\/p>\n<p><!--more--><\/p>\n<p>Le frameword \u00ab\u00a0ReadyApp\u00a0\u00bb permet d&rsquo;introduire une notion de disponibilit\u00e9 jusque-l\u00e0 absente dans WebLogic Server. En effet, jusqu&rsquo;\u00e0 pr\u00e9sent toute application d\u00e9ploy\u00e9e dans un serveur WebLogic est accessible par les utilisateurs d\u00e8s que :<\/p>\n<ul>\n<li>le serveur est \u00e0 l&rsquo;\u00e9tat RUNNING<\/li>\n<li>et que l&rsquo;application est \u00e0 l&rsquo;\u00e9tat ACTIF (ACTIVE en anglais), c&rsquo;est \u00e0 dire compl\u00e8tement d\u00e9ploy\u00e9e.<\/li>\n<\/ul>\n<p>Cet \u00e9tat ACTIF refl\u00e8te un \u00e9tat technique de l&rsquo;application. Fonctionnellement, si l&rsquo;application a besoin d&rsquo;ex\u00e9cuter d&rsquo;autres actions pour devenir compl\u00e8tement op\u00e9rationnelle elle fait prendre le risque aux utilisateurs de tomber sur des erreurs pendant cette phase d&rsquo;initialisation.<\/p>\n<div class=\"well\">Les \u00ab\u00a0puristes\u00a0\u00bb m&rsquo;objecteront, et je les en remercie, qu&rsquo;il est possible de d\u00e9marrer l&rsquo;application en mode ADMIN dans un premier temps puis ensuite de la passer \u00e0 l&rsquo;\u00e9tat ACTIF pour \u00e9viter cet effet ind\u00e9sirable. Cette capacit\u00e9 met en jeu une configuration assez complexe avec un canal d&rsquo;administration s\u00e9curis\u00e9 que les clients rechignent g\u00e9n\u00e9ralement \u00e0 mettre en oeuvre.<\/div>\n<p>Avec le framework \u00ab\u00a0ReadyApp\u00a0\u00bb, c&rsquo;est l&rsquo;application qui prend la responsabilit\u00e9 d&rsquo;annoncer clairement sa disponibilit\u00e9 ou non, contrairement au mode ADMIN o\u00f9 c&rsquo;est l&rsquo;administrateur ou l&rsquo;exploitant qui d\u00e9cide.<\/p>\n<p>Techniquement, la fonctionnalit\u00e9 ne pr\u00e9sente pas de difficult\u00e9 dans sa mise en oeuvre ; il faut toutefois bien avoir \u00e0 l&rsquo;esprit ces quelques points :<\/p>\n<ul>\n<li>Pour b\u00e9n\u00e9ficier de cette fonctionnalit\u00e9 la ou les applications du domaine doivent s&rsquo;enregistrer aupr\u00e8s du framework via une configuration dans le descripteur de d\u00e9ploiement weblogic-application.xml (ear) ou weblogic.xml (war) L&rsquo;\u00e9tat par d\u00e9faut est NOT READY.<\/li>\n<li>Cet \u00e9tat READY\/NOT READY est port\u00e9 au niveau du <strong>SERVEUR <\/strong>WebLogic et pas unitairement application par application. En cons\u00e9quence :\n<ul>\n<li>Pour que le serveur passe \u00e0 l&rsquo;\u00e9tat READY <span style=\"text-decoration: underline;\">toutes<\/span> les applications enregistr\u00e9es aupr\u00e8s du frameword ReadyApp doivent appeler la m\u00e9thode weblogic.application.ready.ReadyLifecycleManager.getInstance().ready()<\/li>\n<li>Tant qu&rsquo;au moins 1 application enregistr\u00e9e n&rsquo;a pas appel\u00e9 la m\u00e9thode weblogic.application.ready.ReadyLifecycleManager.getInstance().ready(), ou qu&rsquo;elle appelle la m\u00e9thode weblogic.application.ready.ReadyLifecycleManager.getInstance().notReady() le serveur reste ou passe \u00e0 l&rsquo;\u00e9tat NOT READY.<\/li>\n<\/ul>\n<\/li>\n<li>Une fois le serveur d\u00e9marr\u00e9 (RUNNING) toutes les applications d\u00e9ploy\u00e9es et \u00e0 l&rsquo;\u00e9tat ACTIF sont techniquement <strong>accessibles via leur URL<\/strong> (http:\/\/localhost:7001\/myWebApp par exemple)\n<ul>\n<li>WebLogic <span style=\"text-decoration: underline;\">ne bloque pas<\/span> l&rsquo;acc\u00e8s \u00e0 ces applications, m\u00eame si le serveur est \u00e0 l&rsquo;\u00e9tat NOT READY.<\/li>\n<li>Le verrouillage de l&rsquo;acc\u00e8s \u00e0 un serveur dont toutes les applications ne sont pas initialis\u00e9es <strong>se fait obligatoirement par le serveur HTTP plac\u00e9 en amont<\/strong> (Apache HTTPD, HAProxy, Nginx par exemple) Il doit donc \u00eatre configur\u00e9 en cons\u00e9quence avec une fonctionnalit\u00e9 de health-check. L&rsquo;url de health-check se pr\u00e9sente sous la forme http:\/\/[HOST]:[PORT]\/weblogic\/ready qui\u00a0 renverra une page blanche et un code HTTP \u00e0 interpr\u00e9ter :\n<ul>\n<li>200 &#8211; OK : Les applications sont pr\u00eates \u00e0 recevoir des requ\u00eates<\/li>\n<li>503 &#8211; Service Unavailable : les applications ne sont pas pr\u00eates \u00e0 recevoir des requ\u00eates.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>En r\u00e9sum\u00e9, la fonctionnalit\u00e9 est int\u00e9ressante pour peu qu&rsquo;on comprenne bien son fonctionnement. J&rsquo;y vois un int\u00e9r\u00eat particulier pour r\u00e9pondre \u00e0 un besoin r\u00e9current de disposer d&rsquo;un moyen facile pour ouvrir\/fermer l&rsquo;acc\u00e8s aux applications d&rsquo;un serveur sans passer par la \u00ab\u00a0plomberie\u00a0\u00bb administrative de la console d&rsquo;administration ou de WLST, ou de jouer avec la configuration des serveurs HTTP plac\u00e9s devant les serveurs WebLogic. L&rsquo;\u00e9tat \u00e9tant au niveau de chaque serveur, il est donc ainsi possible de \u00ab\u00a0sortir\u00a0\u00bb un serveur du service assez facilement pour quelque raison que ce soit sans avoir besoin de modifier une quelconque configuration. Une fois l&rsquo;op\u00e9ration termin\u00e9e le serveur peut \u00eatre de nouveau op\u00e9rationnel pour le service.<\/p>\n<p>Petit regret quand m\u00eame, cette information n&rsquo;est pas accessible depuis la console d&rsquo;administration ou depuis les MBeans (donc depuis WLST) La seule solution est d&rsquo;utiliser l&rsquo;url de health-check ou d&rsquo;activer l&rsquo;option de debug correspondante.<\/p>\n<p>Bonne lecture.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduit dans la version 12.2.1.3.0 de WebLogic Server, le framework \u00ab\u00a0ReadyApp\u00a0\u00bb permet de g\u00e9rer plus finement l&rsquo;acc\u00e8s aux applications h\u00e9berg\u00e9es dans un domaine WebLogic. La documentation est assez claire et permet de mettre en oeuvre la fonctionnalit\u00e9. Je souhaiterai apporter ici quelques pr\u00e9cisions qui permettrons, j&rsquo;esp\u00e8re, d&rsquo;utiliser cette fonctionnalit\u00e9 \u00e0 bon escient.<\/p>\n","protected":false},"author":1,"featured_media":671,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[4],"tags":[102,8],"class_list":["post-661","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-weblogic","tag-readyapp-framework","tag-weblogic-server"],"_links":{"self":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts\/661","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=661"}],"version-history":[{"count":9,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts\/661\/revisions"}],"predecessor-version":[{"id":670,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/posts\/661\/revisions\/670"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/media\/671"}],"wp:attachment":[{"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=661"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=661"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/corsaire-consulting.fr\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=661"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}