Spec-Zone .ru
спецификации, руководства, описания, API
|
Предыдущие уроки в этом следе показали Вам, как создать технологию JMX MBeans и MXBeans, и зарегистрировать их в агенте JMX. Однако, все предыдущие примеры использовали существующий клиент JMX, JConsole. Этот урок будет демонстрировать, как создать Ваш собственный клиент JMX.
Пример пользовательского клиента JMX, Client
включается в jmx_examples.zip
. Этот клиент JMX взаимодействует с тем же самым MBean, MXBean и агентом JMX, как были замечены в предыдущих уроках. Из-за размера Client
class, это будет исследовано в блоках в следующих разделах.
Чтобы быть в состоянии создать соединения с агентами JMX, которые работают удаленно от клиента JMX, Вы должны использовать классы от javax.management.remote
.
package com.example; ... import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; public class Client { ...
Client
class будет создавать JMXConnector
JMXConnectorFactory
JMXServiceURL
Клиент JMX нуждается в обработчике уведомления, чтобы прислушаться и обработать любые уведомления, которые могли бы быть отправлены MBeans, которые регистрируются в сервере агента JMX MBean. Обработчик уведомления клиента JMX является экземпляром NotificationListener
... public static class ClientListener implements NotificationListener { public void handleNotification(Notification notification, Object handback) { echo("\nReceived notification:"); echo("\tClassName: " + notification.getClass().getName()); echo("\tSource: " + notification.getSource()); echo("\tType: " + notification.getType()); echo("\tMessage: " + notification.getMessage()); if (notification instanceof AttributeChangeNotification) { AttributeChangeNotification acn = (AttributeChangeNotification) notification; echo("\tAttributeName: " + acn.getAttributeName()); echo("\tAttributeType: " + acn.getAttributeType()); echo("\tNewValue: " + acn.getNewValue()); echo("\tOldValue: " + acn.getOldValue()); } } } ...
Этот слушатель уведомления определяет источник любых уведомлений, которые он получает, и получает информацию, хранившую в уведомлении. Это тогда выполняет различные действия с информацией об уведомлении согласно типу полученного уведомления. В этом случае, когда слушатель получает уведомления о типе AttributeChangeNotification
AttributeChangeNotification
методы getAttributeName
, getAttributeType
, getNewValue
и getOldValue
.
Новое ClientListener
экземпляр создается позже в коде.
ClientListener listener = new ClientListener();
Client
class создает клиент соединителя RMI, который конфигурируется, чтобы соединиться с сервером соединителя RMI, который Вы запустите, когда Вы запустите агент JMX, Main
. Это позволит клиенту JMX взаимодействовать с агентом JMX, как будто они работали на той же самой машине.
... public static void main(String[] args) throws Exception { echo("\nCreate an RMI connector client and " + "connect it to the RMI connector server"); JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://:9999/jmxrmi"); JMXConnector jmxc = JMXConnectorFactory.connect(url, null); ...
Поскольку можно видеть, Client
определяет a JMXServiceURL
url
, это представляет расположение, в котором клиент соединителя ожидает находить сервер соединителя. Этот URL позволяет клиенту соединителя получать тупик сервера соединителя RMI jmxrmi
от реестра RMI, работающего на порту 9999 из локального узла, и соединяться с сервером соединителя RMI.
С реестром RMI, таким образом идентифицированным, может быть создан клиент соединителя. Клиент соединителя, jmxc
, экземпляр интерфейса JMXConnector
connect()
метод JMXConnectorFactory
connect()
метод передают параметры url
и нулевая среда отображается, когда ее вызывают.
С соединением RMI на месте, клиент JMX должен соединиться с удаленным сервером MBean, так, чтобы это могло взаимодействовать с различным MBeans, зарегистрированным в этом удаленным агентом JMX.
... MBeanServerConnection mbsc = jmxc.getMBeanServerConnection(); ...
Экземпляр MBeanServerConnection
getMBeanServerConnection()
метод JMXConnector
экземпляр jmxc
.
Клиент соединителя теперь соединяется с сервером MBean, создаваемым агентом JMX, и может зарегистрировать MBeans и выполнить операции на них с соединением, остающимся абсолютно прозрачным к обоим концам.
Чтобы запуститься с, клиент определяет некоторые простые операции, чтобы обнаружить информацию о MBeans, найденном в сервере агента MBean.
... echo("\nDomains:"); String domains[] = mbsc.getDomains(); Arrays.sort(domains); for (String domain : domains) { echo("\tDomain = " + domain); } ... echo("\nMBeanServer default domain = " + mbsc.getDefaultDomain()); echo("\nMBean count = " + mbsc.getMBeanCount()); echo("\nQuery MBeanServer MBeans:"); Set<ObjectName> names = new TreeSet<ObjectName>(mbsc.queryNames(null, null)); for (ObjectName name : names) { echo("\tObjectName = " + name); } ...
Клиент вызывает различные методы MBeanServerConnection
чтобы получить домены, в которых различные MBeans работают, число MBeans, зарегистрированного в сервере MBean, и именах объектов для каждого из MBeans, это обнаруживает.
Клиент получает доступ Hello
MBean в сервере MBean через соединение сервера MBean, создавая прокси MBean. Этот прокси MBean локален для клиента, и эмулирует удаленный MBean.
... ObjectName mbeanName = new ObjectName("com.example:type=Hello"); HelloMBean mbeanProxy = JMX.newMBeanProxy(mbsc, mbeanName, HelloMBean.class, true); echo("\nAdd notification listener..."); mbsc.addNotificationListener(mbeanName, listener, null, null); echo("\nCacheSize = " + mbeanProxy.getCacheSize()); mbeanProxy.setCacheSize(150); echo("\nWaiting for notification..."); sleep(2000); echo("\nCacheSize = " + mbeanProxy.getCacheSize()); echo("\nInvoke sayHello() in Hello MBean..."); mbeanProxy.sayHello(); echo("\nInvoke add(2, 3) in Hello MBean..."); echo("\nadd(2, 3) = " + mbeanProxy.add(2, 3)); waitForEnterPressed(); ...
Прокси MBean позволяют Вам получать доступ к MBean через интерфейс Java, разрешая Вам сделать запросы к прокси вместо того, чтобы иметь необходимость записать длинный код, чтобы получить доступ к удаленному MBean. MBean проксирует для Hello
создается здесь, вызывая метод newMBeanProxy()
в javax.management.JMX
MBeanServerConnection
, имя объекта, имя class MBean взаимодействует через интерфейс и true
, показать, что прокси должен вести себя как a NotificationBroadcaster
Hello
как будто они были операциями локально зарегистрированного MBean. Клиент JMX также добавляет слушателя уведомления и изменяет MBean's CacheSize
атрибут, чтобы заставить это отправить уведомление.
Можно создать прокси для MXBeans точно таким же образом, как Вы создаете прокси MBean.
... ObjectName mxbeanName = new ObjectName ("com.example:type=QueueSampler"); QueueSamplerMXBean mxbeanProxy = JMX.newMXBeanProxy(mbsc, mxbeanName, QueueSamplerMXBean.class); QueueSample queue1 = mxbeanProxy.getQueueSample(); echo("\nQueueSample.Date = " + queue1.getDate()); echo("QueueSample.Head = " + queue1.getHead()); echo("QueueSample.Size = " + queue1.getSize()); echo("\nInvoke clearQueue() in QueueSampler MXBean..."); mxbeanProxy.clearQueue(); QueueSample queue2 = mxbeanProxy.getQueueSample(); echo("\nQueueSample.Date = " + queue2.getDate()); echo("QueueSample.Head = " + queue2.getHead()); echo("QueueSample.Size = " + queue2.getSize()); ...
Как показано выше, чтобы создать прокси для MXBean, все, что необходимо сделать, вызвать JMX.newMXBeanProxy
newMBeanProxy
. Прокси MXBean mxbeanProxy
позволяет клиенту вызывать QueueSample
Операции MXBEAN, как будто они были операциями локально зарегистрированного MXBean.
Как только клиент JMX получил всю информацию, она нуждается и выполняла все необходимые операции на MBeans в сервере удаленного агента JMX MBean, соединение должно быть закрыто.
jmxc.close();
Соединение закрывается со звонком JMXConnector.close
Этот пример требует версии 6 Java платформа SE. Контролировать Main
Агент JMX, удаленно используя пользовательский клиент JMX Client
, следуйте за этими шагами:
jmx_examples.zip
в Ваш work_dir
каталог.unzip jmx_examples.zip
work_dir
каталог. javac com/example/*.java
Main
приложение, определяя свойства, которые представляют Main
для удаленного управления: java -Dcom.sun.management.jmxremote.port=9999 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ com.example.Main
Подтверждение это Main
ожидает чего-то, чтобы произойти, сгенерирован.
Client
приложение в различном окне терминала: java com.example.Client
Подтверждение, что MBeanServerConnection
был получен выводится на экран.
Домены те, в который все MBeans, которые регистрируются в сервере MBean, запущенном Main
выводятся на экран.
Число MBeans, которые регистрируются в сервере MBean, выводится на экран, так же как имена объектов всех этих MBeans. Выведенные на экран MBeans включают всю стандартную платформу MXBeans, работающий в Java VM, так же как Hello
MBean и QueueSampler
MXBean, которые были зарегистрированы в сервере MBean Main
.
Hello
Операции MBEAN вызываются Client
, со следующими результатами:
Client
прислушиваться к уведомлениям от Main
.CacheSize
атрибут изменяется от 200 до 150.Main
, подтверждение CacheSize
изменение атрибута выводится на экран.Client
, уведомление от Main
выводится на экран, сообщая Client
из CacheSize
изменение атрибута.Hello
MBean's sayHello
работа вызывается.Main
, сообщение "Привет мир" выводится на экран.Hello
MBean's add
работа вызывается со значениями 2 и 3 как параметры. Результат выводится на экран Client
. QueueSampler
Операции MXBEAN вызываются Client
, со следующими результатами:
QueueSample
значения date
, head
, и size
выводятся на экран.clearQueue
работа вызывается. Client
закрывает соединение с сервером MBean, и подтверждение выводится на экран.