如何从本地连接中查找JNDI中的DomainRuntimeServiceMBean?

时间:2014-02-13 17:48:58

标签: java weblogic jndi

我已经广泛搜索了Weblogic文档:

Oracle网站上的所有文档和我到目前为止找到的所有示例仅显示如何通过远程连接或本地MBeanServer的实例获取对此MBean的引用。

提到本地连接的一点点含糊不清:

  

MBean服务器的绝对JNDI名称。 JNDI名称必须以   /jndi/后跟一个表中描述的JNDI名称   4-1。

表4-1显示:

MBean Server                  JNDI Name
Domain Runtime MBean Server   weblogic.management.mbeanservers.domainruntime

这不起作用,我尝试转储JNDI树,但在那里找不到任何相关内容。

我在AdminServer,所以这不是问题。

我可以找到的指令可以获得对MBServer实例的引用,但这不是我需要的;例如:(MBeanServer) ctx.lookup("java:comp/env/jmx/domainRuntime");

但这对我没有任何好处,它是MBeanServer的一个实例,我不想用ObjectName的东西挖掘所有间接。

我需要引用的是DomainRuntimeServiceMBean接口:

我需要的是能够获得DomainRuntimeServiceMBean的实例 - JavaDoc

1 个答案:

答案 0 :(得分:2)

简答

类型安全接口都是不推荐使用的,您必须手动执行查找/树步行。

  

从9.0开始,MBeanHome接口和所有类型安全的接口   不推荐使用WebLogic Server MBean。相反,JMX应用程序   与WebLogic Server MBean交互应该使用标准的JMX设计   客户使用的模式   用于发现MBean的javax.management.MBeanServerConnection接口,   属性和运行时的属性类型。

长答案

private InitialContext ctx;
private MBeanServer domain;
private ObjectName domainObjectName;

在构造函数中:

ctx = new InitialContext();
this.domain = (MBeanServer) ctx.lookup("java:comp/env/jmx/domainRuntime");
this.domainObjectName = new ObjectName("com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean");

在你的方法中:

final ObjectName dr = (ObjectName) this.domain.getAttribute(domainObjectName, "DomainRuntime");
final ObjectName dm = (ObjectName) this.domain.getAttribute(dr, "DeploymentManager");
final ObjectName[] adrs = (ObjectName[]) this.domain.getAttribute(dm, "AppDeploymentRuntimes");
for (final ObjectName on : adrs)
{
    if (this.domain.getAttribute(on, "ApplicationName").equals(appName))
    {
        this.domain.invoke(on, "stop", null, null);
        break;
    }
}

当然现在我必须编写我自己的类型安全的便利类来包装所有这些冗长的无意义!