使用JMX访问WebLogic Server MBean

使用JMX访问WebLogic Server MBean

本章介绍如何从JMX客户端访问WebLogic Server MBean。它解释了如何为远程客户端设置类路径; 如何与MBean服务器建立本地和远程连接; 以及如何导航MBean层次结构。

本章包括以下部分:

设置远程客户端的类路径

如果JMX客户端在其自己的JVM(即,不是WebLogic Server实例的JVM)中运行,请在客户端的类路径中包含以下JAR文件:

WL_HOME\server\lib\wljmxclient.jar 

其中,*WL_HOME*是安装WebLogic Server的目录。

wljmxclient.jar库包含Oracle的HTTP和IIOP协议实现。通过Oracle的实现,JMX客户端发送带有连接请求的登录凭据,WebLogic Server安全框架对客户端进行身份验证。只有经过身份验证的客户端才能访问在WebLogic Server MBean服务器中注册的MBean。IIOP协议是标准协议,因此不是与WebLogic Server通信的优化方法。仅在需要使用IIOP或IIOPS协议时才选择此库。

Oracle还提供了另一个wlthint3client.jar用于远程访问的库。此库通过T3或T3S协议实现连接,以访问WebLogic Server实例或域的MBean。T3协议是一种优化的高性能协议,用于与WebLogic Server进行互操作。Oracle建议您尽可能使用T3协议。

要使用wlthint3client.jar,请wlthint3client.jar在客户端的类路径中包含。外部服务器托管应用程序可以使用它wlthint3client.jar作为WebLogic Server实例的远程客户端。要提供对JMS,servlet,EJB和启动类等远程服务的访问wlthint3client.jar,请将所有必需的应用程序代码与应用程序服务器一起部署。请参阅了解WebLogic瘦客户端T3

注意:

虽然Oracle建议您使用其HTTP和IIOP协议的实现,但JMX客户端可以使用标准JDK中定义的IIOP协议。请参阅仅使用JDK类的远程连接。如果指定了T3协议,则客户端会自动将其转换为使用IIOP。

注意:

由于JDK的变化,WLS不再仅仅支持JMX wlclient.jar。要使用JMX,您必须使用“完整客户端”(weblogic.jar)或wljmxclient

远程连接到MBean Server

每个WebLogic Server域都包含三种类型的MBean服务器,每种服务器都提供对不同MBean层次结构的访问。请参阅MBean服务器

