Ngoài việc xác định một đậu MBeanServerFactory (như đã nêu trong Nicholasanswer của họ) sử dụng ...
<bean class="org.springframework.jmx.support.MBeanServerFactoryBean">
<property name="locateExistingServerIfPossible" value="true" />
</bean>
... bạn cần phải nói với MBeanExporter gì để quản lý:
Nếu đậu thực hiện một trong các giao diện quản lý JMX, MBeanExporter có thể chỉ cần đăng ký MBean với máy chủ thông qua quá trình tự động dò tìm của nó.
Nếu một bean không thực hiện một trong các giao diện quản lý JMX, MBeanExporter sẽ tạo thông tin quản lý bằng cách sử dụng MBeanInfoAssembler được cung cấp.
Giả sử lớp abc.def.ghi.DH
của bạn không thực hiện bất kỳ giao diện JMX, hãy thử định nghĩa của bạn MBeanExporter
như:
<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>
Nhìn vào OpenJDK 7, cập nhật 2, xây dựng 21 DefaultMBeanServerInterceptor.java
nguồn, dòng 898 tạo ra một DynamicMBean
cho đối tượng thông thường:
DynamicMBean mbean = Introspector.makeDynamicMBean(object);
Tôi chưa sửa lỗi, nhưng tôi đặt cược mbeanServer.registerMBean(dh, new ObjectName("bean:name=dH1"))
cuối cùng gọi DefaultMBeanServerInterceptor.registerObject()
, tạo ra một DynamicMBean
cho bạn và đăng ký đúng các bộ định vị và getters tiêu chuẩn của JavaBean
.
Dưới đây là một số tệp thử nghiệm hoạt động bằng Spring Framework 3.0.5 và Oracle HotSpot Java 1.6.0_24. Sau khi đặt biến môi trường CLASSPATH
của bạn, chỉ cần chạy javac *.java
và java Main
và sử dụng VisualVM (hoặc ứng dụng tương tự) để kết nối với ứng dụng java đang chạy để xem MBeans đã đăng ký.
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) {}
}
}
Cảm ơn bạn đã đào bài này ra @Dan. Khi bối cảnh mùa xuân được tải hoặc thậm chí dh được tạo ra bằng cách sử dụng ngữ cảnh dòng Introspector thậm chí không được thực thi. Tuy nhiên việc đăng ký đậu bằng tay không gọi cùng một dòng. Tôi không nghĩ Spring đang cố gắng đăng ký bean với những cấu hình này. Cái gì đó phải bị thiếu ... –
Điều này làm việc cho tôi bằng cách sử dụng Spring 3.0.5 và một JavaBean đơn giản với một trình getter/setter thuộc tính; Tôi có thể kết nối với ứng dụng thử nghiệm đơn giản của mình với VisualVM và xem MBean thử nghiệm đã được đăng ký sử dụng định nghĩa bean 'MBeanExporter' mà tôi đã cung cấp. Hãy thử phá vỡ kịch bản của bạn xuống một hình thức đơn giản, có được rằng để làm việc, sau đó xây dựng nó trở lại lên đến những gì bạn đang có và xem nơi vấn đề của bạn nằm. –
Sử dụng Spring 3.1.0 Tôi đã thử với XML được cung cấp của bạn có và không có -Dcom.sun.management.jmxremote làm tùy chọn chương trình, vẫn không có may mắn. Tôi đang tải ngữ cảnh theo cách sau: Nhà máy BeanFactory = new XmlBeanFactory (new ClassPathResource ("/ application-context.xml")); và sau đó tải MBean dự định là: factory.getBean (DH.class); Tôi biết điều này nghe có vẻ ngây thơ nhưng có cách nào chúng ta có thể kết hợp XML hoàn chỉnh của chúng ta và cấu trúc chương trình đơn giản không? –