【问题标题】:ActiveMQ generating queues which don't existsActiveMQ 生成不存在的队列
【发布时间】: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


【解决方案1】:

队列的索引中可能还有一个条目,因此当 ActiveMQ 重新启​​动时,它会显示队列。如果您想确定目的地,请使用启动目的地并通过在授权条目中拒绝连接用户帐户的“管理员”权限来禁用自动创建

【讨论】:

  • 这听起来像是解决我的问题,但我没有对 ActiveMQ 配置进行任何更改,它只是停止创建队列。就像配置中有一些参数用于在 ActiveMQ 重新启​​动后重新创建未使用的队列...
  • 索引存储为 kahadb 的一部分,而不是 activemq 配置。一旦 db-*.log 文件轮换出来,我想队列将不会出现。您还可以备份 kahadb 文件夹,删除 .data 文件(索引)并让 ActiveMQ 重新创建索引。
【解决方案2】:

一段时间后,ActiveMQ 刚刚停止创建不存在的队列。 现在,我们有了预期的行为,没有不必要的队列。

还是没找到解决这个问题的方法,说实话……

【讨论】:

    猜你喜欢
    • 2019-02-10
    • 2012-06-13
    • 2016-03-19
    • 1970-01-01
    • 2021-10-26
    • 2018-07-15
    • 2021-03-08
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多