У меня есть следующая конфигурация:
@Configuration
public class ConfigureRMI {
@Value("${jmx.rmi.host:localhost}")
private String rmiHost;
@Value("${jmx.rmi.port:1099}")
private Integer rmiPort;
@Bean
public RmiRegistryFactoryBean rmiRegistry() {
final RmiRegistryFactoryBean rmiRegistryFactoryBean = new RmiRegistryFactoryBean();
rmiRegistryFactoryBean.setPort(rmiPort);
rmiRegistryFactoryBean.setAlwaysCreate(true);
return rmiRegistryFactoryBean;
}
@Bean
@DependsOn("rmiRegistry")
public ConnectorServerFactoryBean connectorServerFactoryBean() throws Exception {
final ConnectorServerFactoryBean connectorServerFactoryBean = new ConnectorServerFactoryBean();
connectorServerFactoryBean.setObjectName("connector:name=rmi");
connectorServerFactoryBean.setServiceUrl(String.format("service:jmx:rmi://%s:%s/jndi/rmi://%s:%s/jmxrmi", rmiHost, rmiPort, rmiHost, rmiPort));
return connectorServerFactoryBean;
}
@Bean
@DependsOn("connectorServerFactoryBean")
public DestinationViewMBean queueMonitor() {
JMXConnectorServer connector = null;
MBeanServerConnection connection;
ObjectName nameConsumers;
try {
connector = connectorServerFactoryBean().getObject();
connection = connector.getMBeanServer();
nameConsumers = new ObjectName("org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=tasks");
} catch (Exception e) {
e.printStackTrace();
return null;
}
DestinationViewMBean mbView = MBeanServerInvocationHandler.newProxyInstance(connection, nameConsumers, DestinationViewMBean.class, true);
return mbView;
}
}
Он настраивает и создает экземпляр DestinationViewMBean, который я пытаюсь использовать позже в коде, подобном этому:
Long queueSize = queueMonitor.getQueueSize();
Но он выдает исключение javax.management.InstanceNotFoundException: org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=tasks
Я уверен, что имена, как я напечатал.Я вижу имя брокера и очередь tasks
в веб-консоли ActiveMQ, элементы ставятся в очередь и удаляются в соответствии с назначением.Но я не могу контролировать размер очереди.Метод, который я использовал (тот, который я предоставил), был сделан из многих ответов здесь на SO и man-страницах в JMX и ActiveMQ.
Мне интересно, упустил ли я что-то очевидное.Я выключил брандмауэр, я на локальном хосте.Почему DestinationViewMBean не может найти очередь?
UPD: я использовал JConsole для проверки имени MBean.Мне удалось исправить InstanceNotFoundException, но теперь я не могу получить какой-либо атрибут из компонента.Я пробовал многие из них в отладчике (просто запустите через атрибуты, которые я мог найти в интерфейсе DestinationViewMBean
)Но при каждой попытке получения атрибута я получаю javax.management.AttributeNotFoundException: getAttribute failed: ModelMBeanAttributeInfo not found for QueueSize
(или любой другой атрибут).