JConsole中可见的Coherence节点MBean的JMX查询问题

时间:2009-07-03 00:32:02

标签: java jmx mbeans oracle-coherence

我正在使用JMX构建一个自定义工具来监控工作中的远程Coherence集群。我能够直接连接好并且直接查询MBean,并且我已经获得了几乎所有我需要的信息。但是,在尝试查询MBean以查找群集中的特定缓存时,我遇到了麻烦,在这里我可以找到有关获取/放置总数,每个平均时间等的统计信息。

当我使用JConsole连接到远程进程时,我尝试以编程方式访问的MBean是可见的,并且具有如下名称:

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

如果我可以动态获取特定节点ID的所有type=Cache MBean而不指定所有缓存,则会使其更加灵活。我试图像这样查询它们:

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);

但是,无论我使用queryMBeans()还是queryNames(),查询都会返回包含...的

  • ... 0个对象如果我传递上面显示的参数
  • ... 0个对象如果我为第一个参数传递null
  • ...如果我为第二个参数传递Coherence:*,则null域(112)中的所有MBean
  • ...如果我为两个参数传递null
  • ,则每个MBean(128)

前两个结果是出乎意料的结果,并提出QueryExp我传递的问题,但我无法弄清问题是什么。我甚至尝试将typeIsCachespecifiedNodeId传递给第二个参数(以coherencenull作为第一个参数),我总是得到0个结果。

我对JMX非常认真 - 任何有关问题的见解? (仅供参考,监控工具将在Java 5上运行,因此JMX 2.0之类的东西此时无法帮助我。)

2 个答案:

答案 0 :(得分:4)

只想发布我的后代解决方案......

我已经能够通过更简单(但更奇怪)的方法成功检索匹配指定特征的MBean集。我仍然不知道为什么QueryExp方法不起作用,但这里有什么工作(替换我问题中的最后一行代码):

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

在ObjectName构造函数字符串中添加片段service=SequenceQueue以通过Coherence服务(缓存)名称进行过滤时,它也有效。

只要它以某种方式工作,它就足以让我完成我的工作,但这似乎是JMX实现中的一个明显缺陷。并且不要让我开始使用JMX和RMI创建工作JMXServiceURL的过程......

答案 1 :(得分:1)

我和你一样走下了同样的道路,我认为JDK文档可以更加清晰。

Query。*似乎只能匹配底层MBean的属性(即真正的POJO getter),而ObjectName模式能够匹配ObjectName本身内的键/值。

拥有在ObjectName域中执行更复杂查询的灵活性会很好。