gpt4 book ai didi

jakarta-ee - 在 Tomcat、WebLogic、Glassfish 等中使用哪个 MBeanServer?

转载 作者:行者123 更新时间:2023-11-28 21:47:19 27 4
gpt4 key购买 nike

我目前正在研究 http://truevfs.java.net ,Java 的虚拟文件系统。 TrueVFS 是模块化的,使用插件架构在运行时加载功能,无需配置任何东西。一些可选插件使用平台 MBeanServer 来注册具有定义的 ObjectName 的 MBean 以进行监视和管理。

现在我的一些用户将 TrueVFS JAR 捆绑在他们的 WAR 中以部署到 Tomcat 等。这工作正常,除非他们包含启用 JMX 的插件之一并在不同上下文中部署 WAR 的多个实例。

这是行不通的,因为每个 Web 应用程序都有自己的启用 JMX 的插件的类加载器定义,但它们将共享相同的平台 MBeanServer 并使用相同的 ObjectNames 来注册它们的 MBean,因此会发生冲突.

现在我该如何解决这个问题呢?我已经提取了 MBeanServer 查找,以便我可以将它提取到另一个插件中,但是我无法确定一个普遍适用的策略,我应该使用哪个 MBeanServer 来注册我的 MBean。

我用谷歌搜索了这个主题,找到了一些 documentation for WebLogic这表明我应该使用 JNDI 查找 MBeanServer。然而,这似乎是 WebLogic 特有的。

难道没有通用的通用方法吗?


更新:

这是使用附加属性来识别网络应用程序定义的类加载器的快速概念验证:

import java.lang.management.ManagementFactory;
import javax.management.JMX;
import javax.management.MBeanServer;
import javax.management.ObjectName;

public class Messenger implements MessengerMXBean {

private static MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

public static void main(String[] args ) throws Exception {
register("one");
register("two");
find();
System.out.println("Waiting for interrupt...");
Thread.sleep(Long.MAX_VALUE);
}

private static void register(String context) throws Exception {
mbs.registerMBean(new Messenger(),
new ObjectName(":type=Messenger,context=" + context));
}

private static void find() throws Exception {
for (ObjectName name : mbs.queryNames(new ObjectName(":type=Messenger,*"), null))
System.out.println(JMX.newMXBeanProxy(mbs, name, MessengerMXBean.class).getMessage());
}

public String getMessage() { return "Hello world!"; }
}

public interface MessengerMXBean { String getMessage(); }

正如预期的那样,该程序注册了两个 Messenger MBean,找到它们并打印它们的“Hello world!”消息。

但是,这种解决方案也有缺点:

  • 我必须模拟一个额外的属性作为标识符。理想情况下,这将是类加载器的标识符,这样我就可以保持通用目的,即不必仅针对 Web 应用程序做特殊考虑。
  • 现在查找 MBean 需要考虑多个类加载器的特殊情况,即一个 MBean 的多个实例仅在它们的附加限定符上有所不同,即使应用程序独立运行也是如此。

这些是严重的限制,但似乎我没有更好的选择,所以我可能会走这条路。

最佳答案

您可以为每个 war 模块重新创建一个新的 MBeanServer。但是,当从外部 JSR-160 客户端查询它们时,您还需要指定 MBeanServer。

当您使用 Jolokia 时您将透明地合并 JVM 的所有 MBeanServer。但是,当您的 MBean 具有相同的名称且只有一个可访问时,这在这里也无济于事。

对于这种情况,我的解决方案是使用相同的 MBeanServer,但使用不同名称的 MBean。您可以为这些 MBean 使用完全正交的域,或者除了其他属性之外,还可以在名称中添加额外的“限定符”键值对。当我希望在典型情况下只有一个 MBean 时,我会首先尝试添加具有固定名称的 MBean。如果失败,我将另一个 ",qualifier=..." 部分添加到名称中,其中包含一个自动生成的值,可以由某个值(如 WAR 名称)或什至唯一标识的值一个可配置的。

事实上,从客户端的角度来看,处理多个 MBeanServer 确实很痛苦,因此使用 JMX 作为具有唯一(可能部分生成的 MBean 名称)的全局命名空间是简单的选择。

关于jakarta-ee - 在 Tomcat、WebLogic、Glassfish 等中使用哪个 MBeanServer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13145440/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com