Java Language
JMX
サーチ…
前書き
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
を指定してアプリケーションに接続できます。
役に立つリンク: