4

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

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

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

type=Cache如果我可以在不指定所有缓存的情况下动态获取特定节点 ID 的所有 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()or queryNames(),查询都会返回一个 Set 包含...

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

前两个结果是出乎意料的结果,表明QueryExp我正在通过的一个问题,但我无法弄清楚问题是什么。我什至尝试只传递typeIsCacheorspecifiedNodeId作为第二个参数(使用coherenceornull作为第一个参数),但我总是得到 0 个结果。

我对 JMX 非常熟悉——对问题所在有什么见解吗?(仅供参考,监控工具将在 Java 5 上运行,所以像 JMX 2.0 这样的东西现在对我没有帮助。)

4

2 回答 2

4

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

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

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

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

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

于 2009-07-22T17:55:14.453 回答
1

我和你走上了同样的路,我认为 JDK 文档可能更清楚。

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

如果能够灵活地在 ObjectName 域中进行更复杂的查询,那就太好了。

于 2010-05-24T21:16:05.350 回答