我在Spring应用程序中使用ActiveMQ时遇到问题。
我在不同的机器上有一些环境。在每台机器上,我安装了一个ActiveMQ实例。现在,我意识到我只能在一台服务器上安装一个ActiveMQ实例,很少有应用程序可以使用该ActiveMQ来发送消息。因此,我必须更改队列名称,以便为不同的环境("queue.search.sandbox"
,"queue.search.production"
,...)提供不同的队列。
在更改之后,现在ActiveMQ正在生成新队列,但也会生成旧队列,尽管没有这样的配置。
我使用的是带Java配置的Java Spring应用程序,而不是XML。
首先,我创建queueTemplate
作为Spring bean:
@Bean
public JmsTemplate jmsAuditQueueTemplate() {
log.debug("ActiveMQConfiguration jmsAuditQueueTemplate");
JmsTemplate jmsTemplate = new JmsTemplate();
String queueName = "queue.audit.".concat(env.getProperty("activeMqBroker.queueName.suffix"));
jmsTemplate.setDefaultDestination(new ActiveMQQueue(queueName));
jmsTemplate.setConnectionFactory(connectionFactory());
return jmsTemplate;
}
其次,我创建了ActiveMQ Listener
配置:
@Bean
public DefaultMessageListenerContainer jmsAuditQueueListenerContainer() {
log.debug("ActiveMQConfiguration jmsAuditQueueListenerContainer");
DefaultMessageListenerContainer dmlc = new DefaultMessageListenerContainer();
dmlc.setConnectionFactory(connectionFactory);
String queueName = "queue.audit.".concat(env.getProperty("activeMqBroker.queueName.suffix"));
ActiveMQQueue activeMQ = new ActiveMQQueue(queueName);
dmlc.setDestination(activeMQ);
dmlc.setRecoveryInterval(30000);
dmlc.setSessionTransacted(true);
// To perform actual message processing
dmlc.setMessageListener(auditQueueListenerService);
dmlc.setConcurrentConsumers(10);
// ... more parameters that you might want to inject ...
return dmlc;
}
构建我的应用程序后,结果我已经正确创建了带后缀("queue.audit.sandbox"
)的队列,但是在ActiveMQ生成一段时间后和旧版本("queue.audit"
)。
有人知道ActiveMQ是如何做到这一点的吗?提前谢谢。
答案 0 :(得分:0)
队列的索引中可能仍有一个条目,因此当ActiveMQ重新启动时,它会显示队列。如果您想确定目的地,请使用启动目的地并通过拒绝授权条目中连接用户帐户的“admin”权限来禁用自动创建
答案 1 :(得分:0)
一段时间后,ActiveMQ刚刚停止创建不存在的队列。 现在,我们已经预期了行为,没有不必要的队列。
我仍然没有发现是什么解决了这个问题,是真诚的......