1

我正在尝试使用以下应用程序代码获取集群信息(尤其是节点列表)。

MBeanServer server = ManagementFactory.getPlatformMBeanServer();

String clusterMembers = (String) (server.getAttribute(new ObjectName("jboss.infinispan:type=CacheManager,name=\"ejb\",component=CacheManager"), "clusterMembers"));
      (or)
Object obj = server.getAttribute(ObjectName.getInstance("jgroups:type=channel,cluster=\"web\""), "View");

两者都在抛出 InstanceNotFoundExceptions。

javax.management.InstanceNotFoundException: jgroups:type=channel,cluster="web"
2021-02-08 15:39:59,046 ERROR [stderr:71] (default task-1) javax.management.InstanceNotFoundException: jgroups:type=channel,cluster="web"
2021-02-08 15:39:59,047 ERROR [stderr:71] (default task-1)  at org.jboss.as.jmx.PluggableMBeanServerImpl.findDelegate(PluggableMBeanServerImpl.java:1113)
2021-02-08 15:39:59,047 ERROR [stderr:71] (default task-1)  at org.jboss.as.jmx.PluggableMBeanServerImpl.getAttribute(PluggableMBeanServerImpl.java:389)
4

1 回答 1

1

有很多方法可以做到这一点。以编程方式,也许最简单的方法是使用 WildFly 的集群 API。详情见:https ://github.com/wildfly/wildfly/blob/master/docs/src/main/asciidoc/_high-availability/Clustering_API.adoc#group-membership

或者,您也可以使用 WildFly 的 CLI 来获取集群信息。例如

[standalone@embedded /] /subsystem=jgroups/channel=ee:read-attribute(name=view)
{
    "outcome" => "success",
    "result" => "[localhost|0] (1) [localhost]"
}

或者,您可以直接使用 Infinispan 或 JGroups API 获取集群信息。例如

@Resource(lookup = "java:jboss/infinispan/cache-container/web")
private EmbeddedCacheManager manager;

@Resource(lookup = "java:jboss/jgroups/channel/default")
private JChannel channel;

public void foo() {
   System.out.println(this.manager.getMembers());
   System.out.println(this.channel.getView());
}

最后,如果您更喜欢 JMX 路线,请确保您的 WildFly 配置定义了 JMX 子系统,否则不会注册任何 mbean。

Infinispan mbean 使用以下域注册:“org.wildfly.clustering.infinispan”。确保您使用的是 22.0.1.Final,其中包含对https://issues.redhat.com/browse/WFLY-14286的修复

您的 jgroups jmx 代码名称几乎是正确的 - 使用默认配置,每个 Infinispan 缓存管理器都使用基于公共 JChannel 的不同 ForkChannel,名为“ee”。

于 2021-02-17T20:55:07.160 回答