Java ActiveMQ生成的队列不';不存在
我在Spring应用程序中使用ActiveMQ时遇到问题 我在不同的机器上有一些环境。在每台机器上,我都安装了一个ActiveMQ实例。现在,我意识到我只能在一台服务器上安装一个ActiveMQ实例,很少有应用程序可以使用该ActiveMQ发送消息。因此,我必须更改队列名称,以便在不同的环境中拥有不同的队列(Java ActiveMQ生成的队列不';不存在,java,spring,spring-mvc,jms,activemq,Java,Spring,Spring Mvc,Jms,Activemq,我在Spring应用程序中使用ActiveMQ时遇到问题 我在不同的机器上有一些环境。在每台机器上,我都安装了一个ActiveMQ实例。现在,我意识到我只能在一台服务器上安装一个ActiveMQ实例,很少有应用程序可以使用该ActiveMQ发送消息。因此,我必须更改队列名称,以便在不同的环境中拥有不同的队列(“queue.search.sandbox”,“queue.search.production”,…) 在该更改之后,现在ActiveMQ正在生成新队列,但也生成旧队列,尽管没有这样的配置
“queue.search.sandbox”
,“queue.search.production”
,…)
在该更改之后,现在ActiveMQ正在生成新队列,但也生成旧队列,尽管没有这样的配置
我使用的是Java配置的JavaSpring应用程序,而不是XML
首先,我创建queueTemplate
作为Springbean:
@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是如何做到这一点的吗?提前感谢。队列索引中可能还有一个条目,因此当ActiveMQ重新启动时,它将显示队列。如果要确定目标,请使用启动目标,并通过拒绝授权条目中连接用户帐户的“管理员”权限来禁用自动创建。队列索引中可能仍有一个条目,因此当ActiveMQ重新启动时,它将显示队列。如果要确定目标,请使用启动目标,并在一段时间后,通过拒绝授权条目中连接用户帐户的“管理员”权限来禁用自动创建,ActiveMQ刚刚停止创建不存在的队列。 现在,我们有了预期的行为,没有了不必要的队列
但我仍然没有发现是什么解决了这个问题,老实说…过了一段时间,ActiveMQ才停止创建不存在的队列。 现在,我们有了预期的行为,没有了不必要的队列
但我仍然没有发现是什么解决了这个问题,老实说…是否有其他软件订阅队列
队列。audit
?不,没有。一切都发生在核心应用程序内部。删除“数据”目录,并使用webconsole或jmx检查是否有到旧队列的连接。顺便说一句,您可以在同一台服务器上有多个activemq实例,您只需更改侦听端口。谢谢Alexandre。我知道我可以在同一台服务器上安装多个ActiveMQ实例,但我们希望避免这种情况。通过这种方式更容易跟踪所有内容。是否有其他软件订阅队列队列。审核?不,没有。一切都发生在核心应用程序内部。删除“数据”目录,并使用webconsole或jmx检查是否有到旧队列的连接。顺便说一句,您可以在同一台服务器上有多个activemq实例,您只需更改侦听端口。谢谢Alexandre。我知道我可以在同一台服务器上安装多个ActiveMQ实例,但我们希望避免这种情况。通过这种方式跟踪所有内容更容易。这听起来像是我问题的解决方案,但我没有对ActiveMQ配置进行任何更改,它只是停止了创建队列。就像配置中有一些参数用于在ActiveMQ重新启动后重新创建未使用的队列一样……索引存储为kahadb的一部分,而不是ActiveMQ配置。一旦db-*.log文件循环出来,我想队列就不会出现了。您还可以备份kahadb文件夹,删除.data文件(索引)并让ActiveMQ重新创建索引。这听起来像是我问题的解决方案,但我没有对ActiveMQ配置进行任何更改,它只是停止创建队列。就像配置中有一些参数用于在ActiveMQ重新启动后重新创建未使用的队列一样……索引存储为kahadb的一部分,而不是ActiveMQ配置。一旦db-*.log文件循环出来,我想队列就不会出现了。您还可以备份kahadb文件夹,删除.data文件(索引)并让ActiveMQ重新创建索引。