Допустим, у нас есть приложение, которое сорит в JMX. В данном случае, создаёт атрибуты. Из другого приложения нам надо этот атрибут прочитать.Повозился не мало, и как всегда начал не от туда, однако вот что вышло. Недостатком можно назвать то, что приходится задавать пароль администратора сервера приложений, но это уже часности. Главное принцип, я думаю, прост и его легко можно применить не только к атрибутам.
Код приложения с коментариями, думаю их будет достаточно:
Код приложения с коментариями, думаю их будет достаточно:
try {
// 1. Создаём сервис:
String address = "service:jmx:rmi://localhost:23791";
JMXServiceURL serviceURL = new JMXServiceURL(address);
// 2. Параметры подключения для создания коннектора:
Hashtable credentials = new Hashtable();
credentials.put("login", "oc4jadmin");
credentials.put("password", "***");
Hashtable environment = new Hashtable();
environment.put(
JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "oracle.oc4j.admin.jmx.remote");
environment.put(JMXConnector.CREDENTIALS, credentials);
// 3. Создаём коннектор и получаем конкретный коннект в JMX
JMXConnector jmxConnector =
JMXConnectorFactory.connect(serviceURL, environment);
MBeanServerConnection mBeanConnection =
jmxConnector.getMBeanServerConnection();
// 4. Задаём имя интересующего Mbean
// * - означают любой параметр, причём первая — это имя домена,
// а последняя, то что другие параметры нас не интересуют
ObjectName exampleServiceName =
new ObjectName("*:name=MBeanName,*");
// Получение множества MBean по имени, соответствующим нашему запросу
Set
getMBeanServerConnection().queryNames(exampleServiceName, null);
// Теперь перемещаемя по всем, подходящим для нас «бинам»
for(ObjectName mbean: mbeans) {
// Так можно получить полное имя
log.debug("MBean="+mbean.getCanonicalName());
// Получаем атрибут «бина» - объект, который хранится в атрибуте,
// т.е. тут мы и получили значение атрибута
Object o = jmxConnector.getMBeanServerConnection().
getAttribute(mbean, "RunArray");
log.debug("MBean attribute class="+o.getClass());
}
} catch (Exception e) {
// Тут я просто отлавливаю все исключения для удобства в 1 месте
log.warn(e, e);
}
}