OSB 12c : lister les URL des Proxy et Business déployés en utilisant JMX

Tout projet ayant mis en place un ESB, quel qu’il soit, fait face au même besoin : répertorier la liste des flux.
Plusieurs solutions sont possibles, des plus simples aux plus complexes, certaines manuelles et d’autres automatiques. Ici, on souhaite avoir à disposition un WS renvoyant, de manière automatique, la liste des URLs exposées par l’OSB (celles des Proxy Services) ainsi que la liste des URLs atteintes par l’OSB (celles des Business Services), le tout agrégé par service liant les Proxy et les Business.
Pour ça, on expose un nouveau Proxy dans lequel on fait appel à une classe Java via un simple Java Callout. Dans cette classe Java, on utilisera JMX pour interroger les MBeans Weblogic.
On peut autrement accéder à ces MBeans via Enterprise Manager (EM) en suivant le chemin suivant :
clic-droit sur soa-infra > Administration > System MBean Browser
Voici, dans les grandes lignes, ce qui nous permet d’arriver au résultat souhaité.
D’abord quelques imports importants dont vous aurez besoin :

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
 
import javax.naming.Context;

Il vous faudra initialisé une connexion au serveur Weblogic sur lequel est déployé l’OSB :

JMXServiceURL serviceURL = new JMXServiceURL("t3", "soahost1", 7001, "/jndi/weblogic.management.mbeanservers.domainruntime"); 
Hashtable<String, String> h = new Hashtable<String, String>();
h.put(Context.SECURITY_PRINCIPAL, "weblogic");
h.put(Context.SECURITY_CREDENTIALS, "welcome1");
h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote");
JMXConnector connector = JMXConnectorFactory.connect(serviceURL, h);
MBeanServerConnection connection = connector.getMBeanServerConnection();

On choisit le protocole t3, propre à Weblogic.
Pour ce besoin, il nous faut ajouter la paire clé-valeur suivante qui définit les protocoles utilisés pour se connecter au serveur Weblogic :

h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote");

Une fois la connexion initialisée, on peut faire notre requête dans l’arbre JNDI de Weblogic.
Les Business, Proxy et Pipeline sont des ressources de type ResourceConfigurationMBean.
Dans l’exemple ci-dessous, on récupère l’ensemble des Business, Proxy et Pipeline déployés sur le serveur, et on affiche simplement leurs noms :

Set<objectname> osbconfigs = connection.queryNames(new ObjectName("com.oracle.osb:Type=ResourceConfigurationMBean,*"), null);
 
for (ObjectName config : osbconfigs) {
 
 String configName = config.getKeyProperty("Name");
  
 System.out.println(configName);
}

On obtient le résultat suivant :

ProxyService$GISPER$IN$serPersonne$V1$ProxyService$serPersonne
PipelineService$GISPER$IN$serPersonne$V1$ProxyService$serPersonne
BusinessService$GISPER$IN$serPersonne$V1$BusinessService$refPersonneMUTU

On peut par exemple se baser sur leur nom pour les filtrer, trier… comme on veut.
Allons un peu plus loin et voyons comment récupérer les fameuses URLs qui nous interessent tant :

Set<objectname> osbconfigs = connection.queryNames(new ObjectName("com.oracle.osb:Type=ResourceConfigurationMBean,*"), null);
 
for (ObjectName config : osbconfigs) {
  
 CompositeDataSupport configurationCds = (CompositeDataSupport) connection.getAttribute(config, "Configuration");
 String servicetype = (String) configurationCds.get("service-type"); // "SOAP", etc
  
 CompositeDataSupport transportConfigurationCds = (CompositeDataSupport) configurationCds.get("transport-configuration");
 String transportType = (String) transportConfigurationCds.get("transport-type"); // "http", etc
 
 // si la ressource est de type ProxyService
 String proxyServiceURL = (String) transportConfigurationCds.get("url");
  
 // si la ressource est de type BusinessService
 CompositeData[] urlConfiguration = (CompositeData[]) transportConfigurationCds.get("url-configuration");
 String businessServiceURL = (String) urlConfiguration[0].get("url");
}

Il suffit donc de parcourir en profondeur les attributs de chacun des MBeans retournés par la requête. Ils nous permettent de récupérer de nombreuses informations sur ce qui est déployé sur le serveur.
Grâce au chemin absolu de vos ressources, vous pourrez agréger les résultats obtenus selon l’organisation de vos projets OSB, et renvoyer un résultat final compact, cohérent et compréhensible par quiconque qui connait la cartographie du projet.
Conseils
Afin de pouvoir agréger les données plus facilement via des programmes comme celui-ci, soyez rigoureux dans l’organisation de vos projets OSB. Tous les projets OSB doivent être structurés selon la même logique (nombre de niveaux de répertoires, noms des répertoires, etc).
Fixez des normes de nommage et de développement, vous pourrez ensuite vous en servir comme règles pour vos tâches d’exploitation.