【发布时间】:2017-01-03 03:57:12
【问题描述】:
我在 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;
}
其次,我创建ActiveMQListener配置:
@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 是如何做到这一点的吗?提前致谢。
【问题讨论】:
-
还有其他订阅队列
queue.audit的软件吗? -
不,没有。一切都发生在核心应用程序内部。
-
删除“data”目录,并使用webconsole或jmx检查是否有连接到旧队列。
-
顺便说一句,你可以在同一个服务器上拥有多个activemq实例,你只需要改变监听端口。
-
谢谢亚历山大。我知道我可以在同一台服务器上安装多个 ActiveMQ 实例,但我们想避免这种情况。以这种方式更容易跟踪所有内容。
标签: java spring spring-mvc jms activemq