我正在使用 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()
,查询都会返回一个 Set,其中包含...
- ...0 个对象 如果我传递上面显示的参数
- ...0 个对象 如果我为第一个参数传递
null
- ...
Coherence:*
域中的所有 MBean (112) 如果我为第二个参数传递null
- ...如果我为两个参数传递
null
,则每个 MBean (128)
前两个结果出乎意料,提示我传递的QueryExp
有问题,但我想不通是什么问题。我什至尝试只为第二个参数传递 typeIsCache
或 specifiedNodeId
(第一个参数为 coherence
或 null
) 而我总是得到 0 个结果。
我对 JMX 很陌生 — 对问题是什么有任何见解吗? (仅供引用,监控工具将在 Java 5 上运行,因此此时 JMX 2.0 之类的东西对我没有帮助。)
最佳答案
只是想为后代发布我的解决方案......
我已经能够通过一种更简单(但更陌生)的方法成功检索到与指定特征匹配的 MBean 集。我仍然不知道为什么 QueryExp
方法不起作用,但这是有效的方法(替换我问题中的最后一行代码):
Set<ObjectName> cacheMBeans = mBeanServer.queryNames(new ObjectName("Coherence:type=Cache,nodeId="+nodeId+",*"), null);
在 ObjectName 构造函数字符串中添加片段 service=SequenceQueue
以按 Coherence 服务(缓存)名称进行过滤时,它也适用。
只要它能以某种方式工作,就足以让我完成我的工作,但这似乎是 JMX 实现中的一个明显缺陷。不要让我开始使用 JMX 和 RMI 创建有效的 JMXServiceURL 的过程......
关于java - 在 JConsole 中可见的 Coherence 节点 MBean 的 JMX 查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1077359/