如何获取 Wildfly 21 上的集群节点信息?

时间:2021-02-08 20:48:10

标签: wildfly cluster-analysis cluster-computing infinispan wildfly-21

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

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)

1 个答案:

答案 0 :(得分: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 mbeans 使用域注册:“org.wildfly.clustering.infinispan”。确保您使用的是 22.0.1.Final,其中包含针对 https://issues.redhat.com/browse/WFLY-14286

的修复

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