본문 바로가기
Old Posts/Java

[Java] JMX (JavaManagement eXtension) 간단한 예제 코드

by A6K 2022. 2. 24.

JMX는 Java Management eXtention의 약자로 애플리케이션의 상태를 모니터링하고 설정을 변경할 수 있는 프레임워크다. JMX는 JDK 1.5부터 제공되기 시작했으며 많은 자바 개발자들 사이에서 사용되고 있는 기능이다.

구성

JMX 아키텍처는 3개의 레이어로 구성되어 있다.

  • Instrumentation layer (MBeans)
  • JMX agent layer (MBeanServer)
  • Remote management layer (Connector, tools)

JMX를 통해 리소스를 관리하려면 MBean이라는 Managed Beans를 생성해야한다. 이렇게 생성한 MBean을 MBeanServer에 등록하면, MBeanServer는 등록된 MBean을 관리하는 에이전트 역할을 하게 된다.

외부에서 JMX Connector를 통해 MBeanServer로 접근을 하거나 JConsole 같은 툴을 이용해서 만들어 등록한 MBean에 접근할 수 있다. 결국 JMX 사용자에게 있어서 어떤 MBean을 만들어서 등록할 것인지가 제일 중요한 관심사다.

예제

간단한 예제를 통해 MBean 객체를 생성하고 MBeanServer에 등록한 다음 JConsole을 이용해서 값을 조회해보자.

만들어 볼 예제는 1초마다 Sleep 하면서 지표 값을 하나씩 올리는 애플리케이션이다. 이 지표 값을 MBean으로 만들어 MBeanServer에 등록하고, JConsole을 통해 값을 조회해 볼 것이다.

우선 MBean을 만들자. MBean을 만들기 위해서는 무조건 인터페이스를 먼저 정의해야한다.

public interface MetricMBean {

    public long getCount();
}

이 인터페이스의 이름은 만들고자하는 모델 클래스 이름과 그 뒤에 MBean이라는 Suffix 붙여서 만들면 된다.

이 인터페이스를 구현한 지표 클래스를 만들어보자.

public class Metric implements MetricMBean {

    private long count = 0;

    @Override
    public synchronized long getCount() {
        return this.count;
    }

    public synchronized void increment() {

        this.count++;
    }
}

increment() 메서드는 지표 값을 꾸준히 증가시키고, getCount() 메서드를 이용해 현재 지표값을 가져올 수 있다.

이제 이 MBean을 MBeanServer에 등록하고, 지표를 꾸준히 증가시키는 애플리케이션을 작성해보자.

public class Main {

    public static void main(String[] args) throws MalformedObjectNameException, InstanceAlreadyExistsException, NotCompliantMBeanException, MBeanRegistrationException {

        ObjectName objectName = new ObjectName("com.dave.tutorial:type=basic,name=example");
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        Metric metric = new Metric();
        server.registerMBean(metric, objectName);

        while (!Thread.currentThread().isInterrupted()) {

            metric.increment();
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                System.out.println("Interrupted and exit");
                Thread.currentThread().interrupt();
            }
        }
    }
}

이 코드를 실행해보면 아무런 출력없이 1초마다 카운트 값을 1씩 증가시키기 시작한다.

JConsole로 접속

이제 JConsole을 이용해서 MBeanServer에 등록한 지표에 접근해보자. JConsole을 실행하자. JConsole은 JAVA_HOME의 bin 디렉토리 아래에 있다.

일단은 로컬에 띄워놨으므로 Local Process 항목에서 방금 실행시킨 Main 이라는 프로세스를 선택해 연결하자.

그러면 JVM에서 미리 정의되어 있는 여러 지표들이 모니터링된다.

이제 방금 만들어 등록한 MetricMBean 값을 조회해보자. [MBeans] 탭으로 가보면

좌측에 등록해둔 MBean을 볼 수 있다. 제일 먼저 ObjectName에 지정한 이름, 그리고 타입, 이름 순으로 나온다.

애플리케이션에서 등록한 'com.dave.tutorial:type=basic,name=example'에 해당하는 MBean을 조회할 수 있다. 현재 증가하고 있는 Count 값을 하단의 'Refresh' 버튼을 눌러가면서 조회할 수 있다.

댓글