精华内容
下载资源
问答
  • 使用JMX访问WebLogic Server MBean 本章介绍如何从JMX客户端访问WebLogic Server MBean。它解释了如何为远程客户端设置类路径; 如何与MBean服务器建立本地和远程连接; 以及如何导航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 Server 服务MBean JMX对象名称:
    Domain Runtime MBean Server DomainRuntimeServiceMBean提供对域范围服务(如应用程序部署,JMS服务器和JDBC数据源)的MBean的访问。它也是访问域中所有服务器的所有运行时MBean和所有活动配置MBean的层次结构的单一点。见DomainRuntimeServiceMBeanMBean引用的Oracle WebLogic服务器 com.bea:Name=DomainRuntimeService, Type=weblogic.management. mbeanservers.domainruntime. DomainRuntimeServiceMBean
    Runtime MBean Servers RuntimeServiceMBean提供对当前服务器的运行时MBean和活动配置MBean的访问。见RuntimeServiceMBeanMBean引用的Oracle WebLogic服务器 `com.bea:Name=RuntimeService,

    Type=weblogic.management.
    mbeanservers.runtime.
    RuntimeServiceMBean | | Edit MBean Server |EditServiceMBean提供管理当前WebLogic Server域配置的入口点。见[EditServiceMBean](https://docs.oracle.com/middleware/12213/wls/WLMBR/mbeans/EditServiceMBean.html)在*MBean引用的Oracle WebLogic服务器*。 |com.bea:Name=EditService,
    Type=weblogic.management.
    mbeanservers.edit.
    EditServiceMBean ` |

    示例:打印服务器的名称和状态

    示例4-2中的代码示例连接到域运行时MBean服务器,并使用它DomainRuntimeServiceMBean来获取ServerRuntimeMBean域中每个的对象名称。然后它检索并打印每个服务器ServerRuntimeMBean``NameState属性的值。

    请注意以下有关示例4-2中的代码:

    • 除了connectionconnector全局变量,类分配为WebLogic Server服务MBean在一个全局变量的对象名称。类中的方法将经常使用此对象名,一旦定义它就不需要更改。
    • printServerRuntimes()方法获取DomainRuntimeServiceMBean ServerRuntimes属性的值,该属性包含ServerRuntimeMBean域中所有实例的数组。(见DomainRuntimeServiceMBeanMBean引用的Oracle WebLogic服务器。)

    示例4-2示例:打印服务器的名称和状态

    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.util.Hashtable;
    import javax.management.MBeanServerConnection;
    import javax.management.MalformedObjectNameException;
    import javax.management.ObjectName;
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import javax.management.remote.JMXServiceURL;
    import javax.naming.Context;
    
    public class PrintServerState {
    
     private static MBeanServerConnection connection;
     private static JMXConnector connector;
     private static final ObjectName service;
    
     // 初始化DomainRuntimeServiceMBean的对象名
     // 这样可以通过类使用此对象名。
     static {
         try {
             service = new ObjectName("com.bea:Name=DomainRuntimeService," +
             "Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean");
         } catch (MalformedObjectNameException e) {
             throw new AssertionError(e.getMessage());
         }
     }
    
     /*
      * 实例化与 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");
         connector = JMXConnectorFactory.connect(serviceURL, h);
         connection = connector.getMBeanServerConnection();
     }
    
     /*
      * 打印ServerRuntimeMBeans数组。
      * 此MBean是运行时MBean层次结构的根,并且
      * 域中的每个服务器都承载其自己的实例。
      */
     public static ObjectName[] getServerRuntimes() throws Exception {
         return (ObjectName[]) connection.getAttribute(service,
                 "ServerRuntimes");
     }
    
     /*
      * 遍历ServerRuntimeMBeans并获取名称和状态
      */
     public void printNameAndState() throws Exception {
         ObjectName[] serverRT = getServerRuntimes();
         System.out.println("-------------------获取运行服务------------------------");
         int length = (int) serverRT.length;
         for (int i = 0; i < length; i++) {
             String name = (String) connection.getAttribute(serverRT[i],
                     "Name");
             String state = (String) connection.getAttribute(serverRT[i],
                     "State");
             System.out.println("Server name: " + name + ".   Server state: "
                     + state);
         }
     }
    
     public static void main(String[] args) throws Exception {
         String hostname = args[0];
         String portString =  args[1];
         String username =  args[2];
         String password =  args[3];
    
         PrintServerState s = new PrintServerState();
         initConnection(hostname, portString, username, password);
         s.printNameAndState();
         connector.close();
     }
    }
    

    示例:监视Servlet

    Web应用程序中的每个servlet都提供ServletRuntimeMBean包含有关servlet运行时状态的信息的实例。(见ServletRuntimeMBeanMBean引用的Oracle WebLogic服务器。)

    在WebLogic Server数据模型中,a的路径ServletRuntimeMBean如下:

    1. Domain Runtime MBean Server(适用于域中所有服务器上的所有servlet),或特定服务器实例上的Runtime MBean Server。

    2. DomainRuntimeServiceMBean或者RuntimeServiceMBeanServerRuntimes属性。

    3. ServerRuntimeMBeanApplicationRuntimes属性。

    4. ApplicationRuntimeMBeanComponentRuntimes属性。

      ComponentRuntimes属性包含许多类型的组件运行时MBean,其中一个是WebAppComponentRuntimeMBean。获取此属性的值后,可以使用子MBean的Type属性来获取特定类型的组件运行时MBean。

    5. WebAppComponentRuntimeMBeanServletRuntimes属性。

    示例4-3监视Servlet

    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.util.Hashtable;
    
    import javax.management.MBeanServerConnection;
    import javax.management.MalformedObjectNameException;
    import javax.management.ObjectName;
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import javax.management.remote.JMXServiceURL;
    import javax.naming.Context;
    
    public class MonitorServlets {
       private static MBeanServerConnection connection;
       private static JMXConnector connector;
       private static final ObjectName service;
    
       // Initializing the object name for DomainRuntimeServiceMBean
       // so it can be used throughout the class.
       static {
          try {
             service = new ObjectName(
              "com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanser"+
               "vers.domainruntime.DomainRuntimeServiceMBean");
          }catch (MalformedObjectNameException e) {
             throw new AssertionError(e.getMessage());
          }
       }
    
       /*
       * Initialize connection to the 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");
          connector = JMXConnectorFactory.connect(serviceURL, h);
          connection = connector.getMBeanServerConnection();
       }
    
       /*
       * Get an array of ServerRuntimeMBeans
       */
       public static ObjectName[] getServerRuntimes() throws Exception {
          return (ObjectName[]) connection.getAttribute(service,
             "ServerRuntimes");
       }
    
       /*
       * Get an array of WebAppComponentRuntimeMBeans
       */
       public void getServletData() throws Exception {
          ObjectName[] serverRT = getServerRuntimes();
          int length = (int) serverRT.length;
          for (int i = 0; i < length; i++) {
             ObjectName[] appRT = 
                (ObjectName[]) connection.getAttribute(serverRT[i],
                "ApplicationRuntimes");
             int appLength = (int) appRT.length;
             for (int x = 0; x < appLength; x++) {
                System.out.println("Application name: " +
                  (String)connection.getAttribute(appRT[x], "Name"));
                ObjectName[] compRT = 
                   (ObjectName[]) connection.getAttribute(appRT[x],
                   "ComponentRuntimes");
                int compLength = (int) compRT.length;
                for (int y = 0; y < compLength; y++) {
                   System.out.println("  Component name: " +
                     (String)connection.getAttribute(compRT[y], "Name"));
                   String componentType = 
                      (String) connection.getAttribute(compRT[y], "Type");
                   System.out.println(componentType.toString());
                   if (componentType.toString().equals("WebAppComponentRuntime")){
                      ObjectName[] servletRTs = (ObjectName[])
                         connection.getAttribute(compRT[y], "Servlets");
                      int servletLength = (int) servletRTs.length;
                      for (int z = 0; z < servletLength; z++) {
                         System.out.println("    Servlet name: " +
                            (String)connection.getAttribute(servletRTs[z],
                             "Name"));
                         System.out.println("      Servlet context path: " +
                            (String)connection.getAttribute(servletRTs[z],
                             "ContextPath"));
                         System.out.println("       Invocation Total Count : " +
                            (Object)connection.getAttribute(servletRTs[z],
                             "InvocationTotalCount"));
                      }
                   }
                }
             }
          }
       }
    
       public static void main(String[] args) throws Exception {
          String hostname = args[0];
          String portString = args[1];
          String username = args[2];
          String password = args[3];
    
          MonitorServlets s = new MonitorServlets();
          initConnection(hostname, portString, username, password);
          s.getServletData();
          connector.close();
       }
    }
    

    示例4-3中的代码导航前面段落中描述的层次结构并获取ServletRuntimeMBean属性值。

    使用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-6IaC2rQe-1585640632754)(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 Server 服务MBean JMX对象名称:
    Domain Runtime MBean Server DomainRuntimeServiceMBean提供对域范围服务(如应用程序部署,JMS服务器和JDBC数据源)的MBean的访问。它也是访问域中所有服务器的所有运行时MBean和所有活动配置MBean的层次结构的单一点。见DomainRuntimeServiceMBeanMBean引用的Oracle WebLogic服务器 com.bea:Name=DomainRuntimeService, Type=weblogic.management. mbeanservers.domainruntime. DomainRuntimeServiceMBean
    Runtime MBean Servers RuntimeServiceMBean提供对当前服务器的运行时MBean和活动配置MBean的访问。见RuntimeServiceMBeanMBean引用的Oracle WebLogic服务器 `com.bea:Name=RuntimeService,

    Type=weblogic.management.
    mbeanservers.runtime.
    RuntimeServiceMBean | | Edit MBean Server |EditServiceMBean提供管理当前WebLogic Server域配置的入口点。见[EditServiceMBean](https://docs.oracle.com/middleware/12213/wls/WLMBR/mbeans/EditServiceMBean.html)在*MBean引用的Oracle WebLogic服务器*。 |com.bea:Name=EditService,
    Type=weblogic.management.
    mbeanservers.edit.
    EditServiceMBean ` |

    示例:打印服务器的名称和状态

    示例4-2中的代码示例连接到域运行时MBean服务器,并使用它DomainRuntimeServiceMBean来获取ServerRuntimeMBean域中每个的对象名称。然后它检索并打印每个服务器ServerRuntimeMBean``NameState属性的值。

    请注意以下有关示例4-2中的代码:

    • 除了connectionconnector全局变量,类分配为WebLogic Server服务MBean在一个全局变量的对象名称。类中的方法将经常使用此对象名,一旦定义它就不需要更改。
    • printServerRuntimes()方法获取DomainRuntimeServiceMBean ServerRuntimes属性的值,该属性包含ServerRuntimeMBean域中所有实例的数组。(见DomainRuntimeServiceMBeanMBean引用的Oracle WebLogic服务器。)

    示例4-2示例:打印服务器的名称和状态

    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.util.Hashtable;
    import javax.management.MBeanServerConnection;
    import javax.management.MalformedObjectNameException;
    import javax.management.ObjectName;
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import javax.management.remote.JMXServiceURL;
    import javax.naming.Context;
    
    public class PrintServerState {
    
     private static MBeanServerConnection connection;
     private static JMXConnector connector;
     private static final ObjectName service;
    
     // 初始化DomainRuntimeServiceMBean的对象名
     // 这样可以通过类使用此对象名。
     static {
         try {
             service = new ObjectName("com.bea:Name=DomainRuntimeService," +
             "Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean");
         } catch (MalformedObjectNameException e) {
             throw new AssertionError(e.getMessage());
         }
     }
    
     /*
      * 实例化与 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");
         connector = JMXConnectorFactory.connect(serviceURL, h);
         connection = connector.getMBeanServerConnection();
     }
    
     /*
      * 打印ServerRuntimeMBeans数组。
      * 此MBean是运行时MBean层次结构的根,并且
      * 域中的每个服务器都承载其自己的实例。
      */
     public static ObjectName[] getServerRuntimes() throws Exception {
         return (ObjectName[]) connection.getAttribute(service,
                 "ServerRuntimes");
     }
    
     /*
      * 遍历ServerRuntimeMBeans并获取名称和状态
      */
     public void printNameAndState() throws Exception {
         ObjectName[] serverRT = getServerRuntimes();
         System.out.println("-------------------获取运行服务------------------------");
         int length = (int) serverRT.length;
         for (int i = 0; i < length; i++) {
             String name = (String) connection.getAttribute(serverRT[i],
                     "Name");
             String state = (String) connection.getAttribute(serverRT[i],
                     "State");
             System.out.println("Server name: " + name + ".   Server state: "
                     + state);
         }
     }
    
     public static void main(String[] args) throws Exception {
         String hostname = args[0];
         String portString =  args[1];
         String username =  args[2];
         String password =  args[3];
    
         PrintServerState s = new PrintServerState();
         initConnection(hostname, portString, username, password);
         s.printNameAndState();
         connector.close();
     }
    }
    

    示例:监视Servlet

    Web应用程序中的每个servlet都提供ServletRuntimeMBean包含有关servlet运行时状态的信息的实例。(见ServletRuntimeMBeanMBean引用的Oracle WebLogic服务器。)

    在WebLogic Server数据模型中,a的路径ServletRuntimeMBean如下:

    1. Domain Runtime MBean Server(适用于域中所有服务器上的所有servlet),或特定服务器实例上的Runtime MBean Server。

    2. DomainRuntimeServiceMBean或者RuntimeServiceMBeanServerRuntimes属性。

    3. ServerRuntimeMBeanApplicationRuntimes属性。

    4. ApplicationRuntimeMBeanComponentRuntimes属性。

      ComponentRuntimes属性包含许多类型的组件运行时MBean,其中一个是WebAppComponentRuntimeMBean。获取此属性的值后,可以使用子MBean的Type属性来获取特定类型的组件运行时MBean。

    5. WebAppComponentRuntimeMBeanServletRuntimes属性。

    示例4-3监视Servlet

    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.util.Hashtable;
    
    import javax.management.MBeanServerConnection;
    import javax.management.MalformedObjectNameException;
    import javax.management.ObjectName;
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import javax.management.remote.JMXServiceURL;
    import javax.naming.Context;
    
    public class MonitorServlets {
       private static MBeanServerConnection connection;
       private static JMXConnector connector;
       private static final ObjectName service;
    
       // Initializing the object name for DomainRuntimeServiceMBean
       // so it can be used throughout the class.
       static {
          try {
             service = new ObjectName(
              "com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanser"+
               "vers.domainruntime.DomainRuntimeServiceMBean");
          }catch (MalformedObjectNameException e) {
             throw new AssertionError(e.getMessage());
          }
       }
    
       /*
       * Initialize connection to the 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");
          connector = JMXConnectorFactory.connect(serviceURL, h);
          connection = connector.getMBeanServerConnection();
       }
    
       /*
       * Get an array of ServerRuntimeMBeans
       */
       public static ObjectName[] getServerRuntimes() throws Exception {
          return (ObjectName[]) connection.getAttribute(service,
             "ServerRuntimes");
       }
    
       /*
       * Get an array of WebAppComponentRuntimeMBeans
       */
       public void getServletData() throws Exception {
          ObjectName[] serverRT = getServerRuntimes();
          int length = (int) serverRT.length;
          for (int i = 0; i < length; i++) {
             ObjectName[] appRT = 
                (ObjectName[]) connection.getAttribute(serverRT[i],
                "ApplicationRuntimes");
             int appLength = (int) appRT.length;
             for (int x = 0; x < appLength; x++) {
                System.out.println("Application name: " +
                  (String)connection.getAttribute(appRT[x], "Name"));
                ObjectName[] compRT = 
                   (ObjectName[]) connection.getAttribute(appRT[x],
                   "ComponentRuntimes");
                int compLength = (int) compRT.length;
                for (int y = 0; y < compLength; y++) {
                   System.out.println("  Component name: " +
                     (String)connection.getAttribute(compRT[y], "Name"));
                   String componentType = 
                      (String) connection.getAttribute(compRT[y], "Type");
                   System.out.println(componentType.toString());
                   if (componentType.toString().equals("WebAppComponentRuntime")){
                      ObjectName[] servletRTs = (ObjectName[])
                         connection.getAttribute(compRT[y], "Servlets");
                      int servletLength = (int) servletRTs.length;
                      for (int z = 0; z < servletLength; z++) {
                         System.out.println("    Servlet name: " +
                            (String)connection.getAttribute(servletRTs[z],
                             "Name"));
                         System.out.println("      Servlet context path: " +
                            (String)connection.getAttribute(servletRTs[z],
                             "ContextPath"));
                         System.out.println("       Invocation Total Count : " +
                            (Object)connection.getAttribute(servletRTs[z],
                             "InvocationTotalCount"));
                      }
                   }
                }
             }
          }
       }
    
       public static void main(String[] args) throws Exception {
          String hostname = args[0];
          String portString = args[1];
          String username = args[2];
          String password = args[3];
    
          MonitorServlets s = new MonitorServlets();
          initConnection(hostname, portString, username, password);
          s.getServletData();
          connector.close();
       }
    }
    

    示例4-3中的代码导航前面段落中描述的层次结构并获取ServletRuntimeMBean属性值。

    展开全文
  • 使用 JMX 访问 WebLogic Server MBean

    千次阅读 2009-11-20 15:28:00
    http://edocs.weblogicfans.net/wls/docs92/jmx/accessWLS.html JMX 访问 WebLogic Server MBean ,这个听不容易找的,呵呵,大家看看吧 使用 JMX 访问 WebLogic Server MBean 下列部分描述如何从 JMX 客户端访问 ...

     http://edocs.weblogicfans.net/wls/docs92/jmx/accessWLS.html

     

     

    JMX 访问 WebLogic Server MBean  ,这个听不容易找的,呵呵,大家看看吧

     

     

    使用 JMX 访问 WebLogic Server MBean

    下列部分描述如何从 JMX 客户端访问 WebLogic Server MBean:

     


    为远程客户端设置类路径

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

    WL_HOME/lib/wljmxclient.jar

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

    此 JAR 包含 BEA 对 HTTP 和 IIOP 协议及其专用 T3 协议的实现。通过 BEA 的实现,JMX 客户端随其连接请求发送登录凭据,而 WebLogic Server 安全框架对这些客户端进行身份验证。只有通过身份验证的客户端才能访问在 WebLogic Server MBean 服务器中注册的 MBean。

    注意: 尽管 BEA 建议您使用它对 HTTP 和 IIOP 协议或其专用 T3 协议的实现,但是 JMX 客户端可以使用在标准 JDK 中定义的 IIOP 协议。请参阅仅使用 JDK 类的远程连接

     


    建立到 MBean 服务器的远程连接

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

    要连接到 WebLogic MBean 服务器,请执行下列操作:

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

      将下列参数值传递给构造方法(请参阅“J2SE 5.0 API Specification”中的 JMXServiceURL):

      • 作为与 MBean 服务器通信所用协议的下列值之一:
        t3t3shttphttpsiiopiiops
      • 承载 MBean 服务器的 WebLogic Server 实例的监听地址
      • WebLogic Server 实例的监听端口
      • MBean 服务器的绝对 JNDI 名称。JNDI 名称必须以 /jndi/ 开头,且后跟表 4-1 中所述的 JNDI 名称之一。
    2. 构造 javax.management.remote.JMXConnector 对象。此对象包含 JMX 客户端用来连接到 MBean 服务器的方法。

      JMXConnector 的构造方法如下:javax.management.remote.JMXConnectorFactory.
      connector(JMXServiceURL
      serviceURL, Map<String,?> environment)

      将下列参数值传递给构造方法(请参阅“J2SE 5.0 API Specification”中的 JMXConnectorFactory):

      • 在上一步中创建的 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 客户端必须在其类路径上包括此包中的类。请参阅为远程客户端设置类路径

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

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

      MBeanServerConnection 对象是到 WebLogic MBean 服务器的连接。可以将它用于本地连接和远程连接。请参阅“J2SE 5.0 API Specification”中的 MBeanServerConnection

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

    示例:连接到 Domain Runtime MBean Server

    请注意有关清单 4-1 中代码的下列信息:

    • 类使用全局变量 connectionconnector 来表示到 MBean 服务器的连接。对于每个类实例,应该仅调用一次 initConnection() 方法(它将值分配给 connectionconnector 变量),以建立可以在类内重用的单个连接。
    • initConnection() 方法采用用户名和密码(以及服务器的监听地址和监听端口)作为参数,在实例化类时传递这些参数。BEA 建议使用此方法,因为它阻止代码包含未加密的用户凭据。包含这些参数的 String 对象将由 JVM 的垃圾收集例程破坏并从内存中删除。
    • 类在完成其工作后,调用 JMXConnector.close() 关闭到 MBean 服务器的连接。(请参阅“J2SE 5.0 API Specification”中的 JMXConnector。)
      清单 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");
            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 服务器

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

    • 要修改域的配置,请使用 Edit MBean Server。
    • 要监视对配置 MBean 的待定层次结构的更改,请使用 Edit MBean Server。
    • 要仅监视活动的配置 MBean(而不监视运行时 MBean),请使用 Runtime MBean Server。

      通过 Runtime MBean Server 进行监视需要的内存和网络流量,比通过 Domain Runtime MBean Server 进行监视的小。(WebLogic Server 在客户端请求连接到它时才初始化 Domain Runtime MBean Server。)

      在大多数情况下,域中的所有服务器实例具有一组相同的配置数据,因此不管在管理服务器上还是在受管服务器监视 Runtime MBean Server 都无关紧要。但是,如果所做的更改使服务器在重新启动后才能继续工作,则该服务器将不再接受任何更改,这样其配置数据可能会过时。在这种情况下,监视此服务器的 Runtime MBean Server 仅指示特定服务器实例的配置。要了解更改 WebLogic Server 域并激活更改的过程,请参阅“了解域配置”中的管理配置更改

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

      如果您向 Domain Runtime MBean Server 中的 MBean 注册 JMX 监听器和筛选器,则 JMX 筛选器与它所监视的 MBean 运行在同一个 JVM 中。例如,如果向受管服务器上的 MBean 注册筛选器,则该筛选器运行在受管服务器上,并仅将满足筛选条件的消息转发到监听器。

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

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

        通过 Domain Runtime MBean Server 定向所有 JMX 请求时,由于网络滞后和内存使用的增加而导致性能稍微下降。直接连接到每个受管服务器的 Runtime MBean Server 读取 MBean 值,可消除 Domain Runtime MBean Server 为了从受管服务器检索值而建立的网络跃点。但是,对于大多数网络拓扑和性能要求,Domain Runtime MBean Server 启用的简化代码维护和增强安全性更为可取。

        图 4-1 Domain Runtime MBean Server 与 Runtime MBean Server


        Domain Runtime MBean Server 与 Runtime MBean Server

    仅使用 JDK 类的远程连接

    BEA 建议您使用 WebLogic Server 类从远程 JMX 客户端进行连接。但是,远程 JMX 客户端可能仅使用 JDK 中的类连接到 WebLogic Server JMX 代理。为此,请执行下列操作:

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

      请参阅“管理控制台联机帮助”中的启用和配置 IIOP

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

      String hostname = "WLS-host"
      int port =
      WLS-port
      String protocol = "rmi";
      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 树而不是构造 JMXServiceURL 对象,访问 WebLogic Server 实例的 Runtime MBean Server。只有 Runtime MBean Server 在 JNDI 树中注册自身。

    从 JNDI 进行访问时,Runtime MBean Server 返回其 javax.management.MBeanServer 接口。此接口包含 MBeanServerConnection 接口中的所有方法以及诸如 registerMBean()(本地进程可以使用它注册自定义 MBean)之类的其他方法。(请参阅“J2SE 5.0 API Specification”中的 MBeanServer。)

    如果 JMX 客户端的类位于企业应用程序的顶层(即,如果它们是从应用程序的 APP-INF 目录部署的),则 Runtime MBean Server 的 JNDI 名称是:
    java:comp/env/jmx/runtime

    如果 JMX 客户端的类位于 J2EE 模块(如 EJB 或 Web 应用程序)中,则 Runtime MBeanServer 的 JNDI 名称是:
    java:comp/jmx/runtime

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

     


    在 MBean 层次结构中导航

    WebLogic Server 用一种层次数据模型来组织自己的 MBean。(请参阅 WebLogic Server MBean 数据模型。)在此模型中,所有父 MBean 都包括包含其子级的对象名的特性。在标准 JMX API 中使用子级的对象名,可获取或设置子 MBean 的特性值或者调用其方法。

    要在 WebLogic Server MBean 层次结构中导航,请执行下列操作:

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

      请参阅上一部分:建立到 MBean 服务器的远程连接

      启动连接将返回
      javax.management.MBeanServerConnection 类型的对象。

    2. 通过调用 MBeanServerConnection.getAttribute(ObjectName object-name,
      String
      attribute) 方法,获取 MBean 层次结构根部 MBean 的对象名,其中:
      • object-name 是在 MBean 服务器中注册的服务 MBean 的对象名。(请参阅服务 MBean。)

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

      • attribute 是包含根 MBean 的服务 MBean 特性的名称。
    3. 相继调用与下列内容类似的代码:
      ObjectName on =
      MBeanServerConnection
      .getAttribute(object-name, attribute)
      其中:
      • object-name 是 MBean 层次结构中当前节点 (MBean) 的对象名。
      • attribute 是包含子 MBean 的一个或多个实例的当前 MBean 中特性的名称。如果该特性包含多个子级,则将输出分配给对象名数组 ObjectName[]

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

     


    示例:输出服务器的名称和状态

    清单 4-2 中的代码示例连接到 Domain Runtime MBean Server,并使用 DomainRuntimeServiceMBean 为域中的每个 ServerRuntimeMBean 获取对象名。然后,它检索并输出每个服务器的 ServerRuntimeMBean NameState 特性的值。

    请注意有关清单 4-2 中代码的下列信息:

    • 除了 connectionconnector 全局变量外,类将 WebLogic Server 服务 MBean 的对象名分配给一个全局变量。类内的方法将频繁使用此对象名,它在定义后不需要更改。
    • printServerRuntimes() 方法获取 DomainRuntimeServiceMBean ServerRuntimes 特性的值,该特性包含域中所有 ServerRuntimeMBean 实例的数组。(请参阅“WebLogic Server MBean Reference”中的 DomainRuntimeServiceMBean。)
      清单 4-2 示例:输出服务器的名称和状态
      import java.io.IOException;
      import java.net.MalformedURLException;
      import java.util.Hashtable;
      import javax.management.MBeanServerConnection;
      import javax.management.MalformedObjectNameException;
      import javax.management.ObjectName;
      import javax.management.remote.JMXConnector;
      import javax.management.remote.JMXConnectorFactory;
      import javax.management.remote.JMXServiceURL;
      import javax.naming.Context;
      public class PrintServerState {
         private static MBeanServerConnection connection;
         private static JMXConnector connector;
         private static final ObjectName service;
         // 实例化 DomainRuntimeServiceMBean 对象名
         // 这样可以通过类使用此对象名。
         static {
            try {
               service = new ObjectName(
                  "com.bea:Name=DomainRuntimeService,Type=weblogic.management.
                   mbeanservers.domainruntime.DomainRuntimeServiceMBean");
            }catch (MalformedObjectNameException e) {
               throw new AssertionError(e.getMessage());
            }
         }
         /*
         * 实例化与 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");
            connector = JMXConnectorFactory.connect(serviceURL, h);
            connection = connector.getMBeanServerConnection();
         }
         /* 
         * 打印一组 ServerRuntimeMBeans。
         * 此 MBean 是运行时 MBean 层次的根,
         * 此域中的每个服务器承载自己的实例。
         */
         public static ObjectName[] getServerRuntimes() throws Exception {
            return (ObjectName[]) connection.getAttribute(service,
               "ServerRuntimes");
         }
         /* 
         * 迭代 ServerRuntimeMBean,获取名称和状态
         */
         public void printNameAndState() throws Exception {
            ObjectName[] serverRT = getServerRuntimes();
            System.out.println("got server runtimes");
            int length = (int) serverRT.length;
            for (int i = 0; i < length; i++) {
               String name = (String) connection.getAttribute(serverRT[i],
                  "Name");
               String state = (String) connection.getAttribute(serverRT[i],
                  "State");
               System.out.println("Server name: " + name + ".Server state: "
                  + state);
            }
         }
         public static void main(String[] args) throws Exception {
            String hostname = args[0];
            String portString = args[1];
            String username = args[2];
            String password = args[3];
            PrintServerState s = new PrintServerState();
            initConnection(hostname, portString, username, password);
            s.printNameAndState();
            connector.close();
         }
      }

     


    示例:监视 Servlet

    Web 应用程序中的每个 servlet 提供 ServletRuntimeMBean(包含有关 servlet 的运行时状态的信息)的实例。(请参阅“WebLogic Server MBean Reference”中的 ServletRuntimeMBean。)

    在 WebLogic Server 数据模型中,ServletRuntimeMBean 的路径如下:

    1. Domain Runtime MBean Server(用于域中所有服务器上的所有 servlet)或特定服务器实例上的 Runtime MBean Server。
    2. DomainRuntimeServiceMBeanRuntimeServiceMBeanServerRuntimes 特性。
    3. ServerRuntimeMBeanApplicationRuntimes 特性。
    4. ApplicationRuntimeMBeanComponentRuntimes 特性。

      ComponentRuntimes 特性包含许多类型的组件运行时 MBean,其中一种是 WebAppComponentRuntimeMBean。在获取此特性的值时,使用子 MBean 的 Type 特性可以获取特定类型的组件运行时 MBean。

    5. WebAppComponentRuntimeMBeanServletRuntimes 特性。

    清单 4-3 中的代码在上文中所述的层次结构中导航,并获取 ServletRuntimeMBean 特性的值。

    清单 4-3 监视 Servlet

    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.util.Hashtable;

    import javax.management.MBeanServerConnection;
    import javax.management.MalformedObjectNameException;
    import javax.management.ObjectName;
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import javax.management.remote.JMXServiceURL;
    import javax.naming.Context;

    public class MonitorServlets {
       private static MBeanServerConnection connection;
       private static JMXConnector connector;
       private static final ObjectName service;

       // 实例化 DomainRuntimeServiceMBean 的对象名
       // 因此可以通过类使用此对象名。
       static {
          try {
             service = new ObjectName(
              "com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanser
               vers.domainruntime.DomainRuntimeServiceMBean");
          }catch (MalformedObjectNameException e) {
             throw new AssertionError(e.getMessage());
          }
       }

       /*
       * 实例化与 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");
          connector = JMXConnectorFactory.connect(serviceURL, h);
          connection = connector.getMBeanServerConnection();
       }

       /*
       * 获取一组 ServerRuntimeMBean
       */
       public static ObjectName[] getServerRuntimes() throws Exception {
          return (ObjectName[]) connection.getAttribute(service,
             "ServerRuntimes");
       }

       /*
       * 获取一组 WebApplicationComponentRuntimeMBean
       */
       public void getServletData() throws Exception {
          ObjectName[] serverRT = getServerRuntimes();
          int length = (int) serverRT.length;
          for (int i = 0; i < length; i++) {
             ObjectName[] appRT =
                (ObjectName[]) connection.getAttribute(serverRT[i],
                "ApplicationRuntimes");
             int appLength = (int) appRT.length;
             for (int x = 0; x < appLength; x++) {
                System.out.println("Application name: " +
                  (String)connection.getAttribute(appRT[x], "Name"));
                ObjectName[] compRT =
                   (ObjectName[]) connection.getAttribute(appRT[x],
                   "ComponentRuntimes");
                int compLength = (int) compRT.length;
                for (int y = 0; y < compLength; y++) {
                   System.out.println(" Component name: " +
                     (String)connection.getAttribute(compRT[y], "Name"));
                   String componentType =
                      (String) connection.getAttribute(compRT[y], "Type");
                   System.out.println(componentType.toString());
                   if (componentType.toString().equals("WebAppComponentRuntime")){
                      ObjectName[] servletRTs = (ObjectName[])
                         connection.getAttribute(compRT[y], "Servlets");
                      int servletLength = (int) servletRTs.length;
                      for (int z = 0; z < servletLength; z++) {
                         System.out.println(" Servlet name: " +
                            (String)connection.getAttribute(servletRTs[z],
                             "Name"));
                         System.out.println(" Servlet context path: " +
                            (String)connection.getAttribute(servletRTs[z],
                             "ContextPath"));
                         System.out.println(" Invocation Total Count : " +
                            (Object)connection.getAttribute(servletRTs[z],
                             "InvocationTotalCount"));
                      }
                   }
                }
             }
          }
       }

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

          MonitorServlets s = new MonitorServlets();
          initConnection(hostname, portString, username, password);
          s.getServletData();
          connector.close();
       }
    }
    展开全文
  • 这是官方文档,很多朋友刚着手监控WebLogic的项目时,并不一定能找到这篇文章,所以很容易深陷...下列部分描述如何从 JMX 客户端访问 WebLogic Server MBean:       为远程客户端设置类路径 如果 JMX ...
    这是官方文档,很多朋友刚着手监控WebLogic的项目时,并不一定能找到这篇文章,所以很容易深陷于互联网的知识海洋而迷茫困惑,这也说明了一个哲理——东西多了不一定是好事。特将此文转载于此,结合该系列的其他文章,希望能给您带来帮助。

     

    下列部分描述如何从 JMX 客户端访问 WebLogic Server MBean:

     

     

     


    为远程客户端设置类路径

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

    WL_HOME\lib\wljmxclient.jar

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

    此 JAR 包含 BEA 对 HTTP 和 IIOP 协议及其专用 T3 协议的实现。通过 BEA 的实现,JMX 客户端随其连接请求发送登录凭据,而 WebLogic Server 安全框架对这些客户端进行身份验证。只有通过身份验证的客户端才能访问在 WebLogic Server MBean 服务器中注册的 MBean。

    注意: 尽管 BEA 建议您使用它对 HTTP 和 IIOP 协议或其专用 T3 协议的实现,但是 JMX 客户端可以使用在标准 JDK 中定义的 IIOP 协议。请参阅仅使用 JDK 类的远程连接

     

     

     


    建立到 MBean 服务器的远程连接

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

    要连接到 WebLogic MBean 服务器,请执行下列操作:

     

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

    将下列参数值传递给构造方法(请参阅 “J2SE 5.0 API Specification”中的 JMXServiceURL ):

    • 作为与 MBean 服务器通信所用协议的下列值之一:
      t3t3shttphttpsiiopiiops
    • 承载 MBean 服务器的 WebLogic Server 实例的监听地址
    • WebLogic Server 实例的监听端口
    • MBean 服务器的绝对 JNDI 名称。JNDI 名称必须以 /jndi/ 开头,且后跟表 4-1 中所述的 JNDI 名称之一。
      1. 构造 javax.management.remote.JMXConnector 对象。此对象包含 JMX 客户端用来连接到 MBean服务器的方法。
        • weblogic.management.remote 包定义可以用于连接到 WebLogic MBean 服务器的协议。远程 JMX 客户端必须在其类路径上包括此包中的类。请参阅为远程客户端设置类路径

    JMXConnector 的构造方法如下:javax.management.remote.JMXConnectorFactory.
    connector(JMXServiceURL
    serviceURL , Map<String,?> environment )

    将下列参数值传递给构造方法(请参阅 “J2SE 5.0 API Specification”中的 JMXConnectorFactory ):

    • 在上一步中创建的 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" 
       
      1. 通过调用 JMXConnector.getMBeanServerConnection() 方法连接到 WebLogic MBean 服务器。

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

    MBeanServerConnection 对象是到 WebLogic MBean 服务器的连接。可以将它用于本地连接和远程连接。请参阅 “J2SE 5.0 API Specification”中的 MBeanServerConnection

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

     

    示例:连接到 Domain Runtime MBean Server

    请注意有关清单 4-1 中代码的下列信息:

     

      • 类使用全局变量 connectionconnector 来表示到 MBean 服务器的连接。对于每个类实例,应该仅调用一次 initConnection() 方法(它将值分配给 connectionconnector 变量),以建立可以在类内重用的单个连接。
      • initConnection() 方法采用用户名和密码(以及服务器的监听地址和监听端口)作为参数,在实例化类时传递这些参数。BEA 建议使用此方法,因为它阻止代码包含未加密的用户凭据。包含这些参数的 String 对象将由 JVM 的垃圾收集例程破坏并从内存中删除。
      • 类在完成其工作后,调用 JMXConnector.close() 关闭到 MBean 服务器的连接。(请参阅 “J2SE 5.0 API Specification”中的 JMXConnector 。)
    清单 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");
    		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 服务器

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

      • 要修改域的配置,请使用 Edit MBean Server。
      • 要监视对配置 MBean 的待定层次结构的更改,请使用 Edit MBean Server。
      • 要仅监视活动的配置 MBean(而不监视运行时 MBean),请使用 Runtime MBean Server。

    通过 Runtime MBean Server 进行监视需要的内存和网络流量,比通过 Domain Runtime MBean Server 进行监视的小。(WebLogic Server 在客户端请求连接到它时才初始化 Domain Runtime MBean Server。)

    在大多数情况下,域中的所有服务器实例具有一组相同的配置数据,因此不管在管理服务器上还是在受管服务器监视 Runtime MBean Server 都无关紧要。但是,如果所做的更改使服务器在重新启动后才能继续工作,则该服务器将不再接受任何更改,这样其配置数据可能会过时。在这种情况下,监视此服务器的 Runtime MBean Server 仅指示特定服务器实例的配置。要了解更改 WebLogic Server 域并激活更改的过程,请参阅 “了解域配置”中的管理配置更改

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

    如果您向 Domain Runtime MBean Server 中的 MBean 注册 JMX 监听器和筛选器,则 JMX 筛选器与它所监视的 MBean 运行在同一个 JVM 中。例如,如果向受管服务器上的 MBean 注册筛选器,则该筛选器运行在受管服务器上,并仅将满足筛选条件的消息转发到监听器。

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

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

    通过 Domain Runtime MBean Server 定向所有 JMX 请求时,由于网络滞后和内存使用的增加而导致性能稍微下降。直接连接到每个受管服务器的 Runtime MBean Server 读取 MBean 值,可消除 Domain Runtime MBean Server 为了从受管服务器检索值而建立的网络跃点。但是,对于大多数网络拓扑和性能要求,Domain Runtime MBean Server 启用的简化代码维护和增强安全性更为可取。

    图 4-1 Domain Runtime MBean Server 与 Runtime MBean Server



     

     

    仅使用 JDK 类的远程连接

    BEA 建议您使用 WebLogic Server 类从远程 JMX 客户端进行连接。但是,远程 JMX 客户端可能仅使用 JDK 中的类连接到 WebLogic Server JMX 代理。为此,请执行下列操作:

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

    请参阅 “管理控制台联机帮助”中的启用和配置 IIOP

    1. 在 JMX 客户端中,按如下所示构造 javax.management.JMXConnector 对象:
      String hostname = "WLS-host" 
      int port = WLS-port String protocol = "rmi"; 
      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); 
       
    2. 其中 WLS-hostWLS-port 是 WebLogic Server 实例的监听地址和监听端口,MBean-server-JNDI-name表 4-1 中列出的值之一。

     

    请注意,您创建的散列表不包括协议包的名称。通过将此值保留为 null,JMX 客户端使用来自 com.sun.jmx.remote.protocol 包(在 JDK 中)的协议定义。

     


    建立 到 Runtime MBean Server 的本地连接

    本地客户端可以通过 JNDI 树而不是构造 JMXServiceURL 对象,访问 WebLogic Server 实例的 Runtime MBean Server。只有 Runtime MBean Server 在 JNDI 树中注册自身。

    从 JNDI 进行访问时,Runtime MBean Server 返回其 javax.management.MBeanServer 接口。此接口包含 MBeanServerConnection 接口中的所有方法以及诸如 registerMBean() (本地进程可以使用它注册自定义 MBean)之类的其他方法。(请参阅 “J2SE 5.0 API Specification”中的 MBeanServer 。)

    如果 JMX 客户端的类位于企业应用程序的顶层(即,如果它们是从应用程序的 APP-INF 目录部署的),则 Runtime MBean Server 的 JNDI 名称是:
    java:comp/env/jmx/runtime

    如果 JMX 客户端的类位于 J2EE 模块(如 EJB 或 Web 应用程序)中,则 Runtime MBeanServer 的 JNDI 名称是:
    java:comp/jmx/runtime

     

     

      • 例如:

     

     

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

     

     


    在 MBean 层次结构中导航

    WebLogic Server 用一种层次数据模型来组织自己的 MBean。(请参阅 WebLogic Server MBean 数据模型 。)在此模型中,所有父 MBean 都包括包含其子级的对象名的特性。在标准 JMX API 中使用子级的对象名,可获取或设置子 MBean 的特性值或者调用其方法。

    要在 WebLogic Server MBean 层次结构中导航,请执行下列操作:

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

    请参阅上一部分:建立到 MBean 服务器的远程连接

    启动连接将返回
    javax.management.MBeanServerConnection 类型的对象。

      1. 通过调用 MBeanServerConnection .getAttribute(ObjectName object-name ,
        String
        attribute ) 方法,获取 MBean 层次结构根部 MBean 的对象名,其中:
      • object-name 是在 MBean 服务器中注册的服务 MBean 的对象名。(请参阅服务 MBean 。)

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

    • attribute 是包含根 MBean 的服务 MBean 特性的名称。
      1. 相继调用与下列内容类似的代码:
        ObjectName on =
        MBeanServerConnection
        .getAttribute( object-name , attribute )
        其中:
    • object-name 是 MBean 层次结构中当前节点 (MBean) 的对象名。
    • attribute 是包含子 MBean 的一个或多个实例的当前 MBean 中特性的名称。如果该特性包含多个子级,则将输出分配给对象名数组 ObjectName[]

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

     


    示例:输出服务器的名称和状态

    清单 4-2 中的代码示例连接到 Domain Runtime MBean Server,并使用 DomainRuntimeServiceMBean 为域中的每个 ServerRuntimeMBean 获取对象名。然后,它检索并输出每个服务器的 ServerRuntimeMBean NameState 特性的值。

    请注意有关清单 4-2 中代码的下列信息:

      • 除了 connectionconnector 全局变量外,类将 WebLogic Server 服务 MBean 的对象名分配给一个全局变量。类内的方法将频繁使用此对象名,它在定义后不需要更改。
      • printServerRuntimes() 方法获取 DomainRuntimeServiceMBean ServerRuntimes 特性的值,该特性包含域中所有 ServerRuntimeMBean 实例的数组。(请参阅 “WebLogic Server MBean Reference”中的 DomainRuntimeServiceMBean 。)
    清单 4-2 示例:输出服务器的名称和状态
    package cn.chenfeng;
    
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.util.Hashtable;
    import javax.management.MBeanServerConnection;
    import javax.management.MalformedObjectNameException;
    import javax.management.ObjectName;
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import javax.management.remote.JMXServiceURL;
    import javax.naming.Context;
    
    public class PrintServerState {
    	private static MBeanServerConnection connection;
    
    	private static JMXConnector connector;
    
    	private static final ObjectName service;
    
    	// 实例化 DomainRuntimeServiceMBean 对象名 
    	// 这样可以通过类使用此对象名。 
    	static {
    		try {
    			service = new ObjectName(
    					"com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean");
    		} catch (MalformedObjectNameException e) {
    			throw new AssertionError(e.getMessage());
    		}
    	}
    
    	/**实例化与 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");
    		connector = JMXConnectorFactory.connect(serviceURL, h);
    		connection = connector.getMBeanServerConnection();
    	}
    
    	/** * 打印一组 ServerRuntimeMBeans。 * 此 MBean 是运行时 MBean 层次的根, * 此域中的每个服务器承载自己的实例。 */
    	public static ObjectName[] getServerRuntimes() throws Exception {
    		return (ObjectName[]) connection
    				.getAttribute(service, "ServerRuntimes");
    	}
    
    	/** * 迭代 ServerRuntimeMBean,获取名称和状态 */
    	public void printNameAndState() throws Exception {
    		ObjectName[] serverRT = getServerRuntimes();
    		System.out.println("got server runtimes");
    		int length = (int) serverRT.length;
    		for (int i = 0; i < length; i++) {
    			String name = (String) connection.getAttribute(serverRT[i], "Name");
    			String state = (String) connection.getAttribute(serverRT[i],
    					"State");
    			System.out.println("Server name: " + name + ".Server state: "
    					+ state);
    		}
    	}
    
    	public static void main(String[] args) throws Exception {
    		String hostname = args[0];
    		String portString = args[1];
    		String username = args[2];
    		String password = args[3];
    		PrintServerState s = new PrintServerState();
    		initConnection(hostname, portString, username, password);
    		s.printNameAndState();
    		connector.close();
    	}
    }
      

     


    示例:监视 Servlet

    Web 应用程序中的每个 servlet 提供 ServletRuntimeMBean (包含有关 servlet 的运行时状态的信息)的实例。(请参阅 “WebLogic Server MBean Reference”中的 ServletRuntimeMBean 。)

    在 WebLogic Server 数据模型中,ServletRuntimeMBean 的路径如下:

      1. Domain Runtime MBean Server(用于域中所有服务器上的所有 servlet)或特定服务器实例上的 Runtime MBean Server。
      2. DomainRuntimeServiceMBeanRuntimeServiceMBeanServerRuntimes 特性。
      3. ServerRuntimeMBeanApplicationRuntimes 特性。
      4. ApplicationRuntimeMBeanComponentRuntimes 特性。

    ComponentRuntimes 特性包含许多类型的组件运行时 MBean,其中一种是 WebAppComponentRuntimeMBean 。在获取此特性的值时,使用子 MBean 的 Type 特性可以获取特定类型的组件运行时 MBean。

    1. WebAppComponentRuntimeMBeanServletRuntimes 特性。

    清单 4-3 中的代码在上文中所述的层次结构中导航,并获取 ServletRuntimeMBean 特性的值。

    清单 4-3 监视 Servlet

     

     

     

     

    package cn.chenfeng;
    
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.util.Hashtable;
    import javax.management.MBeanServerConnection;
    import javax.management.MalformedObjectNameException;
    import javax.management.ObjectName;
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import javax.management.remote.JMXServiceURL;
    import javax.naming.Context;
    
    public class MonitorServlets {
    	private static MBeanServerConnection connection;
    
    	private static JMXConnector connector;
    
    	private static final ObjectName service;
    
    	// 实例化 DomainRuntimeServiceMBean 的对象名 
    	// 因此可以通过类使用此对象名。 
    	static {
    		try {
    			service = new ObjectName(
    					"com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean");
    		} catch (MalformedObjectNameException e) {
    			throw new AssertionError(e.getMessage());
    		}
    	}
    
    	/** * 实例化与 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");
    		connector = JMXConnectorFactory.connect(serviceURL, h);
    		connection = connector.getMBeanServerConnection();
    	}
    
    	/** * 获取一组 ServerRuntimeMBean */
    	public static ObjectName[] getServerRuntimes() throws Exception {
    		return (ObjectName[]) connection
    				.getAttribute(service, "ServerRuntimes");
    	}
    
    	/** * 获取一组 WebApplicationComponentRuntimeMBean */
    	public void getServletData() throws Exception {
    		ObjectName[] serverRT = getServerRuntimes();
    		int length = (int) serverRT.length;
    		for (int i = 0; i < length; i++) {
    			ObjectName[] appRT = (ObjectName[]) connection.getAttribute(
    					serverRT[i], "ApplicationRuntimes");
    			int appLength = (int) appRT.length;
    			for (int x = 0; x < appLength; x++) {
    				System.out.println("Application name: "
    						+ (String) connection.getAttribute(appRT[x], "Name"));
    				ObjectName[] compRT = (ObjectName[]) connection.getAttribute(
    						appRT[x], "ComponentRuntimes");
    				int compLength = (int) compRT.length;
    				for (int y = 0; y < compLength; y++) {
    					System.out.println(" Component name: "
    							+ (String) connection.getAttribute(compRT[y],
    									"Name"));
    					String componentType = (String) connection.getAttribute(
    							compRT[y], "Type");
    					System.out.println(componentType.toString());
    					if (componentType.toString().equals(
    							"WebAppComponentRuntime")) {
    						ObjectName[] servletRTs = (ObjectName[]) connection
    								.getAttribute(compRT[y], "Servlets");
    						int servletLength = (int) servletRTs.length;
    						for (int z = 0; z < servletLength; z++) {
    							System.out.println(" Servlet name: "
    									+ (String) connection.getAttribute(
    											servletRTs[z], "Name"));
    							System.out.println(" Servlet context path: "
    									+ (String) connection.getAttribute(
    											servletRTs[z], "ContextPath"));
    							System.out.println(" Invocation Total Count : "
    									+ (Object) connection.getAttribute(
    											servletRTs[z],
    											"InvocationTotalCount"));
    						}
    					}
    				}
    			}
    		}
    	}
    
    	public static void main(String[] args) throws Exception {
    		String hostname = args[0];
    		String portString = args[1];
    		String username = args[2];
    		String password = args[3];
    		MonitorServlets s = new MonitorServlets();
    		initConnection(hostname, portString, username, password);
    		s.getServletData();
    		connector.close();
    	}
    }

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 前言:做了一个监控应用服务器的项目(支持Tocmat、WebSphere、WebLogic各版本),过程也算是磕磕绊绊,由于网上缺少相关资料,或者深陷于知识的海洋难以寻觅到有效的资料,因而走过不少弯路,遇过不少困难。...

    前言:做了一个监控应用服务器的项目(支持Tocmat、WebSphere、WebLogic各版本),过程也算是磕磕绊绊,由于网上缺少相关资料,或者深陷于知识的海洋难以寻觅到有效的资料,因而走过不少弯路,遇过不少困难。为了留下点印记,给后来人留下点经验之谈,助之少走弯路,故将这些经验整理出来,与大家分享。水平有限,难免疏漏,还望指正。如有疑问,欢迎留言,或者加入Q群参与讨论:35526521

     

    这是官方文档,很多朋友刚着手监控WebLogic的项目时,并不一定能找到这篇文章,所以很容易深陷于互联网的知识海洋而迷茫困惑,这也说明了一个哲理——东西多了不一定是好事。特将此文转载于此,结合该系列的其他文章,希望能给您带来帮助。

     

    下列部分描述如何从 JMX 客户端访问 WebLogic Server MBean:

     


    为远程客户端设置类路径

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

    WL_HOME\lib\wljmxclient.jar

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

    此 JAR 包含 BEA 对 HTTP 和 IIOP 协议及其专用 T3 协议的实现。通过 BEA 的实现,JMX 客户端随其连接请求发送登录凭据,而 WebLogic Server 安全框架对这些客户端进行身份验证。只有通过身份验证的客户端才能访问在 WebLogic Server MBean 服务器中注册的 MBean。

    注意: 尽管 BEA 建议您使用它对 HTTP 和 IIOP 协议或其专用 T3 协议的实现,但是 JMX 客户端可以使用在标准 JDK 中定义的 IIOP 协议。请参阅仅使用 JDK 类的远程连接

     

     

     


    建立到 MBean 服务器的远程连接

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

    要连接到 WebLogic MBean 服务器,请执行下列操作:

     

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

    将下列参数值传递给构造方法(请参阅 “J2SE 5.0 API Specification”中的JMXServiceURL):

    • 作为与 MBean 服务器通信所用协议的下列值之一:
      t3t3shttphttpsiiopiiops
    • 承载 MBean 服务器的 WebLogic Server 实例的监听地址
    • WebLogic Server 实例的监听端口
    • MBean 服务器的绝对 JNDI 名称。JNDI 名称必须以 /jndi/ 开头,且后跟表 4-1 中所述的 JNDI 名称之一。
      1. 构造 javax.management.remote.JMXConnector 对象。此对象包含 JMX 客户端用来连接到 MBean服务器的方法。
        • weblogic.management.remote 包定义可以用于连接到 WebLogic MBean 服务器的协议。远程 JMX 客户端必须在其类路径上包括此包中的类。请参阅为远程客户端设置类路径

    JMXConnector 的构造方法如下:javax.management.remote.JMXConnectorFactory.
    connector(JMXServiceURL
    serviceURL , Map<String,?> environment )

    将下列参数值传递给构造方法(请参阅 “J2SE 5.0 API Specification”中的JMXConnectorFactory):

    • 在上一步中创建的 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" 
       
      1. 通过调用 JMXConnector.getMBeanServerConnection() 方法连接到 WebLogic MBean 服务器。

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

    MBeanServerConnection 对象是到 WebLogic MBean 服务器的连接。可以将它用于本地连接和远程连接。请参阅 “J2SE 5.0 API Specification”中的MBeanServerConnection

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

     

    示例:连接到 Domain Runtime MBean Server

    请注意有关清单 4-1 中代码的下列信息:

     

      • 类使用全局变量 connectionconnector 来表示到 MBean 服务器的连接。对于每个类实例,应该仅调用一次initConnection() 方法(它将值分配给 connectionconnector 变量),以建立可以在类内重用的单个连接。
      • initConnection() 方法采用用户名和密码(以及服务器的监听地址和监听端口)作为参数,在实例化类时传递这些参数。BEA 建议使用此方法,因为它阻止代码包含未加密的用户凭据。包含这些参数的String 对象将由 JVM 的垃圾收集例程破坏并从内存中删除。
      • 类在完成其工作后,调用 JMXConnector.close() 关闭到 MBean 服务器的连接。(请参阅 “J2SE 5.0 API Specification”中的JMXConnector。)
    清单 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");
    		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 服务器

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

      • 要修改域的配置,请使用 Edit MBean Server。
      • 要监视对配置 MBean 的待定层次结构的更改,请使用 Edit MBean Server。
      • 要仅监视活动的配置 MBean(而不监视运行时 MBean),请使用 Runtime MBean Server。

    通过 Runtime MBean Server 进行监视需要的内存和网络流量,比通过 Domain Runtime MBean Server 进行监视的小。(WebLogic Server 在客户端请求连接到它时才初始化 Domain Runtime MBean Server。)

    在大多数情况下,域中的所有服务器实例具有一组相同的配置数据,因此不管在管理服务器上还是在受管服务器监视 Runtime MBean Server 都无关紧要。但是,如果所做的更改使服务器在重新启动后才能继续工作,则该服务器将不再接受任何更改,这样其配置数据可能会过时。在这种情况下,监视此服务器的 Runtime MBean Server 仅指示特定服务器实例的配置。要了解更改 WebLogic Server 域并激活更改的过程,请参阅 “了解域配置”中的管理配置更改

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

    如果您向 Domain Runtime MBean Server 中的 MBean 注册 JMX 监听器和筛选器,则 JMX 筛选器与它所监视的 MBean 运行在同一个 JVM 中。例如,如果向受管服务器上的 MBean 注册筛选器,则该筛选器运行在受管服务器上,并仅将满足筛选条件的消息转发到监听器。

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

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

    通过 Domain Runtime MBean Server 定向所有 JMX 请求时,由于网络滞后和内存使用的增加而导致性能稍微下降。直接连接到每个受管服务器的 Runtime MBean Server 读取 MBean 值,可消除 Domain Runtime MBean Server 为了从受管服务器检索值而建立的网络跃点。但是,对于大多数网络拓扑和性能要求,Domain Runtime MBean Server 启用的简化代码维护和增强安全性更为可取。

    图 4-1 Domain Runtime MBean Server 与 Runtime MBean Server



     

     

    仅使用 JDK 类的远程连接

    BEA 建议您使用 WebLogic Server 类从远程 JMX 客户端进行连接。但是,远程 JMX 客户端可能仅使用 JDK 中的类连接到 WebLogic Server JMX 代理。为此,请执行下列操作:

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

    请参阅 “管理控制台联机帮助”中的启用和配置 IIOP

    1. 在 JMX 客户端中,按如下所示构造 javax.management.JMXConnector 对象:
      String hostname = "WLS-host" 
      int port = WLS-port String protocol = "rmi"; 
      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); 
       
    2. 其中 WLS-hostWLS-port 是 WebLogic Server 实例的监听地址和监听端口,MBean-server-JNDI-name表 4-1 中列出的值之一。

     

    请注意,您创建的散列表不包括协议包的名称。通过将此值保留为 null,JMX 客户端使用来自com.sun.jmx.remote.protocol 包(在 JDK 中)的协议定义。

     


    建立 到 Runtime MBean Server 的本地连接

    本地客户端可以通过 JNDI 树而不是构造 JMXServiceURL 对象,访问 WebLogic Server 实例的 Runtime MBean Server。只有 Runtime MBean Server 在 JNDI 树中注册自身。

    从 JNDI 进行访问时,Runtime MBean Server 返回其javax.management.MBeanServer 接口。此接口包含MBeanServerConnection 接口中的所有方法以及诸如 registerMBean() (本地进程可以使用它注册自定义 MBean)之类的其他方法。(请参阅 “J2SE 5.0 API Specification”中的MBeanServer。)

    如果 JMX 客户端的类位于企业应用程序的顶层(即,如果它们是从应用程序的APP-INF 目录部署的),则 Runtime MBean Server 的 JNDI 名称是:
    java:comp/env/jmx/runtime

    如果 JMX 客户端的类位于 J2EE 模块(如 EJB 或 Web 应用程序)中,则 Runtime MBeanServer 的 JNDI 名称是:
    java:comp/jmx/runtime

     

     

      • 例如:

     

     

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

     

     


    在 MBean 层次结构中导航

    WebLogic Server 用一种层次数据模型来组织自己的 MBean。(请参阅WebLogic Server MBean 数据模型 。)在此模型中,所有父 MBean 都包括包含其子级的对象名的特性。在标准 JMX API 中使用子级的对象名,可获取或设置子 MBean 的特性值或者调用其方法。

    要在 WebLogic Server MBean 层次结构中导航,请执行下列操作:

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

    请参阅上一部分:建立到 MBean 服务器的远程连接

    启动连接将返回
    javax.management.MBeanServerConnection 类型的对象。

      1. 通过调用 MBeanServerConnection .getAttribute(ObjectNameobject-name,
        String
        attribute ) 方法,获取 MBean 层次结构根部 MBean 的对象名,其中:
      • object-name 是在 MBean 服务器中注册的服务 MBean 的对象名。(请参阅服务 MBean 。)

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

    • attribute 是包含根 MBean 的服务 MBean 特性的名称。
      1. 相继调用与下列内容类似的代码:
        ObjectName on =
        MBeanServerConnection
        .getAttribute( object-name , attribute)
        其中:
    • object-name 是 MBean 层次结构中当前节点 (MBean) 的对象名。
    • attribute 是包含子 MBean 的一个或多个实例的当前 MBean 中特性的名称。如果该特性包含多个子级,则将输出分配给对象名数组ObjectName[]

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

     


    示例:输出服务器的名称和状态

    清单 4-2 中的代码示例连接到 Domain Runtime MBean Server,并使用DomainRuntimeServiceMBean 为域中的每个ServerRuntimeMBean 获取对象名。然后,它检索并输出每个服务器的ServerRuntimeMBeanNameState 特性的值。

    请注意有关清单 4-2 中代码的下列信息:

      • 除了 connectionconnector 全局变量外,类将 WebLogic Server 服务 MBean 的对象名分配给一个全局变量。类内的方法将频繁使用此对象名,它在定义后不需要更改。
      • printServerRuntimes() 方法获取DomainRuntimeServiceMBeanServerRuntimes 特性的值,该特性包含域中所有ServerRuntimeMBean 实例的数组。(请参阅 “WebLogic Server MBean Reference”中的DomainRuntimeServiceMBean。)
    清单 4-2 示例:输出服务器的名称和状态
    package cn.chenfeng;
    
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.util.Hashtable;
    import javax.management.MBeanServerConnection;
    import javax.management.MalformedObjectNameException;
    import javax.management.ObjectName;
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import javax.management.remote.JMXServiceURL;
    import javax.naming.Context;
    
    public class PrintServerState {
    	private static MBeanServerConnection connection;
    
    	private static JMXConnector connector;
    
    	private static final ObjectName service;
    
    	// 实例化 DomainRuntimeServiceMBean 对象名 
    	// 这样可以通过类使用此对象名。 
    	static {
    		try {
    			service = new ObjectName(
    					"com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean");
    		} catch (MalformedObjectNameException e) {
    			throw new AssertionError(e.getMessage());
    		}
    	}
    
    	/**实例化与 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");
    		connector = JMXConnectorFactory.connect(serviceURL, h);
    		connection = connector.getMBeanServerConnection();
    	}
    
    	/** * 打印一组 ServerRuntimeMBeans。 * 此 MBean 是运行时 MBean 层次的根, * 此域中的每个服务器承载自己的实例。 */
    	public static ObjectName[] getServerRuntimes() throws Exception {
    		return (ObjectName[]) connection
    				.getAttribute(service, "ServerRuntimes");
    	}
    
    	/** * 迭代 ServerRuntimeMBean,获取名称和状态 */
    	public void printNameAndState() throws Exception {
    		ObjectName[] serverRT = getServerRuntimes();
    		System.out.println("got server runtimes");
    		int length = (int) serverRT.length;
    		for (int i = 0; i < length; i++) {
    			String name = (String) connection.getAttribute(serverRT[i], "Name");
    			String state = (String) connection.getAttribute(serverRT[i],
    					"State");
    			System.out.println("Server name: " + name + ".Server state: "
    					+ state);
    		}
    	}
    
    	public static void main(String[] args) throws Exception {
    		String hostname = args[0];
    		String portString = args[1];
    		String username = args[2];
    		String password = args[3];
    		PrintServerState s = new PrintServerState();
    		initConnection(hostname, portString, username, password);
    		s.printNameAndState();
    		connector.close();
    	}
    }
      

     


    示例:监视 Servlet

    Web 应用程序中的每个 servlet 提供 ServletRuntimeMBean (包含有关 servlet 的运行时状态的信息)的实例。(请参阅 “WebLogic Server MBean Reference”中的ServletRuntimeMBean。)

    在 WebLogic Server 数据模型中,ServletRuntimeMBean 的路径如下:

      1. Domain Runtime MBean Server(用于域中所有服务器上的所有 servlet)或特定服务器实例上的 Runtime MBean Server。
      2. DomainRuntimeServiceMBeanRuntimeServiceMBeanServerRuntimes 特性。
      3. ServerRuntimeMBeanApplicationRuntimes 特性。
      4. ApplicationRuntimeMBeanComponentRuntimes 特性。

    ComponentRuntimes 特性包含许多类型的组件运行时 MBean,其中一种是WebAppComponentRuntimeMBean 。在获取此特性的值时,使用子 MBean 的Type 特性可以获取特定类型的组件运行时 MBean。

    1. WebAppComponentRuntimeMBeanServletRuntimes 特性。

    清单 4-3 中的代码在上文中所述的层次结构中导航,并获取ServletRuntimeMBean 特性的值。

    清单 4-3 监视 Servlet

     

     

     

     

    package cn.chenfeng;
    
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.util.Hashtable;
    import javax.management.MBeanServerConnection;
    import javax.management.MalformedObjectNameException;
    import javax.management.ObjectName;
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import javax.management.remote.JMXServiceURL;
    import javax.naming.Context;
    
    public class MonitorServlets {
    	private static MBeanServerConnection connection;
    
    	private static JMXConnector connector;
    
    	private static final ObjectName service;
    
    	// 实例化 DomainRuntimeServiceMBean 的对象名 
    	// 因此可以通过类使用此对象名。 
    	static {
    		try {
    			service = new ObjectName(
    					"com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean");
    		} catch (MalformedObjectNameException e) {
    			throw new AssertionError(e.getMessage());
    		}
    	}
    
    	/** * 实例化与 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");
    		connector = JMXConnectorFactory.connect(serviceURL, h);
    		connection = connector.getMBeanServerConnection();
    	}
    
    	/** * 获取一组 ServerRuntimeMBean */
    	public static ObjectName[] getServerRuntimes() throws Exception {
    		return (ObjectName[]) connection
    				.getAttribute(service, "ServerRuntimes");
    	}
    
    	/** * 获取一组 WebApplicationComponentRuntimeMBean */
    	public void getServletData() throws Exception {
    		ObjectName[] serverRT = getServerRuntimes();
    		int length = (int) serverRT.length;
    		for (int i = 0; i < length; i++) {
    			ObjectName[] appRT = (ObjectName[]) connection.getAttribute(
    					serverRT[i], "ApplicationRuntimes");
    			int appLength = (int) appRT.length;
    			for (int x = 0; x < appLength; x++) {
    				System.out.println("Application name: "
    						+ (String) connection.getAttribute(appRT[x], "Name"));
    				ObjectName[] compRT = (ObjectName[]) connection.getAttribute(
    						appRT[x], "ComponentRuntimes");
    				int compLength = (int) compRT.length;
    				for (int y = 0; y < compLength; y++) {
    					System.out.println(" Component name: "
    							+ (String) connection.getAttribute(compRT[y],
    									"Name"));
    					String componentType = (String) connection.getAttribute(
    							compRT[y], "Type");
    					System.out.println(componentType.toString());
    					if (componentType.toString().equals(
    							"WebAppComponentRuntime")) {
    						ObjectName[] servletRTs = (ObjectName[]) connection
    								.getAttribute(compRT[y], "Servlets");
    						int servletLength = (int) servletRTs.length;
    						for (int z = 0; z < servletLength; z++) {
    							System.out.println(" Servlet name: "
    									+ (String) connection.getAttribute(
    											servletRTs[z], "Name"));
    							System.out.println(" Servlet context path: "
    									+ (String) connection.getAttribute(
    											servletRTs[z], "ContextPath"));
    							System.out.println(" Invocation Total Count : "
    									+ (Object) connection.getAttribute(
    											servletRTs[z],
    											"InvocationTotalCount"));
    						}
    					}
    				}
    			}
    		}
    	}
    
    	public static void main(String[] args) throws Exception {
    		String hostname = args[0];
    		String portString = args[1];
    		String username = args[2];
    		String password = args[3];
    		MonitorServlets s = new MonitorServlets();
    		initConnection(hostname, portString, username, password);
    		s.getServletData();
    		connector.close();
    	}
    }


    展开全文
  • JMX monitor weblogic 总结

    千次阅读 2015-01-16 14:01:47
    weblogic server开放JMX接口,所需就是编写JMX的客户端 关于版本: weblogic 9.0为分界。 MBean入口——之前:MBeanHome,deprecated;之后:javax.management.MBeanServerConnection  大概步骤: ...
  • JMX in Weblogic

    2012-02-17 19:20:56
    Here I would like to list some topics I used to search or study...MBean Servers in Weblogic The JVM for an Administration Server maintains three MBean servers provided by BEA and optionally maintains...
  • WebLogicServer提供了一系列MBean,可以使用这些MBean来配置、监控和管理WebLogic服务器资源。 Runtime MBeans 包含有关服务器及其资源的运行时状态的信息。 Configuration MBeans包含有关服务器和资源配置的信息。 ...
  • JMX监控weblogic问题

    2008-09-02 17:54:58
    在网上了解了一下JMX原理,也做了一个JMX的Hello例子,但是要监控weblogic不知道如何动手,得到了与weblogic的Mbeanserverconnection,但是不知道怎么得到我要的监控指标,是还要注册相应的Mbean?该Mbean要怎么写呀...
  • weblogicServier实现了JMX规范,提供了各种各样的MBeans对WebLogic Server的各项配置及性能进行监控的API。通过weblogic提供的API可以对server(服务),cluster(集群)等进行监控。下面主要罗列对server进行监控的指标...

空空如也

空空如也

1 2 3 4
收藏数 63
精华内容 25
关键字:

jmxmbeanweblogic