使用JMX访问WebLogic Server MBean
本章介绍如何从JMX客户端访问WebLogic Server MBean。它解释了如何为远程客户端设置类路径; 如何与MBean服务器建立本地和远程连接; 以及如何导航MBean层次结构。
本章包括以下部分:
- 设置远程客户端的类路径
- 远程连接到MBean Server
- 与运行时MBean服务器建立本地连接
- 与Domain Runtime MBean Server建立本地连接
- 导航MBean层次结构
- 示例:打印服务器的名称和状态
- 示例:监视Servlet
设置远程客户端的类路径
如果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服务器:
-
通过构造
javax.management.remote.JMXServiceURL
对象描述MBean服务器的地址。通过下面的参数值给构造(参见
JMXServiceURL
在JAVASE 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
-
-
构造一个
javax.management.remote.JMXConnector
对象。此对象包含JMX客户端用于连接到MBean服务器的方法。构造函数方法
JMXConnector
是:javax.management.remote.JMXConnectorFactory。 connector(JMXServiceURL serviceURL,Map <String,?> environment)
通过下面的参数值给构造(参见
JMXConnectorFactory
在JAVA 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客户端将无限期挂起。 -
-
通过调用
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
。 -
Oracle建议在客户端完成其工作时,通过调用该
JMXConnector.close()
方法关闭与MBean服务器的连接。
示例:连接到域运行时MBean服务器
请注意以下关于示例4-1中的代码:
- 该类使用全局变量,
connection
和connector
来表示到 MBean 服务器的连接。对于每个类实例,应该仅调用一次initConnection()
方法(它将值分配给connection
和connector
变量),以建立可以在类内重用的单个连接。 - 该
initConnection()
方法将用户名和密码(以及服务器的监听地址和监听端口)作为在实例化类时传递的参数。Oracle建议使用此方法,因为它会阻止您的代码包含未加密的用户凭据。String
包含参数的对象将被JVM的垃圾收集例程销毁并从内存中删除。 - 因为客户端将
jmx.remote.x.request.waiting.timeout
环境参数设置为10000,所以如果方法在调用10000毫秒内没有返回,则它对MBean服务器方法的所有调用都将超时。 - 当类完成其工作时,它将调用
JMXConnector.close()
以关闭与MBean服务器的连接。(参见JMXConnector
在Java 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 Long(10000));
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上定义通知的功能(这些MBeanLocation=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(false) activate()
图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代理。为此:
-
如果
wljmxclient.jar
和wlclient.jar
不在客户端类路径中:- 为托管MBean的WebLogic Server实例启用IIOP协议。
- 将默认IIOP用户配置为具有管理员权限的WebLogic Server用户。
请参阅启用和配置IIOP中的Oracle WebLogic Server管理控制台联机帮助。
如果
wljmxclient.jar
和wlclient.jar
是在客户端类路径中,没有必要启用默认IIOP用户。转到第2步。注意:
wlclient.jar
中包含wljmxclient.jar
的清单类路径条目,所以wlclient.jar
并wljmxclient.jar
需要在同一目录下,或者两者罐需要在类路径中指定。如果包含,请确保包含在类路径中
weblogic.jar
或wlfullclient.jar
不包含在类路径中wljmxclient.jar
。应该只使用瘦客户端wljmxclient.jar
/wlclient.jar
胖客户端wlfullclient.jar
,而不是两者的组合。 -
在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-host
和WLS-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的方法。(参见MBeanServer
在JAVA 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/runtime
,java: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()
。(参见MBeanServer
在JAVA 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层次结构:
-
启动与MBean服务器的连接。
请参阅上一节“与MBean服务器建立远程连接”。
启动连接将返回类型的对象
javax.management.MBeanServerConnection
-
通过调用,在MBean层次结构的根目录中获取MBean的对象名称
MBeanServerConnection
。getAttribute(ObjectName
object-name
,方法在哪里:String
attribute
)
-
*
object-name
*表示在MBean服务器中注册的服务MBean的对象名称。(参见Service MBeans。)表2-3描述了每种类型的MBean服务器中可用的服务MBean的类型。
-
attribute
表示包含根MBean的服务MBean属性的名称。
-
-
连续调用类似于以下内容的代码:
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 Server的MBean Reference列出包含当前MBean的工厂方法的父MBean。对于工厂方法不公开的MBean,Oracle WebLogic Server的MBean Reference列出了可以从中访问当前MBean的其他MBean。
表2-3服务MBean
MBean |
---|