Oprócz definiowania MBeanServerFactory bean (jak Nicholas zauważyć w ich answer) za pomocą ...
<bean class="org.springframework.jmx.support.MBeanServerFactoryBean">
<property name="locateExistingServerIfPossible" value="true" />
</bean>
... trzeba powiedzieć MBeanExporter co do zarządzania:
Jeśli komponent bean implementuje jeden z interfejsów zarządzania JMX, komponent MBeanExporter może po prostu zarejestrować komponent MBean na serwerze za pomocą procesu autodetekcji.
Jeśli komponent bean nie implementuje jednego z interfejsów zarządzania JMX, komponent MBeanExporter utworzy informacje zarządzania za pomocą dostarczonego komponentu MBeanInfoAssembler.
Zakładając swoją klasę abc.def.ghi.DH
nie realizuje żadnego interfejsu JMX, próby definiowania MBeanExporter
jak:
<bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
<property name="assembler">
<bean
class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler"
>
<property name="managedMethods">
<list>
<value>getNum</value>
</list>
</property>
</bean>
</property>
<property name="beans">
<map>
<entry key="bean:name=dH1" value-ref="dH"/>
</map>
</property>
</bean>
Patrząc na OpenJDK 7, zaktualizuj 2, zbudować 21 DefaultMBeanServerInterceptor.java
źródło, linia 898 tworzy DynamicMBean
dla regularne obiekty:
DynamicMBean mbean = Introspector.makeDynamicMBean(object);
ja nie pozbawione błędów, ale założę mbeanServer.registerMBean(dh, new ObjectName("bean:name=dH1"))
ostatecznie zwraca DefaultMBeanServerInterceptor.registerObject()
, który tworzy dla ciebie DynamicMBean
i odpowiednio rejestruje twoje standardowe setery i atrybuty właściwości: JavaBean
.
Oto niektóre pliki testowe, które pracują przy użyciu Spring Framework 3.0.5 i Oracle Java HotSpot 1.6.0_24. Po ustawieniu zmiennej środowiskowej CLASSPATH
po prostu uruchom javac *.java
i java Main
i użyj VisualVM (lub podobnej aplikacji), aby połączyć się z uruchomioną aplikacją java, aby zobaczyć zarejestrowane zbiory MBean.
ac.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"
default-lazy-init="true"
>
<bean id="test" class="Test" />
<bean class="org.springframework.jmx.support.MBeanServerFactoryBean">
<property name="locateExistingServerIfPossible" value="true" />
</bean>
<bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false">
<property name="assembler">
<bean
class="org.springframework.jmx.export.assembler.MethodNameBasedMBeanInfoAssembler"
>
<property name="managedMethods">
<list>
<value>getVal</value>
<value>setVal</value>
</list>
</property>
</bean>
</property>
<property name="beans">
<map>
<entry key="bean:name=Test" value-ref="test"/>
</map>
</property>
</bean>
</beans>
Test.java:
public class Test {
private String val = "";
public String getVal() {
return val;
}
public void setVal(String v) {
val = v;
}
}
Main.java:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(final String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("ac.xml");
try {
Thread.sleep(1000 * 60 * 5);
} catch (final Throwable t) {}
}
}
Dzięki za wykopanie tego @Dan. Gdy kontekst Spring jest załadowany lub nawet dh jest tworzone przy użyciu kontekstu, linia introspektora nie jest nawet wykonywana. Jednak ręczne zarejestrowanie komponentu bean wywołuje tę samą linię. Nie sądzę, że Spring próbuje zarejestrować ziarno w tych konfiguracjach. Coś musi być brakuje ... –
To działa dla mnie za pomocą Spring 3.0.5 i prosty JavaBean z jednym getter/setter właściwości; Mogę połączyć się z moją prostą aplikacją testową z VisualVM i zobaczyć testowy komponent MBean, który został zarejestrowany przy użyciu podanej definicji komponentu bean MBeanExporter. Spróbuj zepsuć scenariusz do prostego formularza, spraw, aby działał, a następnie powróć do tego, co masz obecnie i sprawdź, gdzie leży Twój problem. –
Używanie Spring 3.1.0 Próbowałem z dostarczonym XML-em z i bez opcji -Dcom.sun.management.jmxremote jako opcja programu, nadal bez powodzenia. Załaduję kontekst w następujący sposób: Fabryka BeanFactory = new XmlBeanFactory (new ClassPathResource ("/ application-context.xml")); , a następnie ładowanie docelowego komponentu MBean jako: factory.getBean (DH.class); Wiem, że brzmi to naiwnie, ale czy istnieje sposób, w jaki możemy dopasować nasze pełne XML-y i prostą strukturę programu? –