Java Language
JMX
Поиск…
Вступление
Технология JMX предоставляет инструменты для создания распределенных, основанных на Web, модульных и динамических решений для управления и мониторинга устройств, приложений и сетей, основанных на услугах. По дизайну этот стандарт подходит для адаптации устаревших систем, внедрения новых решений для управления и мониторинга и подключения к будущим.
Простой пример с платформой MBean Server
Предположим, у нас есть сервер, который регистрирует новых пользователей и приветствует их некоторым сообщением. И мы хотим контролировать этот сервер и изменять некоторые его параметры.
Во-первых, нам нужен интерфейс с нашими методами контроля и контроля
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();
}
}
После этого мы можем запустить наше приложение и подключиться к нему через jConsole, который можно найти в каталоге $JAVA_HOME/bin
. Во-первых, нам нужно найти наш локальный процесс Java с нашим приложением
затем перейдите на вкладку MBeans и найдите 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
Эти параметры можно найти в главе 2 руководств JMX . После этого вы сможете удаленно подключиться к вашему приложению через jConsole с помощью jconsole host:port
или с указанием host:port
или service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi
в jConsole GUI.
Полезные ссылки: