当前位置: 首页 > 知识库问答 >
问题:

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

益智明
2023-03-14

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

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

这不起作用,因为每个web应用程序都有自己的支持JMX的插件的类加载器定义,但它们都将共享相同的平台MBeanServer,并使用相同的对象名来注册它们的MBean,因此存在冲突。

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

我搜索了这个主题,找到了一些WebLogic的留档,这表明我应该使用JNDI查找MBeanServer。然而,这似乎是特定于WebLogic的。

难道没有一种通用的一刀切的方法吗?

更新:

以下是使用附加属性来标识Web应用定义的类加载器的快速概念验证:

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应用程序做特殊考虑

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

共有1个答案

魏宸
2023-03-14

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

使用Jolokia时,JVM的所有MBeanServer都会透明地合并。然而,当您有具有相同名称的MBean时,这在这里也没有帮助,因为只有一个MBean可以访问。

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

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

 类似资料:
  • 问题内容: 我一直在尝试通过Maven 集成在GlassFish V3中部署Java 。虽然我发现了一些插件,但它们看起来都不是很活跃: Maven Glassfish插件 Eskato在Maven上的Wordpress博客 而且我从Eskato的Blog中获得了最多的信息,该博客写于2008年3月,所以我不知道GlassFish Maven集成的状态如何,也找不到适合的插件。使用Maven Gl

  • 问题内容: 在GF或Tomcat之前使用Apache Webserver是个好主意吗?它会提高性能/安全性吗? 还是没有任何理由将Apache Web Server与GF一起使用? 问题答案: 取自https://cwiki.apache.org/confluence/display/TOMCAT/Connectors#Connectors-Q3 聚类。通过使用Apache HTTP作为前端,您可

  • 我们最近切换到了 Glassfish 3.1.2.2,并有几个 Web 应用程序打包为 war 文件。有时,这些应用程序所需的上下文根目录与文件名不同。 当我们使用Weblogic时,我们通过在Weblogic中声明上下文根来实现这一点。像这样的xml 我们注意到glassfish-web.xml中存在相同的标记,但是不管我们在那里定义什么,服务器总是将文件名确定为上下文根。 现在我们在 asad

  • 问题内容: eclipse与weblogic配合使用的推荐插件是什么?具体来说,我需要使用旧版本的weblogic 8.1,但是我可以使用任何版本的Ecplise。我想调试应用程序并设置断点等。 我更大的任务是将项目移至Jboss,我是否可以在Eclipse中的两个应用服务器上部署相同的应用,大概需要2套配置文件,等等,有什么建议吗?2个独立的项目? 问题答案: 如果将Eclipse与WTP一起使

  • 我有一个EAR项目,由3个模块/项目组成:WEB、EJB和JPA。在WEB项目中,我添加了log4j2用于日志记录。因此,我将log4j2.xml文件放入webcontent/web-inf/direcotry。 当我只部署一个项目(例如开发人员版本)时,所有工作都很好。然而,当im部署这两个项目时,它们都将日志记录到同一个文件(它始终是从首先部署的项目在log4j2中配置的文件)。我的Glass

  • 问题内容: 我正在使用JSLint来遍历JavaScript,并且在执行诸如在语句内部进行比较之类的操作时,它返回许多建议以(三个等号)替换==(两个等号)。 有没有性能优势,以代替用? 由于存在许多比较运算符,因此任何性能改进都将受到欢迎。 如果没有进行类型转换,性能会超过==? 问题答案: 身份()运算符的行为与相等()运算符相同,但不进行任何类型转换,并且类型必须相同才能被视为相等。 进行任