要连接到WebLogic MBean服务器:

  1. 通过构造javax.management.remote.JMXServiceURL对象描述MBean服务器的地址。

    通过下面的参数值给构造(参见JMXServiceURLJAVASE 8 API规范http://docs.oracle.com/javase/8/docs/api/javax/management/remote/JMXServiceURL.html):

    • 作为与MBean服务器通信的协议的以下值之一:

      t3,t3s,http,https,iiop,iiops 
      
    • 侦听承载MBean服务器的WebLogic Server实例的地址

    • 侦听WebLogic Server实例的端口

    • MBean服务器的绝对JNDI名称。JNDI名称必须/jndi/表4-1中描述的JNDI名称之一开头,后跟其中一个。

    表4-1 WebLogic MBean服务器的JNDI名称

    MBean Server JNDI名称
    Domain Runtime MBean Server weblogic.management.mbeanservers.domainruntime
    Runtime MBean Server weblogic.management.mbeanservers.runtime
    Edit MBean Server weblogic.management.mbeanservers.edit
  2. 构造一个javax.management.remote.JMXConnector对象。此对象包含JMX客户端用于连接到MBean服务器的方法。

    构造函数方法JMXConnector是:

    javax.management.remote.JMXConnectorFactory。
    connector(JMXServiceURL serviceURL,Map <String,?> environment) 
    

    通过下面的参数值给构造(参见JMXConnectorFactoryJAVA SE 8 API规范http://docs.oracle.com/javase/8/docs/api/javax/management/remote/JMXConnectorFactory.html):

    • JMXServiceURL您在上一步中创建的对象。

    • 包含以下名称 - 值对的哈希映射:

      javax.naming.Context.SECURITY_PRINCIPAL,admin-user-name 
      
      javax.naming.Context.SECURITY_CREDENTIALS,admin-user-password 
      
      javax.management.remote.JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, 
      "weblogic.management.remote"
      

    weblogic.management.remote包定义了可用于连接到WebLogic MBean服务器的协议。远程JMX客户端必须在其类路径中包含此包中的类。请参阅设置远程客户端的类路径

    (可选)在哈希映射中包含以下名称 - 值对:

    jmx.remote.x.request.waiting.timeout, milliseconds
    

    where *milliseconds*是一个java.lang.Long对象,其中包含JMX客户端等待调用MBean-server方法返回的毫秒数。如果方法在超时期限结束时未返回,则客户端将移至下一组指令。默认情况下,客户端无限期地等待返回的方法; 如果MBean服务器无法完成调用,JMX客户端将无限期挂起。

  3. 通过调用JMXConnector.getMBeanServerConnection()方法连接到WebLogic MBean服务器。

    该方法返回一个类型的对象javax.management.MBeanServerConnection

    MBeanServerConnection对象是您与WebLogic MBean服务器的连接。您可以将它用于本地和远程连接。见MBeanServerConnection的Java SE 8 API规范http://docs.oracle.com/javase/8/docs/api/javax/management/MBeanServerConnection.html

  4. Oracle建议在客户端完成其工作时,通过调用该JMXConnector.close()方法关闭与MBean服务器的连接。

示例:连接到域运行时MBean服务器

请注意以下关于示例4-1中的代码:

  • 该类使用全局变量,connectionconnector来表示到 MBean 服务器的连接。对于每个类实例,应该仅调用一次 initConnection() 方法(它将值分配给 connectionconnector 变量),以建立可以在类内重用的单个连接。
  • initConnection()方法将用户名和密码(以及服务器的监听地址和监听端口)作为在实例化类时传递的参数。Oracle建议使用此方法,因为它会阻止您的代码包含未加密的用户凭据。String包含参数的对象将被JVM的垃圾收集例程销毁并从内存中删除。
  • 因为客户端将jmx.remote.x.request.waiting.timeout环境参数设置为10000,所以如果方法在调用10000毫秒内没有返回,则它对MBean服务器方法的所有调用都将超时。
  • 当类完成其工作时,它将调用JMXConnector.close()以关闭与MBean服务器的连接。(参见JMXConnectorJava SE 7中API规范http://docs.oracle.com/javase/7/docs/api/javax/management/remote/JMXConnector.html。)

示例4-1连接 Domain Runtime MBean Server

public class MyConnection {
   

   private static MBeanServerConnection connection;
   private static JMXConnector connector;
   private static final ObjectName service;
   /*
   *初始化与Domain Runtime MBean Server的连接。
   */
   public static void initConnection(String hostname,String portString,
      String username,String password)throws IOException,
      MalformedURLException {
   

      String protocol =“t3”;
      Integer portInteger = Integer.valueOf(portString);
      int port = portInteger.intValue();
      String jndiroot ="/ jndi /";
      String mserver ="weblogic.management.mbeanservers.domainruntime";
      JMXServiceURL serviceURL = new JMXServiceURL(protocol,hostname,port,
      jndiroot + mserver);

      Hashtable h = new Hashtable();
      h.put(Context.SECURITY_PRINCIPAL,username);
      h.put(Context.SECURITY_CREDENTIALS,password);
      h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
         “weblogic.management.remote”);
      h.put("jmx.remote.x.request.waiting.timeout"new Long10000));
      connector = JMXConnectorFactory.connect(serviceURL,h);
      connection = connector.getMBeanServerConnection();
   }

   public static void main(String [] args)throws Exception {
   
      String hostname = args [0];
      String portString = args [1];
      String username = args [2];
      String password = args [3];

      MyConnection c = new MyConnection();
      initConnection(hostname,portString,username,password);
       
      connector.close();
   }
}

最佳实践:选择MBean Server

WebLogic Server域维护三种类型的MBean服务器,每种服务器都实现特定的功能。通过支持您尝试完成的任务的MBean服务器访问MBean:

  • 要修改域的配置,请使用“Edit MBean Server”。

  • 要监视对配置MBean的挂起层次结构的更改,请使用“Edit MBean Serverd”。

  • 要仅监视活动配置MBean(而不是运行时MBean),请使用Runtime MBean Server。

    与通过Domain Runtime MBean Server进行监视相比,通过Runtime MBean Server进行监视所需的内存和网络流量更少。(在客户端请求与其连接之前,WebLogic Server不会初始化域运行时MBean服务器。)

    在大多数情况下,域中的所有服务器实例都具有相同的配置数据集,因此无论您是在Administration Server还是在受管服务器上监视Runtime MBean Server都无关紧要。但是,如果您在服务器重新启动之前进行了更改,则服务器将不再接受任何更改,并且其配置数据可能会过时。在这种情况下,监视此服务器的Runtime MBean Server仅指示特定服务器实例的配置。要了解更改WebLogic Server域并激活更改的过程,请参阅管理配置更改了解域配置的Oracle WebLogic服务器

  • 如果客户端监视多个服务器的运行时MBean,或者客户端在单独的JVM中运行,Oracle建议您连接到管理服务器上的域运行时MBean服务器,而不是分别连接到每个服务器实例上的每个运行时MBean服务器在域中。

    如果在Domain Runtime MBean Server中注册JMX侦听器并使用MBean进行过滤,则JMX过滤器将在与其监视的MBean相同的JVM中运行。例如,如果在受管服务器上注册带有MBean的过滤器,则过滤器将在受管服务器上运行,并仅将满足过滤条件的消息转发给侦听器。

    通常,使用Domain Runtime MBean Server的代码更易于维护,并且由于以下原因而更安全:

    • 您的代码只需要构建一个URL以连接到Administration Server上的Domain Runtime MBean Server。此后,代码可以查找所有服务器实例的值,并可选择过滤结果。
    • 如果您的代码使用Runtime MBean Server在多个服务器实例上读取MBean值,则它必须为每个服务器实例构造一个URL,每个服务器实例都有一个唯一的侦听地址/侦听端口组合。
    • 您可以通过管理服务器的安全管理端口在WebLogic Server域中路由所有管理流量,并且可以使用防火墙阻止从防火墙外部连接到受管服务器管理端口。

    通过域运行时MBean服务器引导所有JMX请求的权衡因网络延迟和内存使用增加而导致性能略有下降。直接连接到每个受管服务器的运行时MBean服务器以读取MBean值可消除域运行时MBean服务器从受管服务器检索值的网络跃点。但是,对于大多数网络拓扑和性能要求,域运行时MBean服务器启用的简化代码维护和增强的安全性更可取。

    注意:

    将JMX通知添加到MBean时,域运行时MBean服务器可能会占用大量内存。使用JMX通知时,存在两种情况导致Administration Server保留在域中所有受管服务器中运行的所有运行时MBean服务器中注册的所有JMX对象名的副本:

    • 在WebLogic Server级别,在受管服务器关闭时模拟取消注册MBean通知。

    • 在JDK JMX客户端通知层。

    当存在以下两个条件时,遇到此问题的可能性会增加:

    • EM融合中间件控件用于管理大型域,因为它将通知侦听器添加到域运行时MBean服务器。
    • 域中包含显着增加JMX运行时MBean数量的Fusion Middleware产品。这将包括在域中运行的WebLogic Server Runtime MBean Server实例中注册的具有MBean的任何产品; 也就是说,在Administration Server以及所有受管服务器中。(这些产品包括Coherence,SOA Suite,OSB等。)

    要消除此特定扩展问题,请禁用该managed-server-notifications-enabled属性。此配置属性禁用在受管服务器运行时MBean服务器中包含的MBean上定义通知的功能(这些MBean Location=key在ObjectName中包含a )。

    如果禁用了受管服务器通知,则不会保留WebLogic Server和JDK组件中包含的两组用于MBean的ObjectNames。仍然可以在MBeanServerDelegate和本地Domain Runtime MBean Server中包含的MBean上定义通知侦听器。但是,无法将通知侦听器添加到非本地MBean。

    managed-server-notifications-enabled属性可使用WLST如下设置:

    edit()
    startEdit()
    cd("JMX/domain-name")
    cmo.setManagedServerNotificationsEnabled(falseactivate()
    

图4-1域运行时MBean服务器与运行时MBean服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B8HWkOU2-1585640631583)(https://i.loli.net/2019/09/02/XMxvt5Fyk6NTCZL.png)]

“图4-1域运行时MBean服务器与运行时MBean服务器”的说明

仅使用JDK类的远程连接

Oracle建议您使用WebLogic Server类从远程JMX客户端进行连接。但是,远程JMX客户端可以仅使用JDK中的类连接到WebLogic Server JMX代理。为此:

  1. 如果wljmxclient.jarwlclient.jar 不在客户端类路径中:

    1. 为托管MBean的WebLogic Server实例启用IIOP协议。
    2. 将默认IIOP用户配置为具有管理员权限的WebLogic Server用户。

    请参阅启用和配置IIOP的Oracle WebLogic Server管理控制台联机帮助

    如果wljmxclient.jarwlclient.jar 在客户端类路径中,没有必要启用默认IIOP用户。转到第2步。

    注意:

    wlclient.jar中包含wljmxclient.jar的清单类路径条目,所以wlclient.jarwljmxclient.jar需要在同一目录下,或者两者罐需要在类路径中指定。

    如果包含,请确保包含在类路径中weblogic.jarwlfullclient.jar不包含在类路径中wljmxclient.jar。应该只使用瘦客户端wljmxclient.jar/ wlclient.jar胖客户端wlfullclient.jar,而不是两者的组合。

  2. 在JMX客户端中,javax.management.JMXConnector按如下方式构造对象:

 String hostname ="WLS-host"
 int port = WLS-port 
 String protocol ="iiop";
 String jndiroot = new String"/ jndi / iiop://"+ hostname +":"+ 
        port +"/";
 String mserver =" MBean-server-JNDI-name ";
 JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname, port, jndiroot + mserver);
 Hashtable h = new Hashtable();
 h.put(Context.SECURITY_PRINCIPAL,username);
 h.put(Context.SECURITY_CREDENTIALS,password);
 connector = JMXConnectorFactory.connect(serviceURL,h); 

其中*WLS-hostWLS-port是WebLogic Server实例的侦听地址和侦听端口,并且MBean-server-JNDI-name*是表4-1中列出的值之一。

请注意,您创建的哈希表不包含协议包的名称。通过将此值保留为null,JMX客户端将使用com.sun.jmx.remote.protocol包中的协议定义,该定义位于JDK中。

与Runtime MBean Server建立本地连接

本地客户端可以通过JNDI树访问WebLogic Server实例的Runtime MBean Server,而不是构造JMXServiceURL对象。

注意:

本地客户端还可以通过JNDI树访问WebLogic Server的域运行时MBean服务器,如在域运行时MBean服务器的本地连接中所述

从JNDI访问时,Runtime MBean Server返回其javax.management.MBeanServer接口。此接口包含接口中的所有方法MBeanServerConnection以及其他方法,例如registerMBean()本地进程可用于注册自定义MBean的方法。(参见MBeanServerJAVA SE 8 API规范http://docs.oracle.com/javase/8/docs/api/javax/management/MBeanServer.html。)

如果JMX客户机的类位于Java EE模块(例如EJB或Web应用程序)中,则Runtime MBeanServer的JNDI名称为:

java:comp/weblogic/jmx/runtime

例如:

InitialContext ctx = new InitialContext();
server =(MBeanServer)ctx.lookup("java:comp / weblogic / jmx / runtime"; 

如果JMX客户机的类不是Java EE模块的一部分,则Runtime MBean Server的JNDI名称为:

java:comp/jmx/runtime

注意:
Java EE规范不允许应用程序服务器自动创建JNDI绑定java:comp/env namespace。因此,启动WebLogic Server 12.2.1时,以下新绑定将替换现有java:comp/env/jmx绑定:

  • java:comp/weblogic/jmx/runtime 取代 java:comp/env/jmx/runtime
  • java:comp/weblogic/jmx/domainRuntime 取代 java:comp/env/jmx/domainRuntime
  • java:comp/weblogic/jmx/edit 取代 java:comp/env/jmx/edit
    java:comp/env/jmx/runtimejava:comp/env/jmx/domainRuntime以及java:comp/env/jmx/edit结合仍然存在。但是,如果您尝试使用JNDI接口列出它们,则无法看到它们。访问这些不推荐使用的绑定的应用程序可以通过查找绑定在那里的对象来查找绑定。

与Domain Runtime MBean Server建立本地连接

本地客户端还可以通过JNDI树访问WebLogic Server实例的Domain Runtime MBean Server,而不是构造JMXServiceURL对象。

从JNDI访问时,Runtime MBean Server返回其javax.management.MBeanServer接口。此接口包含MBeanServerConnection的所有方法界面以及其它方法,例如registerMBean(),其中一个本地进程可以使用它来注册自定义MBean,和其他方法,如getMBeanCount()instatiate()getClassLoader()。(参见MBeanServerJAVA SE 8 API规范http://docs.oracle.com/javase/8/docs/api/javax/management/MBeanServer.html。)

注意:
作为最佳实践,Oracle建议您仅将Domain Runtime MBean Server用于执行域范围操作的MBean。您应该确保任何MBean处理和网络活动不会降低Administration Server的速度并阻止它处理管理操作。

如果JMX客户机的类位于Java EE模块(例如EJB或Web应用程序)中,则域运行时MBeanServer的JNDI名称为:

java:comp/weblogic/jmx/domainRuntime

例如:

InitialContext ctx = new InitialContext();
server =(MBeanServer)ctx.lookup("java:comp / weblogic / jmx / domainRuntime"; 

如果JMX客户机的类不是Java EE模块的一部分,那么Domain Runtime MBean Server的JNDI名称为:

java:comp/jmx/domainRuntime

域运行时MBean服务器仅存在于管理服务器上。由于该ctx.lookup()调用返回对本地MBeanServer的引用,因此只能在Administration Server上运行时调用lookup方法。如果在受管服务器上运行时调用,NameNotFound则会引发异常。

导航MBean层次结构

WebLogic Server在分层数据模型中组织其MBean。(请参阅WebLogic Server MBean数据模型。)在此模型中,所有父MBean都包含包含其子项的对象名称的属性。您可以在标准JMX API中使用子对象名来获取或设置子MBean属性的值或调用其方法。

要导航WebLogic Server MBean层次结构:

  1. 启动与MBean服务器的连接。

    请参阅上一节“与MBean服务器建立远程连接”

    启动连接将返回类型的对象

javax.management.MBeanServerConnection
  1. 通过调用,在MBean层次结构的根目录中获取MBean的对象名称MBeanServerConnectiongetAttribute(ObjectName object-name,方法在哪里:String attribute)

    • *object-name*表示在MBean服务器中注册的服务MBean的对象名称。(参见Service MBeans。)

      表2-3描述了每种类型的MBean服务器中可用的服务MBean的类型。

    • attribute 表示包含根MBean的服务MBean属性的名称。

  2. 连续调用类似于以下内容的代码:

    ObjectName on = 
    MBeanServerConnection.getAttribute(object-name,attribute) 
    

    在上面的语法中:

    • object-name 表示MBean层次结构中当前节点(MBean)的对象名称。
    • *attribute*表示当前MBean中包含一个或多个子MBean实例的属性的名称。如果属性包含多个子节点,请将输出分配给对象名称数组ObjectName[]

要确定MBean层次结构中MBean的位置,请参阅Oracle WebLogic Server的MBean Reference中的MBean描述。对于每个MBean,Oracle WebLogic ServerMBean Reference列出包含当前MBean的工厂方法的父MBean。对于工厂方法不公开的MBean,Oracle WebLogic ServerMBean Reference列出了可以从中访问当前MBean的其他MBean。

表2-3服务MBean

MBean
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JMX(Java Management Extensions)提供了一种标准的方式来管理Java应用程序。MBean是JMX的核心概念之一,它是一种管理Bean的方式,允许运行时动态地管理和监控Java应用程序。MBean可以分为两种类型:开放类型和封闭类型。 开放类型的MBean是一种非常灵活的MBean,它允许在运行时动态地定义属性和操作,并且可以通过JMX远程访问这些属性和操作。开放类型的MBean通常用于管理和监控非常动态的Java应用程序,例如Web应用程序、消息系统、集群系统等。 开放类型的MBean可以通过实现javax.management.DynamicMBean接口来创建。DynamicMBean接口定义了一组方法,包括getMBeanInfo()、getAttribute()、setAttribute()、invoke()等,这些方法允许动态地定义和访问MBean的属性和操作。 下面是一个示例代码,演示如何创建一个开放类型的MBean: ```java import javax.management.*; public class MyDynamicMBean implements DynamicMBean { private String message; public void setMessage(String message) { this.message = message; } public String getMessage() { return message; } public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException { if (attribute.equals("message")) { return message; } else { throw new AttributeNotFoundException(attribute); } } public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException { if (attribute.getName().equals("message")) { message = (String) attribute.getValue(); } else { throw new AttributeNotFoundException(attribute.getName()); } } public Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException, ReflectionException { if (actionName.equals("printMessage")) { System.out.println(message); return null; } else { throw new ReflectionException(new NoSuchMethodException(actionName), "Cannot find the operation " + actionName); } } public MBeanInfo getMBeanInfo() { MBeanAttributeInfo[] attributes = new MBeanAttributeInfo[] { new MBeanAttributeInfo("message", "java.lang.String", "The message", true, true, false) }; MBeanOperationInfo[] operations = new MBeanOperationInfo[] { new MBeanOperationInfo("printMessage", "Print the message", null, "void", MBeanOperationInfo.ACTION) }; return new MBeanInfo(getClass().getName(), "My Dynamic MBean", attributes, null, operations, null); } } ``` 在上面的代码中,我们实现了一个MyDynamicMBean类,并实现了DynamicMBean接口中的方法。该MBean只有一个message属性和一个printMessage操作,它们都是动态定义的,可以在运行时动态地修改和访问。 要注册和访问该MBean,可以使用JMX API提供的方法,例如: ```java MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("com.example:type=MyDynamicMBean"); MyDynamicMBean mbean = new MyDynamicMBean(); mbs.registerMBean(mbean, name); ``` 以上代码将该MBean注册到JMX MBeanServer中,并指定一个ObjectName用于访问该MBean。其他的Java应用程序或工具可以使用JMX API来访问该MBean,并动态地修改和访问其属性和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值