天天看點

JMXReport實作

文章目錄

      • 實作名額
      • 注冊MBean
      • JMXServer
      • JMXReport
      • JmxRequest
      • 總結
最近看kafka,flink源碼發現,監控名額都是通過jmx進行上報的,于是我也決定自己實作一個

流程圖

JMXReport實作

實作名額

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.很多分布式系統都通過這種方式上報監控資料,值得我們在工作中學習借鑒。

繼續閱讀