jmx學習筆記三

在MBean中有隻要遵循以下兩個規則,我們就可以在jconsole中動態的改變MBean中的屬性值

1. JMX中要定義接口必須以xxxMBean的規範定義

2. 得有類實現xxxMBean接口

 

例如:

 

Java代碼 複製代碼 收藏代碼
  1. package com.haitao.jmx.mxbean;   
  2.   
  3. /**  
  4.  * Server Configure MBean  
  5.  *   
  6.  * @author haitao.tu  
  7.  *  
  8.  */  
  9. public interface ServerConfigureMBean {   
  10.   
  11.     public int getPort();   
  12.   
  13.     public void setPort(int port);   
  14.   
  15.     public String getHost();   
  16.   
  17.     public void setHost(String host);   
  18.   
  19.     public int getMaxThread();   
  20.   
  21.     public void setMaxThread(int maxThread);   
  22.   
  23.     public int getMinThread();   
  24.   
  25.     public void setMinThread(int minThread);   
  26.        
  27. }  
package com.haitao.jmx.mxbean;

/**
 * Server Configure MBean
 * 
 * @author haitao.tu
 *
 */
public interface ServerConfigureMBean {

	public int getPort();

	public void setPort(int port);

	public String getHost();

	public void setHost(String host);

	public int getMaxThread();

	public void setMaxThread(int maxThread);

	public int getMinThread();

	public void setMinThread(int minThread);
	
}

 

 

接着實現這個MBean:

 

 

Java代碼 複製代碼 收藏代碼
  1. package com.haitao.jmx.mxbean;   
  2.   
  3.   
  4. /**  
  5.  * Server Configure  
  6.  *   
  7.  * @author haitao.tu  
  8.  *  
  9.  */  
  10. public class ServerConfigure implements ServerConfigureMBean {   
  11.   
  12.     private int port;   
  13.        
  14.     private String host;   
  15.        
  16.     private int maxThread;   
  17.        
  18.     private int minThread;   
  19.        
  20.     public ServerConfigure(int port, String host, int maxThread, int minThread) {   
  21.         this.port = port;   
  22.         this.host = host;   
  23.         this.maxThread = maxThread;   
  24.         this.minThread = minThread;   
  25.     }   
  26.   
  27.     public int getPort() {   
  28.         return port;   
  29.     }   
  30.   
  31.     public void setPort(int port) {   
  32.         this.port = port;   
  33.     }   
  34.   
  35.     public String getHost() {   
  36.         return host;   
  37.     }   
  38.   
  39.     public void setHost(String host) {   
  40.         this.host = host;   
  41.     }   
  42.   
  43.     public int getMaxThread() {   
  44.         return maxThread;   
  45.     }   
  46.   
  47.     public void setMaxThread(int maxThread) {   
  48.         this.maxThread = maxThread;   
  49.     }   
  50.   
  51.     public int getMinThread() {   
  52.         return minThread;   
  53.     }   
  54.   
  55.     public void setMinThread(int minThread) {   
  56.         this.minThread = minThread;   
  57.     }   
  58.        
  59. }  
package com.haitao.jmx.mxbean;


/**
 * Server Configure
 * 
 * @author haitao.tu
 *
 */
public class ServerConfigure implements ServerConfigureMBean {

	private int port;
	
	private String host;
	
	private int maxThread;
	
	private int minThread;
	
	public ServerConfigure(int port, String host, int maxThread, int minThread) {
		this.port = port;
		this.host = host;
		this.maxThread = maxThread;
		this.minThread = minThread;
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public String getHost() {
		return host;
	}

	public void setHost(String host) {
		this.host = host;
	}

	public int getMaxThread() {
		return maxThread;
	}

	public void setMaxThread(int maxThread) {
		this.maxThread = maxThread;
	}

	public int getMinThread() {
		return minThread;
	}

	public void setMinThread(int minThread) {
		this.minThread = minThread;
	}
	
}

 

測試:

 

Java代碼 複製代碼 收藏代碼
  1. package com.haitao.jmx.mxbean;   
  2.   
  3. import java.lang.management.ManagementFactory;   
  4.   
  5. import javax.management.MBeanServer;   
  6. import javax.management.ObjectName;   
  7.   
  8. /**  
  9.  * Server Test  
  10.  *   
  11.  * @author haitao.tu  
  12.  *  
  13.  */  
  14. public class ServerTest {   
  15.   
  16.     public static void main(String[] args) throws Exception {   
  17.         testServerConfigureMBean();   
  18.     }   
  19.        
  20.     public static void testServerConfigureMBean() throws Exception {   
  21.         MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();   
  22.   
  23.         ServerConfigure serverConfigure = new ServerConfigure(8080,   
  24.                 "test.haitao.com"20100);   
  25.   
  26.         ObjectName serverName = new ObjectName(   
  27.                 "com.haitao.jmx.mxbean:type=ServerConfigure");   
  28.         mbs.registerMBean(serverConfigure, serverName);   
  29.         System.out.println("Waiting...");   
  30.         Thread.sleep(Long.MAX_VALUE);   
  31.     }   
  32.   
  33. }  
package com.haitao.jmx.mxbean;

import java.lang.management.ManagementFactory;

import javax.management.MBeanServer;
import javax.management.ObjectName;

/**
 * Server Test
 * 
 * @author haitao.tu
 *
 */
public class ServerTest {

