2012-02-06 16 views
8

obserwuję różne przykładowe konfiguracje z dokumentacją wiosennym oraz niektórych forach w Internecie, mój plik kontekst aplikacji wygląda następująco:JMX MBean rejestracja przy użyciu Wiosna na samodzielny JVM

<beans> 
    <bean id="dH" class="abc.def.ghi.DH"> 
     <constructor-arg> 
      <value>0</value> 
     </constructor-arg> 
     <property name="num" value="100"/> 
    </bean> 
    <bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false"> 
      <property name="beans"> 
       <map> 
        <entry key="bean:name=dH1" value-ref="dH"/> 
       </map> 
      </property> 
    </bean> 
    <bean class="org.springframework.jmx.support.MBeanServerFactoryBean"/> 
</beans> 

biegnę to bez pojemnika i na zwykłej maszynie JVM. Mogę połączyć się z moim procesem za pośrednictwem JConsole, ale komponent MBean się nie wyświetla. Jednak programowanie programu bean fasoli skutecznie go udostępnia.

MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); 
DH dh = new DH(0); 
mbeanServer.registerMBean(dh, new ObjectName("bean:name=dH1")); 

Próbowałem grać z konfiguracją Spring bez powodzenia. Myślę, że komponent bean nie rejestruje się na już działającym serwerze MBean, który był dostępny z ManagementFactory.getPlatformMBeanServer(). Wszelkie pomysły dotyczące problemu?

Odpowiedz

11

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) {} 
    } 
} 
+0

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 ... –

+0

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. –

+0

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? –

2

Problem dotyczy komponentu MBeanServerFactoryBean.

Z javadoc:

Domyślnie MBeanServerFactoryBean zawsze utworzyć nowy MBeanServer nawet jeśli jest już uruchomiony. Aby próbka MBeanServerFactoryBean w wersji próbowała najpierw zlokalizować działający serwer MBeanServer, ustaw wartość właściwości "locateExistingServerIfPossible" na "true".

Spróbuj config:

<bean class="org.springframework.jmx.support.MBeanServerFactoryBean"> 
    <property name="locateExistingServerIfPossible" value="true" /> 
</bean> 

================================ =================

Spróbuj określając MBeanServer w fasoli eksportera:

<bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false"> 
    <property name="beans"> 
     <map> 
       <entry key="bean:name=dH1" value-ref="dH" /> 
      </map> 
     </property> 
     <property name="server" ref="MBeanServer" /> 
</bean> 
<bean id="MBeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean"> 
    <property name="locateExistingServerIfPossible" value="true" /> 
</bean> 

=========== ================================= ============================

Ok, rzućmy podejście brute force i nabyć platformę MBeanServer bezpośrednio:

<bean class="org.springframework.jmx.export.MBeanExporter" lazy-init="false"> 
    <property name="beans"> 
     <map> 
       <entry key="bean:name=dH1" value-ref="dH" /> 
      </map> 
     </property> 
     <property name="server"> 
      <bean id="MBeanServer" class="java.lang.management.ManagementFactory" factory-method="getPlatformMBeanServer"/> 
     </property> 
</bean> 
+0

Próbowałem już go @Nicholas. Próbowałem jeszcze raz bez powodzenia .. –

+0

nie było z tym szczęścia .. –

+0

Dzięki za inne sugestie @Nicholas. Chociaż próba ich obu nie zarejestrowała również MBean. –

Powiązane problemy