2016-02-05 4 views
0

Я использую JMX в Spring приложении с конфигурацией XML:JMX с пружиной без конфигурации XML, 100% аннотация основана?

<bean id="jmxExporter" class="org.springframework.jmx.export.MBeanExporter"> 
     <property name="beans"> 
      <map> 
       <entry key="bean:name=bean1" value-ref="bean1"/> 
       <entry key="bean:name=bean2" value-ref="bean2"/> 
       <entry key="bean:name=bean3" value-ref="bean3"/> 
      </map> 
     </property> 
     <property name="notificationListenerMappings"> 
      <map> 
      <entry key="*"> 
       <bean class="com.test.listener"/> 
      </entry> 
     </map> 
     </property> 
    </bean> 

    <bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean"> 
     <property name="port" value="1099" /> 
    </bean> 

    <bean id="serverConnector" 
     class="org.springframework.jmx.support.ConnectorServerFactoryBean"> 
     <property name="objectName" value="connector:name=rmi" /> 
     <property name="serviceUrl" 
      value="service:jmx:rmi://localhost/jndi/rmi://localhost:1099/jmxrmi" /> 
    </bean> 

Я понимаю, из различных документов, как вместо этой конфигурации XML мы могли аннотировать его с @EnableMBeanExport и @ManagedResource для бобов.

Но я сомневаюсь, как ConnectorServerFactoryBean настроен с этими аннотациями. Или имеется ли какая-либо аннотация для настройки RMI и connectorServerFactoryBean?

Также мне нужно знать, как комментировать, notificationListenerMappings настроен?

P.S: У меня есть код, работающий для издателя и слушателя в конфигурации XML. Я планирую полностью перенести его на аннотацию, поскольку я не хочу нарушать конфигурацию XML уже в PROD.

Отредактировано

Найден следующий фрагмент кода: планирование попробовать:

@Bean 
public RmiRegistryFactoryBean registry() { 
    return new RmiRegistryFactoryBean(); 
} 

@Bean 
@DependsOn("registry") 
public ConnectorServerFactoryBean connectorServer() throws MalformedObjectNameException { 
    ConnectorServerFactoryBean connectorServerFactoryBean = new ConnectorServerFactoryBean(); 
    connectorServerFactoryBean.setObjectName("connector:name=rmi"); 
    connectorServerFactoryBean.setServiceUrl("service:jmx:rmi://localhost/jndi/rmi://localhost:1099/connector"); 
    return connectorServerFactoryBean; 
} 

Edit 2: Я направляюсь на вышеупомянутый подход, и я могу настроить MBeans и возможность публикации уведомлений. Но, к сожалению, я застрял в настройке NotificationListener через Annotation.

Я попытался добавить следующее:

 @Bean 
    @DependsOn("registry") 
    public ConnectorServerFactoryBean connectorServer() throws MalformedObjectNameException { 
     ConnectorServerFactoryBean connectorServerFactoryBean = new ConnectorServerFactoryBean(); 
     connectorServerFactoryBean.setObjectName("connector:name=rmi"); 
     connectorServerFactoryBean.setServiceUrl("service:jmx:rmi://localhost/jndi/rmi://localhost:1099/connector"); 
     //TestListener is my NotificationListener class 
     ObjectName objectName = new ObjectName("bean:name=bean1"); 
      connectorServerFactoryBean.getServer().addNotificationListener(objectName, 
          new TestListener(), null,null); 
     return connectorServerFactoryBean; 
    } 

Я получаю instanceNotFoundException о том bean:name=bean1 не найден. Но я настроил как, @ManagedResource(objectName="bean:name=bean1") на моем bean1.

Любая помощь, пожалуйста, о том, чего я не хватает?

ответ

0

@EnableMBeanExport имеет свойство server, ссылающееся на имя компонента объекта сервера.

смотри, например, тест этого компонента, которые используют это свойство сервера: https://github.com/spring-projects/spring-framework/blob/master/spring-context/src/test/java/org/springframework/jmx/export/annotation/EnableMBeanExportConfigurationTests.java

+0

Спасибо @ Жереми Б. Воле, что «сервер» на самом деле взять в любой сконфигурировано в serviceConnector боба настроен на мой вопрос? – DecKno

+0

Теоретически да. Он ищет экземпляр MBeanServer –

+0

После определения, как в ссылке, которую вы предоставляете, сервера MBean, как Spring знает, какой класс имеет метод для вызова через JMX? Достаточно ли иметь '@ ManagedResource' и' @ ManagedOperation' в классе? –