远程调用JMX开放的方法

JMX的功能主要通过远程调用RMI来实现。本文以获取c3po连接池连接数量为例(本文对c3po稍做了修改,以便监控):具体实现如下

import java.util.HashMap;
import java.util.Map;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;


public class JmxService {
	private static final String  C3P0_REGISTRY_OBJNAME ="com.mchange.v2.c3p0:type=C3P0Registry";
	private static final String  C3P0_REGISTRY_OPERNAME ="getPooledDataSourcesIdentity";
	private String username = "controlRole";
	private String password = "123qwe";
	
	public void setUsername(String username) {
		this.username = username;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	//sign 参数类型的说明
	public Object invokeMBeanMethod(String url,String operName,Object[] params,String[] signs) throws Exception{
		JMXConnector connector = null;
		try {
			JMXServiceURL serviceURL = new JMXServiceURL(url);
			if(username == null || username.length()==0){
				//不需要权限认证的连接器
				connector = JMXConnectorFactory.connect(serviceURL);
			}else{
				Map<String,Object> environment = new HashMap<String,Object>();   
				environment.put(JMXConnector.CREDENTIALS, new String[] {username,password}); 
				connector = JMXConnectorFactory.connect(serviceURL,environment);
			}
			//得到MBean服务连接
			MBeanServerConnection connection =connector.getMBeanServerConnection();
			//调用JMX功能方法,得到返回值
			Object pdsId = connection.invoke(new ObjectName(C3P0_REGISTRY_OBJNAME), C3P0_REGISTRY_OPERNAME, new String[]{null}, new String[] {"java.lang.String"});
			String objName = "com.mchange.v2.c3p0:type=PooledDataSource["+pdsId+"]";
			Object res = connection.invoke(new ObjectName(objName), operName, params, signs);
			return res;
		} finally{
			if(connector!=null)
				connector.close();
		}
	}
	
	public static void main(String[] args)throws Exception {
		String url      = "service:jmx:rmi:///jndi/rmi://192.168.6.3:9998/jmxrmi";
		String operName = "getMaxPoolSize";
		//String operName = "allIdentityTokens";
		Object[] params = null;
		String[] signs  = null;
		
		JmxService jmxService = new JmxService();
		Object res = jmxService.invokeMBeanMethod(url,operName, params, signs);
		System.out.println(res);
	}
}

 执行结果:10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值