我正在使用 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()
,查询都会返回一个包含...null
Coherence:*
域中的所有 MBean (112) 如果我将 null
传递给第二个参数 null
前两个结果是出乎意料的 ,并提示我传递的
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/