수색…


소개

JMX 기술은 장치, 응용 프로그램 및 서비스 중심 네트워크를 관리하고 모니터링하기위한 분산 형 웹 기반 모듈 식 동적 솔루션을 구축하기위한 도구를 제공합니다. 설계 상으로,이 표준은 레거시 시스템을 적용하고, 새로운 관리 및 모니터링 솔루션을 구현하고, 미래의 시스템에 연결하는 데 적합합니다.

플랫폼 MBean 서버의 간단한 예

새로운 사용자를 등록하고 메시지를 써주는 서버가 있다고 가정 해 봅시다. 우리는이 서버를 모니터링하고 매개 변수 중 일부를 변경하려고합니다.

첫째, 우리는 우리의 감시 및 통제 방법들과의 인터페이스가 필요하다.

public interface UserCounterMBean {
    long getSleepTime();

    void setSleepTime(long sleepTime);

    int getUserCount();

    void setUserCount(int userCount);

    String getGreetingString();

    void setGreetingString(String greetingString);

    void stop();
}

그리고 그것이 작동하는 방법과 우리가 그것에 영향을 미치는 방법을 볼 수있는 간단한 구현

public class UserCounter implements UserCounterMBean, Runnable {
    private AtomicLong sleepTime = new AtomicLong(10000);
    private AtomicInteger userCount = new AtomicInteger(0);
    private AtomicReference<String> greetingString = new AtomicReference<>("welcome");
    private AtomicBoolean interrupted = new AtomicBoolean(false);

    @Override
    public long getSleepTime() {
        return sleepTime.get();
    }

    @Override
    public void setSleepTime(long sleepTime) {
        this.sleepTime.set(sleepTime);
    }

    @Override
    public int getUserCount() {
        return userCount.get();
    }

    @Override
    public void setUserCount(int userCount) {
        this.userCount.set(userCount);
    }

    @Override
    public String getGreetingString() {
        return greetingString.get();
    }

    @Override
    public void setGreetingString(String greetingString) {
        this.greetingString.set(greetingString);
    }

    @Override
    public void stop() {
        this.interrupted.set(true);
    }

    @Override
    public void run() {
        while (!interrupted.get()) {
            try {
                System.out.printf("User %d, %s%n", userCount.incrementAndGet(), greetingString.get());
                Thread.sleep(sleepTime.get());
            } catch (InterruptedException ignored) {
            }
        }
    }
}

로컬 또는 원격 관리를 사용하는 간단한 예제의 경우 MBean을 등록해야합니다.

import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;

public class Main {
    public static void main(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, InterruptedException {
        final UserCounter userCounter = new UserCounter();
        final MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
        final ObjectName objectName = new ObjectName("ServerManager:type=UserCounter");
        mBeanServer.registerMBean(userCounter, objectName);

        final Thread thread = new Thread(userCounter);
        thread.start();
        thread.join();
    }
}

그 다음에는 $JAVA_HOME/bin 디렉토리에있는 jConsole을 통해 응용 프로그램을 실행하고이 응용 프로그램에 연결할 수 있습니다. 첫째, 우리는 우리의 애플리케이션으로 우리 지역의 자바 프로세스를 찾아야한다. 여기에 이미지 설명을 입력하십시오.

그런 다음 MBean 탭으로 전환하여 Main 클래스에서 사용한 MBean을 ObjectName 으로 찾으십시오 (위의 예에서는 ServerManager ). Attributes 섹션에서 우리는 속성을 볼 수 있습니다. get 메소드 만 지정한 경우, 속성은 읽을 수는 있지만 쓰기 가능하지는 않습니다. get 및 set 메소드를 모두 지정하면 속성을 읽고 쓸 수 있습니다. 여기에 이미지 설명을 입력하십시오.

지정된 메소드는 Operations 섹션에서 호출 할 수 있습니다. 여기에 이미지 설명을 입력하십시오.

원격 관리를 사용하려면 다음과 같은 추가 JVM 매개 변수가 필요합니다.

-Dcom.sun.management.jmxremote=true //true by default
-Dcom.sun.management.jmxremote.port=36006 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false

이러한 매개 변수는 JMX 가이드의 2 장 에서 찾을 수 있습니다. 그런 다음 jConsole jconsole host:port 를 사용하여 원격으로 jConsole을 통해 응용 프로그램에 연결하거나 jConsole GUI에서 host:port 또는 service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi 를 지정하여 응용 프로그램에 연결할 수 있습니다.

유용한 링크:



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow