文章目錄
-
-
- 實作名額
- 注冊MBean
- JMXServer
- JMXReport
- JmxRequest
- 總結
-
最近看kafka,flink源碼發現,監控名額都是通過jmx進行上報的,于是我也決定自己實作一個
流程圖
實作名額
Metrix
public interface Metric {
}
Meter
public interface Meter extends Metric {
/**
* Mark occurrence of an event.
*/
void markEvent();
}
MeterView
public class MeterView implements Meter {
private long count;
// 名額增長方式
public void markEvent() {
count++;
}
public Long getCount(){
return count;
}
}
注冊MBean
JmxMetricMBean
public interface JmxMetricMBean {
// 方法規範
public long getCount();
public void setCount();
}
JmxMetric
// 類名必須為JmxMetric,MBean的規範
public class JmxMetric implements JmxMetricMBean {
MeterView meterView;
public JmxMetric() {
meterView = new MeterView();
}
// 屬性為Count
public long getCount() {
return meterView.getCount();
}
public void setCount(){
}
}
JMXServer
public class JmxService {
private Registry rmiRegistry;
private JMXConnectorServer connector;
public void start() {
try {
startRmiRegistry();
startJmxService();
} catch (IOException e) {
e.printStackTrace();
}
}
private void startJmxService() throws IOException {
String serviceUrl = "service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi";
JMXServiceURL url;
try {
url = new JMXServiceURL(serviceUrl);
} catch (MalformedURLException e) {
throw new IllegalArgumentException("Malformed service url created " + serviceUrl, e);
}
connector = JMXConnectorServerFactory.newJMXConnectorServer(url, null, ManagementFactory.getPlatformMBeanServer());
connector.start();
}
private void startRmiRegistry() throws IOException {
rmiRegistry = LocateRegistry.createRegistry(9999);
}
}
JMXReport
public class JmxReport {
private final MBeanServer mBeanServer;
public JmxReport() {
this.mBeanServer = ManagementFactory.getPlatformMBeanServer();
}
public void init(){
JmxService service = new JmxService();
service.start();
}
public void addMetric() {
JmxMetric bean = new JmxMetric();
try {
// objectName按照規範走
ObjectName name = new ObjectName("com.test:type=JmxMeter");
try {
// 注冊MBean
mBeanServer.registerMBean(bean, name);
//模拟名額增長
start(bean);
} catch (InstanceAlreadyExistsException e) {
e.printStackTrace();
} catch (MBeanRegistrationException e) {
e.printStackTrace();
} catch (NotCompliantMBeanException e) {
e.printStackTrace();
}
} catch (MalformedObjectNameException e) {
e.printStackTrace();
}
}
public void start(JmxMetric bean) {
while (true) {
bean.meterView.markEvent();
System.out.println("aa");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
JmxRequest
public class JmxRequest {
public static void main(String[] args) {
String urlString = "service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi";
try {
JMXServiceURL serviceURL = new JMXServiceURL(urlString);
JMXConnector connect = JMXConnectorFactory.connect(serviceURL);
MBeanServerConnection mBeanServerConnection = connect.getMBeanServerConnection();
//和注冊的一一對應
ObjectName name = new ObjectName("com.test:type=JmxMetric");
String va[] = {"Count"};
AttributeList attributes = mBeanServerConnection.getAttributes(name, va);
for (int i = 0; i < attributes.size(); i++) {
System.out.println(attributes.get(i));
}
} catch (IOException e) {
e.printStackTrace();
} catch (InstanceNotFoundException e) {
e.printStackTrace();
} catch (ReflectionException e) {
e.printStackTrace();
} catch (MalformedObjectNameException e) {
e.printStackTrace();
}
}
}
總結
1.很多分布式系統都通過這種方式上報監控資料,值得我們在工作中學習借鑒。