package org.springside.examples.showcase.jmx.client;
import java.io.IOException;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import org.springside.examples.showcase.jmx.server.ServerConfigMBean;
import org.springside.modules.utils.jmx.JmxClientTemplate;
/**
* JMX客户端对服务端访问的封装.
*
* 分别演示标准MBean代理及无MBean的Class文件时直接反射读取属性/调用方法两种场景.
*
* @author ben
* @author calvin
*/
public class JmxClientService {
public static final String TRACE_MBEAN_NAME = "Showcase:name=trace,type=Trace";
private static Logger logger = LoggerFactory.getLogger(JmxClientService.class);
//-- 可注入的连接参数 --//
private String host;
private String port;
private String userName;
private String passwd;
//-- JMX客户端及Mbean代理 --//
private JmxClientTemplate jmxClientTemplate;
private ServerConfigMBean serverConfigMBean;
//-- 连接参数设定函数 --//
public void setHost(String host) {
this.host = host;
}
public void setPort(String port) {
this.port = port;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
//-- 连接与断开远程连接 --//
/**
* 连接JMX Server并创建本地的MBean代理.
*/
@PostConstruct
public void init() {
Assert.hasText(host, "host参数不能为空");
Assert.hasText(port, "port参数不能为空");
try {
String serviceUrl = "service:jmx:rmi:///jndi/rmi://" + host + ":" + port + "/jmxrmi";
jmxClientTemplate = new JmxClientTemplate(serviceUrl, userName, passwd);
serverConfigMBean = jmxClientTemplate.createMBeanProxy(ServerConfigMBean.SERVER_CONFIG_MBEAN_NAME,
ServerConfigMBean.class);
} catch (Exception e) {
logger.error("连接Jmx Server 或 创建Mbean Proxy时失败", e);
}
}
/**
* 断开JMX连接.
*/
@PreDestroy
public void close() throws IOException {
jmxClientTemplate.close();
}
//-- 标准MBean代理操作演示 --//
/**
* 获取节点名.
*/
public String getNodeName() {
return serverConfigMBean.getNodeName();
}
/**
* 设置节点名.
*/
public void setNodeName(String nodeName) {
serverConfigMBean.setNodeName(nodeName);
}
/**
* 获取是否发送通知邮件.
*/
public boolean isNotificationMailEnabled() {
return serverConfigMBean.isNotificationMailEnabled();
}
/**
* 设置是否发送通知邮件.
*/
public void setNotificationMailEnabled(boolean notificationMailEnabled) {
serverConfigMBean.setNotificationMailEnabled(notificationMailEnabled);
}
//-- 无MBean的Class文件时直接访问属性调用方法的演示 --//
/**
* 获取TraceMBean的是否已打开Trace属性.
*/
public Boolean getTraceStatus() {
return (Boolean) jmxClientTemplate.getAttribute(TRACE_MBEAN_NAME, "TraceStatus");
}
/**
* 调用TraceMBean的startTrace函数.
*/
public void startTrace() {
jmxClientTemplate.inoke(TRACE_MBEAN_NAME, "startTrace");
}
/**
* 调用TraceMBean的stopTrace函数.
*/
public void stopTrace() {
jmxClientTemplate.inoke(TRACE_MBEAN_NAME, "stopTrace");
}
}