	public static void main(String[] args) throws Exception {
		testServerConfigureMBean();
	}
	
	public static void testServerConfigureMBean() throws Exception {
		MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

		ServerConfigure serverConfigure = new ServerConfigure(8080,
				"test.haitao.com", 20, 100);

		ObjectName serverName = new ObjectName(
				"com.haitao.jmx.mxbean:type=ServerConfigure");
		mbs.registerMBean(serverConfigure, serverName);
		System.out.println("Waiting...");
		Thread.sleep(Long.MAX_VALUE);
	}

}

 

打開jconsole:

 

但是以上這些ServerConfigure的屬性都是基本類型,包含在java.lang.*裏,設想,如果說jconsole在類外一個遠端的jvm上,如果這裏的屬性是一個自定義對象,遠端的jvm可能不知道該類型的對象:

 

修改上邊的ServerConfigre,使他成爲一個聚合對象,去掉ServerConfigureMBean接口實現:

 

 

Java代碼 複製代碼 收藏代碼
  1. package com.haitao.jmx.mxbean;   
  2.   
  3.   
  4. /**  
  5.  * Server Configure  
  6.  *   
  7.  * @author haitao.tu  
  8.  *  
  9.  */  
  10. public class ServerConfigure {   
  11.   
  12.     private int port;   
  13.        
  14.     private String host;   
  15.        
  16.     private int maxThread;   
  17.        
  18.     private int minThread;   
  19.        
  20.     public ServerConfigure(int port, String host, int maxThread, int minThread) {   
  21.         this.port = port;   
  22.         this.host = host;   
  23.         this.maxThread = maxThread;   
  24.         this.minThread = minThread;   
  25.     }   
  26.   
  27.     public int getPort() {   
  28.         return port;   
  29.     }   
  30.   
  31.     public void setPort(int port) {   
  32.         this.port = port;   
  33.     }   
  34.   
  35.     public String getHost() {   
  36.         return host;   
  37.     }   
  38.   
  39.     public void setHost(String host) {   
  40.         this.host = host;   
  41.     }   
  42.   
  43.     public int getMaxThread() {   
  44.         return maxThread;   
  45.     }   
  46.   
  47.     public void setMaxThread(int maxThread) {   
  48.         this.maxThread = maxThread;   
  49.     }   
  50.   
  51.     public int getMinThread() {   
  52.         return minThread;   
  53.     }   
  54.   
  55.     public void setMinThread(int minThread) {   
  56.         this.minThread = minThread;   
  57.     }   
  58.        
  59. }  
package com.haitao.jmx.mxbean;


/**
 * Server Configure
 * 
 * @author haitao.tu
 *
 */
public class ServerConfigure {

	private int port;
	
	private String host;
	
	private int maxThread;
	
	private int minThread;
	
	public ServerConfigure(int port, String host, int maxThread, int minThread) {
		this.port = port;
		this.host = host;
		this.maxThread = maxThread;
		this.minThread = minThread;
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public String getHost() {
		return host;
	}

	public void setHost(String host) {
		this.host = host;
	}

	public int getMaxThread() {
		return maxThread;
	}

	public void setMaxThread(int maxThread) {
		this.maxThread = maxThread;
	}

	public int getMinThread() {
		return minThread;
	}

	public void setMinThread(int minThread) {
		this.minThread = minThread;
	}
	
}
 

新建一個ServerMBean接口:

 

Java代碼 複製代碼 收藏代碼
  1. package com.haitao.jmx.mxbean;   
  2.   
  3. /**  
  4.  * Server MBean  
  5.  *   
  6.  * @author haitao.tu  
  7.  *  
  8.  */  
  9. public interface ServerMBean {   
  10.        
  11.     public ServerConfigure getServerConfigure();   
  12.        
  13.     public void setServerConfigure(ServerConfigure serverConfigure);   
  14.        
  15.     public void defaultServerConfigure();   
  16.        
  17. }  
package com.haitao.jmx.mxbean;

/**
 * Server MBean
 * 
 * @author haitao.tu
 *
 */
public interface ServerMBean {
	
