2009-07-03 9 views
4

J'utilise JMX pour créer un outil personnalisé pour surveiller les clusters distants au travail. Je suis capable de me connecter très bien et d'interroger les MBeans directement, et j'ai acquis presque toutes les informations dont j'ai besoin. Cependant, j'ai rencontré un problème en essayant d'interroger MBeans pour des caches spécifiques au sein d'un cluster, où je peux trouver des statistiques sur le nombre total de get/puts, le temps moyen pour chacun, etcProblème avec la requête JMX du noeud Cohérence MBeans visible dans JConsole

Les MBeans I essaie d'accéder programatically sont visibles lorsque je me connecte au processus distant en utilisant JConsole, et ont des noms comme celui-ci:

Coherence:type=Cache,service=SequenceQueue,name=SEQ%GENERATOR,nodeId=1,tier=back 

il serait plus souple si je peux dynamiquement saisir toutes les type=Cache MBeans pour un ID de nœud particulier sans spécifier toutes les caches. Je suis en train de les interroger comme ceci:

QueryExp specifiedNodeId = Query.eq(Query.attr("nodeId"), Query.value(nodeId)); 
QueryExp typeIsCache = Query.eq(Query.attr("type"), Query.value("Cache")); 
QueryExp cacheNodes = Query.and(specifiedNodeId, typeIsCache); 
ObjectName coherence = new ObjectName("Coherence:*"); 
Set<ObjectName> cacheMBeans = mBeanServer.queryMBeans(coherence, cacheNodes); 

Cependant, que j'utilise queryMBeans() ou queryNames(), la requête renvoie un ensemble contenant ...

  • ... 0 objets si je passe les arguments présentés ci-dessus
  • ... 0 objets si je passe null pour le premier argument
  • ... tous MBeans dans le domaine Coherence:* (112) si je passe null pour le second argument
  • ... tous les MBean simples (128) si je passe null pour les deux arguments

Les deux premiers résultats sont à l'inattendu ceux, et suggèrent un problème dans le QueryExp je passe, mais je ne peux pas comprendre quel est le problème. J'ai même essayé de passer juste typeIsCache ou specifiedNodeId pour le deuxième paramètre (avec soit coherence ou null comme premier paramètre) et j'ai toujours 0 résultats.

Je suis assez écolo avec JMX - quel est le problème? (Pour votre information, l'outil de surveillance sera exécuté sur Java 5, donc les choses comme JMX 2.0 ne me aider à ce point.)

Répondre

4

Je voulais juste poster ma solution pour la postérité ...

Je suis capable de récupérer avec succès l'ensemble des MBeans correspondant aux caractéristiques spécifiées grâce à une approche plus simple (mais plus étrange). Je ne sais toujours pas pourquoi l'approche QueryExp ne fonctionne pas, mais voici ce qui fonctionne (remplace la dernière ligne de code dans ma question):

Set<ObjectName> cacheMBeans = mBeanServer.queryNames(new ObjectName("Coherence:type=Cache,nodeId="+nodeId+",*"), null); 

Il fonctionne également lors de l'ajout d'un fragment service=SequenceQueue dans le ObjectName Chaîne constructeur à filtrer par nom de service de cohérence (cache).

Tant que cela fonctionne d'une certaine façon, il me suffit de faire mon travail, mais cela semble être une faille flagrante dans l'implémentation de JMX. Et ne me lancez pas sur le processus de création d'un JMXServiceURL en utilisant JMX et RMI ...

1

Je suis tombé sur le même chemin que vous, et je pense que les documents JDK pourraient être plus clairs.La requête * * semble ne pouvoir correspondre qu'aux attributs du MBean sous-jacent (c'est-à-dire les acquéreurs réels de POJO), tandis que les modèles ObjectName peuvent correspondre aux clés/valeurs dans le nom de l'objet lui-même.

Ce serait bien d'avoir la flexibilité de faire des requêtes plus complexes dans le domaine ObjectName.

Questions connexes