通过Jmx访问MBean的两种方式:本机和远程

通过Jmx访问MBean的两种方式:本机和远程,代码示例如下:

//begin/

public class JmxInvocationClient {

private static String queueName = "CND_00_21_CC_C3_06_20_";
private String strHostAndPortOfJmxUrl = "localhost:1099";
private String strJmxUrl = null;
private String strMbeanName = null;
private static boolean enableDebug = false;
private static String strJmxUrlFromSystem = null;
private static final String LOCAL_BROKER_NAME = "LOCAL_BROKER_NAME";
private static final String LOCAL_JMX_URL = "LOCAL_JMX_URL";
private static String jmxUser;
private static String jmxPassword;
private JMXServiceURL jmxServiceUrl;
private boolean jmxUseLocal = false;
private JMXConnector jmxConnector;
private MBeanServerConnection jmxConnection;

public static Log logger = LogFactory.getLog(JmxInvocationClient.class);

static {
enableDebug = Boolean.parseBoolean(System.getProperty("IS_DEBUG"));
strJmxUrlFromSystem = System.getProperty(LOCAL_JMX_URL);
queueName = queueName + System.getProperty(LOCAL_BROKER_NAME);
jmxUser = System.getProperty("emq.jmx.user");
jmxPassword = System.getProperty("emq.jmx.password");
}

public JmxInvocationClient() {
}

public JmxInvocationClient(final String paramHostAndPortOfJmxUrl) {
this.strHostAndPortOfJmxUrl = paramHostAndPortOfJmxUrl;
}

private void initParam() {
// 构造jmx url
StringBuffer sb = new StringBuffer(512);
sb.append("service:jmx:rmi:///jndi/rmi://");
sb.append(strHostAndPortOfJmxUrl);
sb.append("/jmxrmi");

this.strJmxUrl = sb.toString();
sb = null;

// 构造mbean的过滤名称
StringBuffer sbForMbean = new StringBuffer(512);
sbForMbean.append(",Type=Queue,Destination=");
sbForMbean.append(queueName);

this.strMbeanName = sbForMbean.toString();
sbForMbean = null;
}

private void initConn(final String paramJmxUrl) {
try {
this.jmxServiceUrl = new JMXServiceURL(paramJmxUrl);
} catch (MalformedURLException mue) {
mue.printStackTrace();
}
}

/**
* @return JMX service url
*/
private JMXServiceURL getJmxServiceUrl() {
return jmxServiceUrl;
}

/**
* Create a JMX connector
*
* @return created JMX connector
* @throws IOException
*/
private JMXConnector createJmxConnector() throws IOException {
// Reuse the previous connection
if (jmxConnector != null) {
jmxConnector.connect();
return jmxConnector;
}

// Create a new JMX connector
// Decide whether need security authentication or not
if (jmxUser != null && jmxPassword != null) {
Map<String, Object> props = new HashMap<String, Object>();
props.put(JMXConnector.CREDENTIALS, new String[] { jmxUser,
jmxPassword });
jmxConnector = JMXConnectorFactory.connect(this.getJmxServiceUrl(),
props);
} else {
jmxConnector = JMXConnectorFactory.connect(this.getJmxServiceUrl());
}
return jmxConnector;
}

/**
* Close the current JMX connector
*/
private void closeJmxConnection() {
try {
if (jmxConnector != null) {
jmxConnector.close();
jmxConnector = null;
}
} catch (IOException e) {
logger.error("An exception occurs when closing the JMX connector:");
e.printStackTrace();
}
}

/**
* Create a JMX connection
*/
private MBeanServerConnection createJmxConnection() throws IOException {
if (jmxConnection == null) {
if (isJmxUseLocal()) {
jmxConnection = ManagementFactory.getPlatformMBeanServer();
} else {
jmxConnection = createJmxConnector().getMBeanServerConnection();
}
}
return jmxConnection;
}

/**
* @param paramMsgId
* message id
* @return 0:no operate;1:success;2:failure;3:error;
*/
public int deleteMsgFromQueue(final String paramMsgId,
final boolean isJmxFromSystem) {

int flag = 0;

if (paramMsgId == null || paramMsgId.trim().length() == 0) {
return flag;
}

this.initParam();
this.initConn(isJmxFromSystem ? strJmxUrlFromSystem : this.strJmxUrl);
try {
this.createJmxConnection();
// 1.动态获取mbean的objectname
String strObjectName = "";

Iterator iter = this.jmxConnection.queryMBeans(null, null)
.iterator();
for (; iter != null && iter.hasNext();) {
ObjectInstance oi = (ObjectInstance) iter.next();
if (enableDebug) {
System.out.println("=Mbean ObjectName is:="
+ oi.getObjectName() + "=end=");
}
if (oi.getObjectName() != null
&& oi.getObjectName().toString().indexOf(
this.strMbeanName) >= 0) {
strObjectName = oi.getObjectName().toString();
break;
}
}

// 2.构造mbean对象
ObjectName mbeanName = new ObjectName(strObjectName);

// 3.得到proxy代理后直接调用的方式
QueueViewMBean proxy = (QueueViewMBean) MBeanServerInvocationHandler
.newProxyInstance(this.jmxConnection, mbeanName,
QueueViewMBean.class, false);

try {
if (proxy.removeMessage(paramMsgId)) {
flag = 1;
} else {
flag = 2;
}
} catch (Exception e) {
flag = 3;
// e.printStackTrace();
}

} catch (MalformedURLException mue) {
mue.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (MalformedObjectNameException mone) {
mone.printStackTrace();
}
this.closeJmxConnection();
return flag;
}

public static void main(String[] args) {

JmxInvocationClient test = new JmxInvocationClient();
if (false) {
String strMsgId = "111";
int result = test.deleteMsgFromQueue(strMsgId, false);
System.out.println("=result is:=" + result + "=end=");
}

}

public boolean isJmxUseLocal() {
return jmxUseLocal;
}

public void setJmxUseLocal(boolean jmxUseLocal) {
this.jmxUseLocal = jmxUseLocal;
}

}

//end/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值