JMX Connectors

JMX有两种connector:

1、  RMI Connector

2、  JMXMP Connector (JMX message protocol Connector)

RMI Connector支持RMI Transports , Java Remote Method Protocol (JRMP) 和 Inter-Object Request Broker Protocol (IIOP)

下面的例子将利用 RMI Connector 在server 和client 之间建立连接 。

server的主要功能:

1、  建立 Mbean server

2、  建立 RMI connector server

Client 的主要功能:

1、  建立 RMI connector

2、  通过 RMI connector 在Mbean server 注册一个 Mbean

所包含的文件:

Server.java

SimpleStandardMBean.java

SimpleStandard.java

ClientListener.java

Client.java

运行环境:

首先去sun下载两个压缩包:

1、jmx-1_2_1-bin

2、jmxremote-1_0_1-bin

以下程序需要这两个包里面的lib/*.jar

源程序:

Server.java

import javax.management.MBeanServer;

import javax.management.MBeanServerFactory;

import javax.management.remote.JMXConnectorServer;

import javax.management.remote.JMXConnectorServerFactory;

import javax.management.remote.JMXServiceURL;

public class Server {

public static void main(String[] args) {

try {

// Instantiate the MBean server

//

System.out.println("/nCreate the MBean server");

MBeanServer mbs = MBeanServerFactory.createMBeanServer();

// Create an RMI connector server

//

System.out.println("/nCreate an RMI connector server");

JMXServiceURL url = new JMXServiceURL(

"service:jmx:rmi:///jndi/rmi://localhost:9999/server");

JMXConnectorServer cs =

JMXConnectorServerFactory.newJMXConnectorServer(

url,     //url

null,     //environment map

mbs);    //MBeanServer

// Start the RMI connector server

//

System.out.println("/nStart the RMI connector server");

cs.start();

System.out.println("/nRMI connector server successfully started");

System.out.println("/nWaiting for incoming connections...");

} catch (Exception e) {

e.printStackTrace();

}

}

}

为了便于观察Server的情况,可以在Server.java 加入 htmlAdapterServer 通过浏览器察看,具体情况为在 MBeanServer mbs = MBeanServerFactory.createMBeanServer();下面添加代码:可能这么说比较不清楚,直接把全部代码写出来吧,虽然比较多的代码让人看的不舒服了 : )

///更改后的Server.java

Server.java

/*

* Created on 2004-12-25

* @author roson

*/

import javax.management.*;

import javax.management.MBeanServerFactory;

import javax.management.remote.*;

import jmxInAction.Logger;

import com.sun.jdmk.comm.HtmlAdaptorServer;

