我正在使用 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:* 域中的所有 MBean (112) 如果我将 null 传递给第二个参数
  • ...每个 MBean (128) 如果我为两个参数都传递 null

  • 前两个结果是出乎意料的 ,并提示我传递的 QueryExp 中存在问题,但我无法弄清楚问题是什么。我什至尝试只为第二个参数传递 typeIsCachespecifiedNodeId(将 coherencenull 作为第一个参数),我总是得到 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/

    10-10 18:30