`
roomy
  • 浏览: 52741 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JMX REMOTING

    博客分类:
  • J2EE
阅读更多

1 Introduction
    Java Management Extension (JMX) API
定义于JSR 3,用于应用程序管理。这些API对于被管理的应用程序来说是本地的。也就是说,在JSR 160发布之前,如果客户端要通过JMX来管理和监控远程的应用程序,并没有标准的做法。JSR 160扩展了JSR 3,提供了标准的API用于连接到支持JMX的远程应用程序。JSR 255将会把JMX升级到2.0,并可能体现在Java 7中。
   
目前JSR 160定义了基于RMI(支持RMI/JRMP RMI/IIOP)的连接器,还定义了可选的JMXMP连接器,它基于TCP SocketJava序列化机制。

2 JMX Remoting API
2.1 JMXServiceURL
    JMXServiceURL
用于标识JMXConnectorServer,它是采用以下形式的字符串:
    service:jmx:<protocol>://[[[ <host>]: <port>]/ <path>]
    "protocol"
指定了协议,例如:rmiiiopjmxmp 或者 soap"host""port" "path"是可选的。JMXServiceURL并不足以描述所有的用于连接到JMXConnectorServer的配置信息(例如配置 RMIClientSocketFactory RMIServerSocketFactory),因此在构造JMXConnectorServer JMXConnector的时候,还可能需要通过一个Map实例指定其它属性。

2.2 JMXConnectorServer(服务端)
    JMXConnectorServer
MBeanServer端的组件,它需要被关联到MBeanServer:可以通过在创建JMXConnectorServer的时候显式指定 MBeanServer;也可以把JMXConnectorServer(本身是一个MBean注册MBeanServer中。
   
在被关联到MBeanServer之后,需要启动JMXConnectorServer以处理客户端的请求。同样,如果希望停止处理客户端的请求,那么需要停止JMXConnectorServerJMXConnectorServer被停止之后,不应该试图重新启动它,而是应该将其丢弃。
   
最好通过JMXConnectorServerFactory来创建JMXConnectorServer,例如:

// JMXServiceURL用于标识JMXConnectorServer,JMXConnectorServer处理客户端的请求,需要事先关联到MBeanServer
JMXServiceURL address = new JMXServiceURL("service:jmx:rmi://host");    
// 用于描述JMXServiceURL连接到JMXConnectorServer的配置信息
Map environment = null;  
// JMXConnectorServer需要关联到MBeanServer
MBeanServer server = MBeanServerFactory.createMBeanServer();    
//创建JMXCconnectorServer,参数有地址标识、连接配置信息、MBeanServer
JMXConnectorServer cntorServer = JMXConnectorServerFactory.newJMXConnectorServer(address, environment, server);    
// 启动JMXConnectorServer
cntorServer.start(); 

  在以上的例子中,创建JMXConnectorServer的时候指定了MBeanServer。以下是一个将JMXConnectorServer作为MBean注册MBeanServer的例子:

// 连接地址  
JMXServiceURL address = new JMXServiceURL("service:jmx:rmi://host");  
// 连接配置信息,为空情况下使用无效
Map environment = null;  
// 创建JMXConnectorServer,没有和MBeanServer关联
JMXConnectorServer cntorServer = JMXConnectorServerFactory.newJMXConnectorServer(address, environment, null);  
// 创建MBeanServer
MBeanServer server = MBeanServerFactory.createMBeanServer();  
// 返回 ObjectName 的实例,此处类似使用 new ObjectName(name) 获得的对象
ObjectName cntorServerName = ObjectName.getInstance("connectors:protocol=rmi");  
// 注册JMXConnectorServer到MBeanServer中
server.registerMBean(cntorServer, cntorServerName);  
// 启动JMXConnectorServer
cntorServer.start();  
// 另一种方式,通过MBeanServer开启cntorServer
server.invoke(cntorServerName, "start", null, null);  
// 另一种方式开启cntorServer
Object proxy = MBeanServerInvocationHandler.newProxyInstance(server, cntorServerName, JMXConnectorServerMBean.class, true);  
JMXConnectorServerMBean cntorServerMBean=(JMXConnectorServerMBean)proxy
cntorServerMBean.start();

 

   需要注意的是,在这个例子中使用了三种不同的方式启动JMXConnectorServer:第一种方式是直接调用cntorServer对象的 start方法;第二种方式是通过MBeanServer调用MBean的方法;第三种方式是使用了 MBeanServerInvocationHandler,它继承自InvocationHandler是代理实例的调用处理程序实现的接口),用于从MBean的管理接口向 MBeanServer中的 MBean 转发方法调用。当调用从newProxyInstance()方法返回的代理对象上的toString()hashCode() equals(Object)等方法时,这些方法调用同样也会被转发到MBeanServer中的MBean ,因此当且仅当 MBean 在其管理接口中声明了这些方法时才能如此操作,否则会抛出异常。

2.3 JMXConnector(客户端)
   JMXConnector
是客户端的组件,客户端程序通过它连接到远程的MBeanServer。客户端可以通过JMXConnector获得远程 MBeanServerMBeanServerConnection 接口,并以类似本地的方式使用它JMXConnector还支持在远程的MBeanServer上注册本地或者远程的通知监听器,以接收来自远程 MBeanServer的通知。
   
最好通过JMXConnectorFactory来创建JMXConnector,例如:

// 所连接的服务器地址  
JMXServiceURL address = ...;  
// 连接配置信息,为空情况下使用无效  
Map environment = null;   
// 创建JMXCconnectorServer
JMXConnector cntor = JMXConnectorFactory.connect(address, environment);
// 从远程MBeanServer获取"stub"信息
MBeanServerConnection mbsc = cntor.getMBeanServerConnection();  
// 向MBeanServer发出请求  
String domain = mbsc.getDefaultDomain();  
// 也可以先实例化JMXConnector,然后在连接到MBeanServer,例如:  
JMXServiceURL address = ...;
Map creationEnvironment = null;  
// Create the JMXCconnectorServer  
JMXConnector cntor = JMXConnectorFactory.newJMXConnector(address, creationEnvironment);  
// The connection environment map, null in this case  
// May contain - for example - user's credentials  
Map connectionEnvironment = null;   
// 连接  
cntor.connect(connectionEnvironment);  
// Obtain a "stub" for the remote MBeanServer
MBeanServerConnection mbsc = cntor.getMBeanServerConnection();  
// Call the remote MBeanServer
String domain = mbsc.getDefaultDomain(); 

     需要注意的是,以上的例子中采用了两个不同的Map对象保存相关的属性:一个用于实例化;另外一个用于连接。MBeanServerConnection 接口在JMX 1.2中定义,用于支持remote API。由于之前版本的MBeanServer接口不能直接被客户端使用(例如其registerMBean(), deserialize(), getClassLoader()等方法对于客户端来说没有意义),因此在JMX 1.2中,MBeanServer接口继承自MBeanServerConnection接口。

 

    RMIConnector是标准的JMXConnector。由于它使用RMI协议,因此需要一个stub object来处理RMI调用的细节stub class通常存在于客户端的类路径上,但是stub object通常是从命名服务器处下载,因此RMI客户端需要知道stub object被绑定到RMI server上的路径。JSR 160定义了两种获得stub object的方式:
   
第一种方式不需要命名服务器,而是stub object编码为JMXServiceURL的一部分,即"encoded form"。如果采用RMI/JRMP协议,那么对stub object被序列化之后的所有字节进行Base64编码,然后将编码后的字符添加到JMXServiceURL中,并且以/stub/开始;如果采用 RMI/ IIOP,那么IOR被添加到JMXServiceURL中,并以/ior/开始。以下是个例子:

// JRMP encoded form  
service:jmx:rmi://localhost/stub/rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkuUk1JU2VydmVySW1wbF9TdHViAAAAAAAAAAICAAB4cgAaamF2YS5ybWkuc2VydmVyLlJlbW90ZVN0dWLp/tzJi+FlGgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc5AAtVbmljYXN0UmVmMgAADjE2LjE5Mi4xMjAuMTI5AAANcQAAAAAAAAAIAOgIQgAAAPlXjcJugAEAeA==   
// IIOP encoded form
service:jmx:iiop://localhost/ior/IOR:000000000000003b524d493a6a617661782e6d616e6167656d656e742e72656d6f74652e726d692e524d495365727665723a303030303030303030303030303030300000000000010000000000000068000102000000000f31362e3139322e3132302e31323900000d93000000000019afabcb0000000002578f08b80000000800000000000000000a0000000000000100000001000000200000000000010001000000020501000100010020000101090000000100010100  

 

    第二种方式是在JMXServiceURL中指定命名服务器和stub object被绑定到的JNDI路径,即"JNDI form"。在JMXServiceURL中以/jndi/开始。将JNDI的相关配置传递给RMIConnector的方式有多种。例如URL 'rmi://namingHost:1099/jndiPath'指明命名服务器在名为'namingHost'的主机上并监听1099端口,命名服务器是rmiregistry,路径是'/jndiPath'。同样URL 'iiop://namingHost:900/jndiPath'指明命名服务器在名为'namingHost'的主机上并监听900端口,命名服务器 是COS命名服务,路径是'/jndiPath'。以下是个例子:

// JNDI URL form for JRMP  
service:jmx:rmi://rmiHost/jndi/rmi://namingHost:1099/jndiPath  
// JNDI URL form for IIOP  
service:jmx:iiop://rmiHost/jndi/iiop://namingHost:900/jndiPath  

 

    此外,JNDI属性也可以通过系统属性、类路径上的'jndi.properties'文件、在调用JMXConnector.connect(Map environment)或者JMXConnectorFactory.connect(JMXServiceURL url, Map environment)方法时传递的environment参数等不同方式指定。如果JNDI属性通过这些方式指定,那么JMXServiceURL中可以使用简短的JNDI格式,即只指定JNDI path。以下是个例子:

// JNDI short form for JRMP
service:jmx:rmi://rmiHost/jndi/jndiPath  
// JNDI short form for IIOP  
service:jmx:iiop://rmiHost/jndi/jndiPath    
// Code example that uses the JNDI short form specifying JNDI properties via environment Map
// The JNDI environment
Map environment = new HashMap();  
environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");  
environment.put(Context.PROVIDER_URL, "rmi://namingHost:1099");  
// The JNDI short form JMXServiceURL  
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://rmiHost/jndi/jndiPath");  
JMXConnector connector = JMXConnectorFactory.connect(url, environment);

 

2.4 Remote Notification
    JSR 160
定义的连接器可以接收到远程MBean发送的通知。通知被传递的细节依赖于连接器使用的协议。要接收通知,客户端必须要通过调用 MBeanServerConnection.addNotificationListener(...)方法来注册一个监听器(监听远程MBean发送的通知),这个方法有两个重载的版 本:
   
第一个版本接受一个ObjectName实例作为监听器,由于监听器是远程MBeanServer中的一个MBean,因此方法中的filterhandback参数必须被传递到远程的MBeanServer,因此它们必须是可以被序列化的。
   
另一个版本接受NotificationListener的实例作为监听器。这个监听器是客户端的本地对象,而且监听器对象不会被传递到远程的 MBeanServer,因此它也不必是可以被序列化的。NotificationFilter是否被传递到远程的MBeanServer取决于 connector使用的协议,handback对象不会被传递到远程MBeanServer。在另一方面,远程的MBean发送的通知必须是可以被序列化的,因为通知会被传递到客户端。以下是在远程的MBean上注册监听器的例子:

// 连接到服务器的地址  
JMXServiceURL address = ...;  
// The JMXConnector  
JMXConnector connector = JMXConnectorFactory.connect(address);  
// The MBeanServerConnection "stub"(细节信息)
MBeanServerConnection mbsc = connector.getMBeanServerConnection();  
// MBeanServerDelegate收集MBeans注册或未注册的通知
ObjectName delegateName = ObjectName.getInstance("JMImplementation:type=MBeanServerDelegate");  
NotificationListener listener = new NotificationListener() {
    public void handleNotification(Notification notification, Object handback) {  
      // Do something
    }  
};    
mbsc.addNotificationListener(delegateName, listener, null, null); 

 

3 JMX Remoting Security
    JSR 160提供了一种可插拔的认证机制,它基于JMXAuthenticator接口。JMXAuthenticator接口中只包含如下一个方法,它接受从客户端得到的身份证明信息作为参数,返回javax.security.auth.Subject对象的一个实例

public Subject authenticate(Object credentials) throws SecurityException 

    以下是JMXConnectorServer 中使用JMXAuthenticator的例子:

// 服务器地址  
JMXServiceURL address = ...;  
// 实施JMXAuthenticator
JMXAuthenticator authenticator = ...;   
// 连接的相关配置信息  
Map environment = new HashMap();  
environment.put(JMXConnectorServer.AUTHENTICATOR, authenticator);   
// MBeanServer依附在相应的 JMXConnectorServer  
MBeanServer server = MBeanServerFactory.createMBeanServer();  
// 创建JMXCconnectorServer  
JMXConnectorServer cntorServer = JMXConnectorServerFactory.newJMXConnectorServer(address, environment, server);  
// 启动 JMXConnectorServer  
cntorServer.start();  

    以下是JMXConnector中使用JMXAuthenticator的例子:

// 要连接的服务器地址  
JMXServiceURL address = ...;    
// 创建JMXCconnectorServer  
JMXConnector cntor = JMXConnectorFactory.newJMXConnector(address, null);
  
// 凭据  
Object credentials = ...;  
// 连接的配置信息  
Map environment = new HashMap();  
environment.put(JMXConnector.CREDENTIALS, credentials);  
// 连接并调用远程的MBeanServer的相关操作  
try  
{  
   cntor.connect(environment);  
}  
catch (SecurityException x)  
{  
   // Uh-oh ! Bad credentials !  
   throw x;  
}    
// 获取远程MBeanServer的相关信息  
MBeanServerConnection mbsc = cntor.getMBeanServerConnection();  
// 向MBeanServer发出请求  
ObjectName delegate = ObjectName.getInstance("JMImplementation:type=MBeanServerDelegate");  
String id = mbsc.getAttribute(delegate, "MBeanServerId");

 

    当调用从JMXConnector 得到的MBeanServerConnection 接口上的方法时,最终发生在远程MBeanServer的调用会以认证后的Subject 身份执行。如果使用SecurityManager,那么还可以为不同的Subject指定不同的权限。

 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    jboss远程调用JMX

    这通常涉及开启JMX Remoting接口,并配置必要的安全设置。 2. **客户端设置**:在客户端,我们需要导入必要的JMX和RMI库,然后创建一个`MBeanServerConnection`实例。这通常通过`JMXConnectorFactory`完成,它会...

    很好的JMX资料

    4. **JMX远程访问**:讲解如何配置JMX以允许远程监控和管理,包括RMI和JMX Remoting。 5. **实战案例**:通过实际示例展示如何使用JMX监控内存泄漏、线程死锁、日志记录等。 6. **API参考**:可能包含官方JMX API的...

    JMX in Action

    这涵盖了远程监控、JMX连接器和代理的高级特性,如RMI和JMX Remoting。 总的来说,这本书不仅涵盖了JMX的基础知识,还包括了实际应用中的高级技术,旨在帮助开发者熟练掌握利用JMX进行系统管理和监控的方法。无论你...

    JMX实用例子详解(包括各种Mbean)

    8. **连接器API(JMX Connectors)**:RMI和JMX Remoting接口的使用,以及如何配置JMX连接器服务器。 在"jmx_examples"压缩包中,可能包含了以上各个方面的代码示例,通过这些示例,读者可以更直观地理解和应用JMX...

    jdk官网下载以往版本都要注册账号。给自己传一份

    8. **JEP 321: HTTP/2 and TLS for JMX Remoting**:JMX(Java Management Extensions)的远程通信现在支持HTTP/2和TLS,提高了安全性和效率。 9. **JEP 323: Local-Variable Type Inference**:Java编译器的类型...

    monitor源码java-zabbix_java:ZabbixJavaGateway源已更新,以允许进行jmx.discovery,jbos

    监控原始Java Zabbix Java网关 描述 这是Zabbix Java Gateway的源代码,已更新为允许 jmx.discovery项(使用..."service:jmx:remoting-jmx://" + conn + ":" + port; // jboss String t3_url = "service:jmx:t3://"+co

    基於JMX的監控管理系統(源碼)(用到dwr)

    【DWR】(Direct Web Remoting)是一个JavaScript和Java之间的通信库,使得在Web页面上可以调用服务器端的Java方法,就像它们是本地JavaScript函数一样。在监控管理系统中,DWR可能用于实时更新Web界面的数据,提供...

    spring framework4

    Integration: remoting, JMS, JCA, JMX, email, tasks, scheduling, cache. Languages: Kotlin, Groovy, dynamic languages. Minimum requirements JDK 8+ for Spring Framework 5.x JDK 6+ for Spring Framework 4....

    spring jar 包详解

    `spring-jmx.jar`提供了对JMX的集成,使得Spring应用可以暴露管理接口,方便监控和管理。 #### spring-jms.jar 消息传递是企业级应用中常见的通信模式。`spring-jms.jar`为Java Messaging Service(JMS)提供了...

    JBOSS启动顺序、JBOSS占用的端口

    3. **EJB端口**:EJB3 Remoting使用的端口,默认为4447,用于远程EJB调用。 4. **JMS端口**:如果配置了HornetQ或ActiveMQ作为JMS服务器,它会占用一个或多个端口,如5445和5455(TCP)及5444(SSL)。 5. **其他...

    spring-framework完整源代码(spring框架源码)

    aop,beans,cache,context,core,dao,ejb,instument,jca,jdbc,jms,jmx,jndi,mail,metadate,mock,orm,remoting,scheduling,scripting,stereotype,test,transcation,ui,util,validation,web 以上数十子模块源码全部为...

    spring源码所需jar文件lib_2(与上一个资源spring-framework完整源代码(spring框架源码))一起使用

    aop,beans,cache,context,core,dao,ejb,instument,jca,jdbc,jms,jmx,jndi,mail,metadate,mock,orm,remoting,scheduling,scripting,stereotype,test,transcation,ui,util,validation,web 以上数十子模块源码全部为...

    Spring Recipes: A Problem-Solution Approach, Second Edition

    * Spring’s support for remoting technologies (RMI, Hessian, Burlap, and HTTP Invoker), EJB, JMS, JMX, email, batch, scheduling, and scripting languages. * Integrating legacy systems with Spring, ...

    基于hibernate/dwr框架实现的web项目

    监控和日志记录工具(如Log4j、JMX)可能被用来跟踪应用的运行状态和错误信息,以便于故障排查和性能优化。 综上所述,这个"基于Hibernate/DWR框架实现的Web项目"展示了现代Java Web开发的典型实践,融合了后端...

    Spring 2.5 jar 所有开发包及完整文档及项目开发实例

    Spring 2.0的 'spring-jmx.jar' 和 'spring-remoting.jar'已经被转移到 Spring 2.5的'spring-context.jar' (针对 JMX 和非HTTP 远程支持),部分转移到 'spring-web.jar' (针对HTTP 远程支持)。 Spring 2.0的 '...

    最新最全的spring开发包

     这个jar文件包含支持缓存Cache(ehcache)、JCA、JMX、邮件服务(Java Mail、COS Mail)、任务计划Scheduling(Timer、Quartz)方面的类。 (11) spring-web.jar  这个jar文件包含Web应用开发时,用到Spring框架...

    JAVA基础加强 --学习心得一(JAVA中常用英文单词简写释义).docx

    8. **JMX (Java Management Extensions)**:JMX是用于管理和监控Java应用程序的框架,提供了一种标准的方式来管理Java应用程序的资源。 9. **JNDI (Java Naming and Directory Interface)**:JNDI提供了一个接口,...

    SSH三大框架 整合必备jar包

    - **spring-jmx.jar**: JMX监控的支持。 每个JAR包都有其特定的功能和用途,比如`spring-context.jar`提供了对Spring上下文的支持,包括事务管理、消息源和国际化支持等功能;而`spring-jdbc.jar`则是为了方便使用...

Global site tag (gtag.js) - Google Analytics