public class Server {

public static void main(String[] args) {

try

{

System.out.println("Create the MBean server");

MBeanServer mbs=MBeanServerFactory.createMBeanServer();

System.out.println("/n/tCREATE, REGISTER and START a new HTML adaptor:");

HtmlAdaptorServer html = new HtmlAdaptorServer();

ObjectName html_name = null;

try

{

html_name = new ObjectName("Logger:name=html,port=8082");

System.out.println("/tOBJECT NAME         = " + html_name);

mbs.registerMBean(html, html_name);

}

catch(Exception e)

{

System.out.println("/t!!! Could not create the HTML adaptor !!!");

e.printStackTrace();

return;

}

html.start();

System.out.println("Create an RMI Connector server");

JMXServiceURL url=new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");

//JMXServiceURL url=new JMXServiceURL("jmxmp",null,5555);

// jmxmp与rmi connector 不同的地方

JMXConnectorServer cs=JMXConnectorServerFactory.newJMXConnectorServer(

url,           //url

null,          //environment map

mbs);          //MBeanServer

cs.start();

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

/^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 更改后的Server.java ^^^^^^^^^^^^^^^^^^^^^^^^^^

更改后就可以通过浏览器来察看Server的情况了。http://localhost:8082 为浏览器地址栏

SimpleStandardMBean.java

public interface SimpleStandardMBean {

public String getState();       //读状态State

public void setState(String s); //写状态State

public int getNbChanges();    //状态更改次数

public void reset();       //重至

}

SimpleStandard.java

import javax.management.*;

public class SimpleStandard extends NotificationBroadcasterSupport

implements SimpleStandardMBean{

private String state="initial state";

private int nbChanges=0;

private int nbResets=0;

public String getState() {

return state;

}

public void setState(String state) {

this.state=state;

nbChanges++;

}

public int getNbChanges() {

return nbChanges;

}

public void reset() {

AttributeChangeNotification acn=new AttributeChangeNotification(

this,         //source

0,                         //sequenceNumber

0,                         //timeStamp

"NbChanges reset",           //message

"NbChanges",                     //属性名

"Integer",                             //属性的类型

new Integer(nbChanges), //属性更改前的值

new Integer(0));        //属性更改后的值

state="initial state";

nbChanges=0;

nbResets++;

sendNotification(acn);

}

}

ClientListener.java

import javax.management.*;

public class ClientListener implements NotificationListener{

public void handleNotification(Notification notification, Object handback) {

System.out.println("/nReceived notification:"+notification);

}

}

Client.java

import javax.management.Attribute;

import javax.management.MBeanServerConnection;

import javax.management.MBeanServerInvocationHandler;

import javax.management.ObjectName;

import javax.management.remote.JMXConnector;

import javax.management.remote.JMXConnectorFactory;

import javax.management.remote.JMXServiceURL;

public class Client {

public static void main(String[] args) {

try {

// Create an RMI connector client and

// connect it to the RMI connector server

//

System.out.println("/nCreate an RMI connector client and " +

"connect it to the RMI connector server");

JMXServiceURL url = new JMXServiceURL(

"service:jmx:rmi:///jndi/rmi://localhost:9999/server");

//JMXServiceURL url=new JMXServiceURL("jmxmp",null,5555);

//jmxmp connector 与 rmi connector不同的地方,此时jmxp connector的端口号为5555

JMXConnector jmxc = JMXConnectorFactory.connect(url, null);

// Get an MBeanServerConnection

//

System.out.println("/nGet an MBeanServerConnection");

MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();

// Get domains from MBeanServer

//

System.out.println("/nDomains:");

String domains[] = mbsc.getDomains();

for (int i = 0; i < domains.length; i++) {

System.out.println("/tDomain[" + i + "] = " + domains[i]);

}

// Create SimpleStandard Mbean 注册了个Mbean

//

ObjectName mbeanName = new ObjectName("MBeans:type=SimpleStandard");

System.out.println("/nCreate SimpleStandard MBean...");

mbsc.createMBean("SimpleStandard", mbeanName, null, null);

// Get MBean count

//

System.out.println("/nMBean count = " + mbsc.getMBeanCount());

// Get State attribute

//

System.out.println("/nState = " +

mbsc.getAttribute(mbeanName, "State"));

// Set State attribute

//

mbsc.setAttribute(mbeanName,

new Attribute("State", "changed state"));

// Get State attribute

//

// Another way of interacting with a given MBean is through a

// dedicated proxy instead of going directly through the MBean

// server connection

//

SimpleStandardMBean proxy = (SimpleStandardMBean)

MBeanServerInvocationHandler.newProxyInstance(

mbsc,

mbeanName,

SimpleStandardMBean.class,

false);

System.out.println("/nState = " + proxy.getState());

// Add notification listener on SimpleStandard MBean

//

ClientListener listener = new ClientListener();

System.out.println("/nAdd notification listener...");

mbsc.addNotificationListener(mbeanName, listener, null, null);

// Invoke "reset" in SimpleStandard MBean

//

// Calling "reset" makes the SimpleStandard MBean emit a

// notification that will be received by the registered

// ClientListener.

//

System.out.println("/nInvoke reset() in SimpleStandard MBean...");

mbsc.invoke(mbeanName, "reset", null, null);

// Sleep for 2 seconds in order to have time to receive the

// notification before removing the notification listener.

//

System.out.println("/nWaiting for notification...");

Thread.sleep(2000);

// Remove notification listener on SimpleStandard MBean

//

System.out.println("/nRemove notification listener...");

mbsc.removeNotificationListener(mbeanName, listener);

// Unregister SimpleStandard MBean

//

System.out.println("/nUnregister SimpleStandard MBean...");

mbsc.unregisterMBean(mbeanName);

// Close MBeanServer connection

//

System.out.println("/nClose the connection to the server");

jmxc.close();

System.out.println("/nBye! Bye!");

} catch (Exception e) {

e.printStackTrace();

}

}

}

在client中注册了个Mbean 这个在命令行是看不到它所在的域名,因为是先连接Server,查看Server所有的域名,接着再注册的。不过,可以在浏览器中看到情况的变化。刷新下试试 : )

运行程序:

1、  将 运行环境 中提到的几个 jar 包放在classpath ,(我是用eclipse 来做的,觉得很方便)

2、  编译。

如果是RMI Connector 就要用 rmiregister : 在命令提示行输入:rmiregistry 9999

Jmxmp 就不需要了。

3、  运行 Server.java ,接着运行 Client.java

摘自 jmxremote-1_0_1-bin/doc/tutorial

JMX Connectors相关推荐

  1. Java管理扩展JMX入门学习

    系列文章目录 Java管理扩展JMX入门学习 Spring JMX编程学习(一)- 手动注册bean到MBeanServer Spring JMX编程学习(二)- 以Bean的方式注册MbeanSer ...

  2. spring源码分析之spring jmx

    JMX架构定义: https://docs.oracle.com/javase/8/docs/technotes/guides/jmx/overview/architecture.html Archi ...

  3. Basic Example of JMX Technology--转载

    原文地址:http://nick-lab.gs.washington.edu/java/jdk1.5b/guide/jmx/tutorial/connectors.html Basic Example ...

  4. 从零开始玩转JMX(一)——简介和Standard MBean

    JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展.这种机制可以方便的管理.监控正在运行中的Java程序.常用于管理线程,内存,日志Level,服 ...

  5. tomcat(20)基于JMX的管理

    [0]README 1)本文部分文字描述转自:"深入剖析tomcat",旨在学习"tomcat(20)基于JMX的管理"的相关知识: 2)晚辈我在tomcat上 ...

  6. ActiveMQ学习-Network connectors(1)

    本文为network connectors的static connector学习笔记. Network connectors broker网络能够创建多个相互连接的ActiveMq实例组成的簇,以应对 ...

  7. JMX configuration for Tomcat

    Window下执行步骤: D:\apache-tomcat-7.0.57\bin\catalina.bat set CATALINA_OPTS=-Dcom.sun.management.jmxremo ...

  8. 《Presto(Trino)——The Definitive Guide》CHAPTER 6 Connectors Advanced CHAPTER 7 Connector Examples

    Presto(暂译:普雷斯托)系列文章目录-CHAPTER 6 Connectors This book provides a great introduction to Presto and tea ...

  9. JMX学习笔记(四) JMX RMI

    连接器概念: JMX规范定义了连接器的概念(Connectors),连接器位于JMX的3层构架中的分布式服务层.连接器负责建立MBean服务器和管理应用之间的通信.连接器由一个驻留在代理层的连接器服务 ...

