Я использую 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
.
Любая помощь, пожалуйста, о том, чего я не хватает?
Спасибо @ Жереми Б. Воле, что «сервер» на самом деле взять в любой сконфигурировано в serviceConnector боба настроен на мой вопрос? – DecKno
Теоретически да. Он ищет экземпляр MBeanServer –
После определения, как в ссылке, которую вы предоставляете, сервера MBean, как Spring знает, какой класс имеет метод для вызова через JMX? Достаточно ли иметь '@ ManagedResource' и' @ ManagedOperation' в классе? –