サーチ…


前書き

JMXテクノロジは、デバイス、アプリケーション、およびサービス駆動型ネットワークを管理および監視するための分散型Webベースのモジュラおよびダイナミックソリューションを構築するためのツールを提供します。設計上、この規格は、レガシーシステムの適応、新しい管理および監視ソリューションの実装、および将来のシステムへの接続に適しています。

プラットフォーム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経由でアプリケーションに接続できます。まず、アプリケーションを使用してローカルjavaプロセスを見つける必要がありますここに画像の説明を入力

MBeanタブに切り替え、メインクラスで使用したMBeanをObjectName (上の例ではServerManager )として探します。 Attributesセクションでは、 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