	public ServerConfigure getServerConfigure();
	
	public void setServerConfigure(ServerConfigure serverConfigure);
	
	public void defaultServerConfigure();
	
}

 

實現ServerMBean並封裝ServerConfigure類:

 

Java代碼 複製代碼 收藏代碼
  1. package com.haitao.jmx.mxbean;   
  2.   
  3. /**  
  4.  * Server  
  5.  *   
  6.  * @author haitao.tu  
  7.  *  
  8.  */  
  9. public class Server implements ServerMBean {   
  10.        
  11.     /**  
  12.      * 封裝  
  13.      */  
  14.     private ServerConfigure serverConfigure;   
  15.        
  16.     public Server(ServerConfigure serverConfigure) {   
  17.         this.serverConfigure = serverConfigure;   
  18.     }   
  19.        
  20.     @Override  
  21.     public ServerConfigure getServerConfigure() {   
  22.         synchronized (serverConfigure) {   
  23.             return this.serverConfigure;   
  24.         }   
  25.     }   
  26.        
  27.     @Override  
  28.     public void setServerConfigure(ServerConfigure serverConfigure) {   
  29.         synchronized (serverConfigure) {   
  30.             this.serverConfigure = serverConfigure;   
  31.         }   
  32.     }   
  33.        
  34.     @Override  
  35.     public void defaultServerConfigure() {   
  36.         synchronized (serverConfigure) {   
  37.             serverConfigure.setPort(80);   
  38.             serverConfigure.setHost("www.haitao.com");   
  39.             serverConfigure.setMinThread(10);   
  40.             serverConfigure.setMaxThread(500);   
  41.         }   
  42.     }   
  43.        
  44. }  
package com.haitao.jmx.mxbean;

/**
 * Server
 * 
 * @author haitao.tu
 *
 */
public class Server implements ServerMBean {
	
	/**
	 * 封裝
	 */
	private ServerConfigure serverConfigure;
	
	public Server(ServerConfigure serverConfigure) {
		this.serverConfigure = serverConfigure;
	}
	
	@Override
	public ServerConfigure getServerConfigure() {
		synchronized (serverConfigure) {
			return this.serverConfigure;
		}
	}
	
	@Override
	public void setServerConfigure(ServerConfigure serverConfigure) {
		synchronized (serverConfigure) {
			this.serverConfigure = serverConfigure;
		}
	}
	
	@Override
	public void defaultServerConfigure() {
		synchronized (serverConfigure) {
			serverConfigure.setPort(80);
			serverConfigure.setHost("www.haitao.com");
			serverConfigure.setMinThread(10);
			serverConfigure.setMaxThread(500);
		}
	}
	
}

 

測試:

 

Java代碼 複製代碼 收藏代碼
  1. package com.haitao.jmx.mxbean;   
  2.   
  3. import java.lang.management.ManagementFactory;   
  4.   
  5. import javax.management.MBeanServer;   
  6. import javax.management.ObjectName;   
  7.   
  8. /**  
  9.  * Server Test  
  10.  *   
  11.  * @author haitao.tu  
  12.  *  
  13.  */  
  14. public class ServerTest {   
  15.   
  16.     public static void main(String[] args) throws Exception {   
  17.         testServerMBean();   
  18.     }   
  19.        
  20.     public static void testServerMBean() throws Exception {   
  21.         MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();   
  22.   
  23.         ServerConfigure serverConfigure = new ServerConfigure(8080,   
  24.                 "test.haitao.com"20100);   
  25.   
  26.         Server server = new Server(serverConfigure);   
  27.   
  28.         ObjectName serverName = new ObjectName(   
  29.                 "com.haitao.jmx.mxbean:type=Server");   
  30.         mbs.registerMBean(server, serverName);   
  31.         System.out.println("Waiting...");   
  32.         Thread.sleep(Long.MAX_VALUE);   
  33.     }   
  34.   
  35. }  
package com.haitao.jmx.mxbean;

import java.lang.management.ManagementFactory;

import javax.management.MBeanServer;
import javax.management.ObjectName;

/**
 * Server Test
 * 
 * @author haitao.tu
 *
 */
public class ServerTest {

	public static void main(String[] args) throws Exception {
		testServerMBean();
	}
	
	public static void testServerMBean() throws Exception {
		MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

		ServerConfigure serverConfigure = new ServerConfigure(8080,
				"test.haitao.com", 20, 100);

		Server server = new Server(serverConfigure);

		ObjectName serverName = new ObjectName(
				"com.haitao.jmx.mxbean:type=Server");
		mbs.registerMBean(server, serverName);
		System.out.println("Waiting...");
		Thread.sleep(Long.MAX_VALUE);
	}

}

 

打開jconsole查看:

 

爲了讓與遠端JVM認識該對象,我們需要將ServerMbean改爲ServerMXBean,並使用java.beans.ConstructorProperties註解告訴JVM怎樣組裝該對象:

 

1. 使用java.beans.ConstructorProperties註解:

 

Java代碼 複製代碼 收藏代碼
  1. package com.haitao.jmx.mxbean;   
  2.   
  3. import java.beans.ConstructorProperties;   
  4.   
  5. /**  
  6.  * Server Configure  
  7.  *   
  8.  * @author haitao.tu  
  9.  *  
  10.  */  
  11. public class ServerConfigure {   
  12.   
  13.     private int port;   
  14.        
  15.     private String host;   
  16.        
  17.     private int maxThread;   
  18.        
  19.     private int minThread;   
  20.        
  21.     /**  
  22.      * 加入@ConstructorPropertiesz註解  
  23.      */  
  24.     @ConstructorProperties({"port""host""maxThread""minThread"})   
  25.     public ServerConfigure(int port, String host, int maxThread, int minThread) {   
  26.         this.port = port;   
  27.         this.host = host;   
  28.         this.maxThread = maxThread;   
  29.         this.minThread = minThread;   
  30.     }   
  31.   
  32.     public int getPort() {   
  33.         return port;   
  34.     }   
  35.   
  36.     public void setPort(int port) {   
  37.         this.port = port;   
  38.     }   
  39.   
  40.     public String getHost() {   
  41.         return host;   
  42.     }   
  43.   
  44.     public void setHost(String host) {   
  45.         this.host = host;   
  46.     }   
  47.   
  48.     public int getMaxThread() {   
  49.         return maxThread;   
  50.     }   
  51.   
  52.     public void setMaxThread(int maxThread) {   
  53.         this.maxThread = maxThread;   
  54.     }   
  55.   
  56.     public int getMinThread() {   
  57.         return minThread;   
  58.     }   
  59.   
  60.     public void setMinThread(int minThread) {   
  61.         this.minThread = minThread;   
  62.     }   
  63.        
  64. }  
package com.haitao.jmx.mxbean;

import java.beans.ConstructorProperties;

/**
 * Server Configure
 * 
 * @author haitao.tu
 *
 */
public class ServerConfigure {

	private int port;
	
	private String host;
	
	private int maxThread;
	
	private int minThread;
	
	/**
	 * 加入@ConstructorPropertiesz註解
	 */
	@ConstructorProperties({"port", "host", "maxThread", "minThread"})
	public ServerConfigure(int port, String host, int maxThread, int minThread) {
		this.port = port;
		this.host = host;
		this.maxThread = maxThread;
		this.minThread = minThread;
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public String getHost() {
		return host;
	}

	public void setHost(String host) {
		this.host = host;
	}

	public int getMaxThread() {
		return maxThread;
	}

	public void setMaxThread(int maxThread) {
		this.maxThread = maxThread;
	}

	public int getMinThread() {
		return minThread;
	}

	public void setMinThread(int minThread) {
		this.minThread = minThread;
	}
	
}

 2. 修改ServerMbean爲ServerMXBean:

 

Java代碼 複製代碼 收藏代碼
  1. package com.haitao.jmx.mxbean;   
  2.   
  3. /**  
  4.  * Server MXBean  
  5.  *   
  6.  * @author haitao.tu  
  7.  *  
  8.  */  
  9. public interface ServerMXBean {   
  10.        
  11.     public ServerConfigure getServerConfigure();   
  12.        
  13.     public void setServerConfigure(ServerConfigure serverConfigure);   
  14.        
  15.     public void defaultServerConfigure();   
  16.        
  17. }  
package com.haitao.jmx.mxbean;

/**
 * Server MXBean
 * 
 * @author haitao.tu
 *
 */
public interface ServerMXBean {
	
	public ServerConfigure getServerConfigure();
	
	public void setServerConfigure(ServerConfigure serverConfigure);
	
	public void defaultServerConfigure();
	
}
 

測試代碼一樣,就不再重複,最後運行測試,查看jconsole:

 

 

雙擊值,我們將會看到:

 

實際上MXBean的概念很簡單,就是定義xxxMXBean接口,然後實現這個接口,與MBean類似,

 

爲了闡述這個MXBean與MBean的不同才列出這麼多代碼,希望大家能理解:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章