Я новичок в Spring, и в настоящее время я изучаю поддержку jmx, которую предоставляет Spring. Я понимаю, что MBeanExporter - один из основных классов JMX-фреймворка Spring. Так что я пытался поиграть с этим. (Я следую руководству, предоставленному здесь)
Я пытаюсь поэкспериментировать со свойством autodetectMBeanExporter. Но не знаю, правильно я это понимаю или нет.
Документы по ссылке здесь говорят, что
If autodetect is enabled, then valid JMX-beans will automatically be registered by spring.
Теперь я не понимаю, что на самом деле означает bean-компонент bean-jmx. Я понимаю, что каждый jmx-bean должен иметь имя объекта и должен реализовывать интерфейс, имя которого должно быть именем класса с суффиксом «MBean». Есть ли еще какое-то ограничение, которое мне не хватает?
Функция автоматического определения MBeanExporter работает хорошо, когда я удовлетворяю этим двум ограничениям. Но я чувствую, что при использовании spring должны быть другие способы создания действительного jmx-bean, о которых я не знаю. Не могли бы вы указать мне на это?
Вот код:
приложение-context.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id = "mBenaServer" class = "org.springframework.jmx.support.MBeanServerFactoryBean">
<property name = "locateExistingServerIfPossible" value = "true"/>
</bean>
<bean id = "exporter" class = "org.springframework.jmx.export.MBeanExporter" lazy-init = "false">
<property name = "server" ref = "mBenaServer"/>
<!--<property name = "beans">-->
<!--<map>-->
<!--<entry key = "com.mybean:name=testBean1" value-ref = "personBean"/>-->
<!--</map>-->
<!--</property>-->
<property name = "autodetect" value = "true"/>
</bean>
<bean id = "personBean" class = "com.jmx.trial.Person" lazy-init = "true">
<property name = "name" value = "Lavish"/>
<property name = "age" value = "25"/>
</bean>
</beans>
PersonMBean.java
package com.jmx.trial;
public interface PersonMBean {
void setName(String name);
void setAge(int age);
String getName();
int getAge();
}
Person.java
package com.jmx.trial;
import org.springframework.jmx.export.naming.SelfNaming;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
public class Person implements PersonMBean, SelfNaming {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public ObjectName getObjectName() throws MalformedObjectNameException {
return new ObjectName("custom.bean:name=testbean");
}
}
Main.java
package com.jmx.trial;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
private static Logger logger = Logger.getLogger(Main.class);
public static void main(String[] args) throws Exception {
ApplicationContext context = new ClassPathXmlApplicationContext("context.xml");
Person p = (Person) context.getBean("personBean");
System.out.println(p.getName());
System.out.println(p.getAge());
logger.debug("Started, now waiting");
Thread.sleep(Long.MAX_VALUE);
}
}
Я ищу, можно ли создать действительный jmx-bean каким-либо образом, кроме того, что указано в приведенном выше коде.
Не знаю, связано ли это с ManagedResource. Если да, то я хотел бы получить указатели на подробное объяснение этого. Я пробовал читать об этом в spring / docs, но для меня это не прошло гладко.




Прочтите весенняя документация.
Spring добавляет слой поверх традиционного JMX.
В традиционном JMX MBean - это компонент, скажем, Foo, с интерфейсом открытых атрибутов и операций FooMBean.
autDetect в этом контексте просто означает автоматическое обнаружение таких интерфейсов на любых bean-компонентах, объявленных в контексте приложения, и их регистрацию.
Spring позволяет bean-компоненту любой быть представленным как MBean-компонент (для него не требуется интерфейс). Вместо этого вы выбираете один из несколько механизмов для выбора отображаемых атрибутов / операций, но, как правило, вы должны указать экспортеру, какие bean-компоненты вы хотите открыть. Вероятно, вы никогда не захотите, чтобы каждый компонент в контексте приложения был открыт.
Аннотированная модель, наверное, самая простая (@ManagedResource с @ManagedAttribute, @ManagedOperation).
Реализация AutodetectCapableMBeanInfoAssembler, предоставляемая платформой, обнаруживает эти аннотации.
To simplify configuration even further, Spring includes the AutodetectCapableMBeanInfoAssembler interface, which extends the MBeanInfoAssembler interface to add support for autodetection of MBean resources. If you configure the MBeanExporter with an instance of AutodetectCapableMBeanInfoAssembler, it is allowed to “vote” on the inclusion of beans for exposure to JMX.
The only implementation of the AutodetectCapableMBeanInfo interface is the MetadataMBeanInfoAssembler, which votes to include any bean that is marked with the ManagedResource attribute. ...
Но вы можете написать свой собственный, если хотите еще больше автоопределения.
Большое спасибо! ваш ответ был очень полезным :)
Я нашел эта ссылка очень полезным.