【问题标题】:Listening to new ActiveMQ topic as they created in runtime聆听他们在运行时创建的新 ActiveMQ 主题
【发布时间】:2020-09-09 04:45:47
【问题描述】:

我正在开发应用程序(spring boot 应用程序),该应用程序应该监听在运行时从其他应用程序创建的主题。

我如何知道在运行时的 Active MQ Brocker 上创建了一个新主题? 以及如何在运行时开始收听新创建的主题?

请注意,我想听的是在运行时而不是在启动时创建的主题(应用程序启动,构建了 spring 应用程序上下文)。

我不知道当我的应用程序启动时我可能需要听多少个主题。主题是在运行时创建的,没有特定的命名模式。

【问题讨论】:

  • This 可能是一个很好的起点。但是如何确定新主题中消息的格式/结构呢?
  • 来自所有主题的消息的格式和结构都是相同的,并且是预先知道的。
  • 如果不同主题都具有相同的格式/结构,它们的目的是什么?

标签: java spring-boot jms activemq


【解决方案1】:

如果没有“持久性”,这会出现竞争条件。如果生产者在消费者上线之前发送消息,代理将不会为消费者保留消息。 “持久性”是为消费者保留消息的代理,即使消费者未连接也是如此。

但是! ActiveMQ 通过为消费者使用通配符名称解决了这个问题。建议您至少同意一个前缀以提供第一级过滤。注意——如果你使用多代理架构,你也会想要这个。像 topic://ORDER.ABCD、topic://ORDER.XYZ 这样的东西,其中所有主题都使用相同的格式创建,即“ORDER.$randomStuff”。

选项 1: 让消费者使用 ActiveMQ 的通配符“>”注册一个持久订阅。 IE。主题://订单。>

选项 2: 您可以在 ActiveMQ.Advisory 主题上侦听创建目标时的事件,然后注册消费者。但是,这具有可能会丢失消息的竞争条件。

选项 1 可能是您最好的选择,但如果您开始达到每天 1 亿条消息或 1000 条主题总数的消息负载,可能会遇到扩展问题。

【讨论】:

  • 我们确实同意主题名称的命名模式,所以我可以使用通配符。
【解决方案2】:

订阅咨询主题ActiveMQ.Advisory.Topic(需要启用咨询——请参阅 [1])。每次创建主题时,都会向该主题发布一条消息。该消息的正文将包含一个 org.apache.activemq.command.DestinationInfo 类的对象,可以从中提取新主题的名称。

应用程序可以使用此名称订阅,就像订阅任何其他主题一样。

[1]http://activemq.apache.org/advisory-message.html

【讨论】:

  • 没有尝试解决方案,但由于我们同意主题的命名模式,我使用了通配符。
猜你喜欢
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2014-12-08
  • 2012-02-12
  • 2021-04-26
  • 2018-06-01
相关资源
最近更新 更多