0

我们的 JavaEE 应用程序有一个服务,该服务负责安装和启动其他服务,具体取决于存储在数据库中的配置。服务安装使用

ServiceControllerMBean.install(
    org.w3c.dom.Element element,
    javax.management.ObjectName objectName)

方法。此方法需要类加载器 ObjectName 作为第二个参数。在 JBoss 4.x 下,我们使用以下 hack 来获取类加载器名称:

final ServiceControllerMBean serviceController = 
    (ServiceControllerMBean) MBeanProxy.get(
        ServiceControllerMBean.class,
        ServiceControllerMBean.OBJECT_NAME, server);

final ClassLoader = serviceController.getClass().getClassLoader();

final ObjectName loader = new ObjectName(
    "jmx.loading:UCL=" + Integer.toHexString(classLoader.hashCode()))

但是,这在 JBoss 5.x 下不起作用,因为类加载器命名已更改。

有人可以建议一种在 JBoss 5.x 下获取类加载器名称的方法吗?

先感谢您

4

2 回答 2

1

找到此问题的文档:

类加载器配置

类加载用例

很高兴获得洞察力。

最后我发现了一个不错的论坛主题:

http://www.coderanch.com/t/464514/JBoss/Class-Loading-Configuration

附加信息:

ClassLoader loader = Thread.currentThread().getContextClassLoader();
System.out.println( loader );  // sun.misc.Launcher$AppClassLoader@a12a00
loader = ThreadClassloader.class.getClassLoader();
System.out.println( loader );  // sun.misc.Launcher$AppClassLoader@a12a00

这可以帮助您从代码中获取更多信息。

于 2009-10-16T09:18:50.870 回答
1

在对该主题进行了一些研究后,我得到了我的问题的答案。虽然我不太喜欢它,因为它看起来更像是另一种 hack。但除非有人提出更优雅的解决方案,否则我会使用它。所以:

在 JBoss 5.1.0(我正在玩的那个)中,类加载器的注册名称如下:

jboss.classloader:id="vfsfile:<archive-file-name>"

同时,由 toString() 方法返回的类加载器对象的字符串表示形式如下所示:

BaseClassLoader@<memory-address>{vfsfile:<archive-file-name>}

因此,可以从类加载器字符串表示中提取归档文件名,并从中构造一个适当的 ObjectName。

于 2009-10-16T11:20:00.890 回答