最新文章

  1. [hadoop新实战2]hadoop伪分布式安装序列(支持ubuntu和redhat)
  2. 建议CSDN增加谈恋爱专区
  3. pat 1025 反转链表
  4. 九度OJ #1437 To Fill or Not to Fil
  5. SVM支持向量机-手写笔记(超详细:拉格朗日乘数法、KKT条件、对偶性质、最优化、合页损失、核函数...)
  6. 专心写即时通讯软件争取CSDN认证专家
  7. CSS3径向渐变radial-gradient实现波浪边框和内倒角
  8. 非root用户安装或升级CUDA和CUDNN版本
  9. vue2.0和3.0引入阿里字体图标库的步骤
  10. offer收割者!Alibaba内部独家MySQL优化宝典横空出世,再也不用担心被面试官拦路了
  11. 求刷百度相关词的方法
  12. 【学习笔记】计算机基础知识
  13. tensorbook深度学习笔记本电脑
  14. CSS 垂直对齐vertical-align属性
  15. 欧格电商:商家延迟发货有什么影响
  16. 关于物联网通信协议(接入协议)
  17. C#:CAN通讯上位机的简单示例Ⅱ
  18. Chrony与NTP对比
  19. 马斯京根法matlab程序,(一)马斯京根流量演算法
  20. Flutter仿微信,支付宝密码输入框+自定义键盘

热门文章

  1. 肿瘤免疫新抗原鉴定(一)OptiType安装与运行
  2. Blazor Web Assembly (WASM) 主题切换
  3. js replace() 使用
  4. 安全网络通信(SSLJSSE)
  5. win7手动恢复注册表
  6. 智慧化工厂安全风险生产预警系统软件
  7. 音乐音频 | openSMILE提取音频需要掌握的知识
  8. LUN详解 iscsi
  9. 1231231312
  10. 客户端访问https时应无浏览器(含终端)安全警告信息;_Http升级Https(Let#x27;s Encrypt)...