【问题标题】:How to retrieve created Topics (and Queues) of session with ActiveMQ 5.x如何使用 ActiveMQ 5.x 检索创建的会话主题(和队列)
【发布时间】:2020-06-19 05:10:19
【问题描述】:

我使用session.createTopic(topicname) 创建了不同的主题。如何检索会话中所有可用主题的列表?我尝试使用session.getStats(),但我无法对其进行迭代,以获取我需要的信息。

【问题讨论】:

  • 您使用的是什么版本的 ActiveMQ?您使用的是 ActiveMQ 5.x 还是某些版本的 ActiveMQ Artemis?
  • 我两者都有,我介于两者之间。但现在我回到 ActiveMQ 5.x。我还不完全理解它们之间的区别。
  • ActiveMQ Artemis 是 ActiveMQ 的下一代消息代理。当社区对特性对等感到满意时,它将成为 ActiveMQ 6.0。它已经支持 ActiveMQ 5.x 的大部分特性以及 5.x 所没有的更多特性。与 5.x 相比,性能和可扩展性也大大提高了。如果您要开始一个新项目,我建议您使用 ActiveMQ Artemis。
  • 非常感谢!你的回答太清楚了!那么我应该已经更喜欢 ActiveMQ Artemis 而不是 5.x 了吗?
  • 如果您有一个正在尝试使用的现有投资 ActiveMQ 5.x 基础架构,那么现在就坚持下去并开始研究如何迁移。但是,如果您要开始一个新项目,那么我强烈建议您使用 ActiveMQ Artemis。

标签: java jms activemq


【解决方案1】:

使用以下命令,您将从代理获取所有主题:

 Set<ActiveMQTopic> topics = activeMqConnection.getDestinationSource().getTopics();

但我不认为它是否想要你想要的。另一种选择是:

session.getSessionStats()
.getProducers()
.stream()
.map(JMSProducerStatsImpl::getDestination)
.collect(Collectors.toList());

【讨论】:

  • 正是我想要的。
【解决方案2】:

JMS API 不提供任何方法来提供使用javax.jms.Session 创建的所有目的地的列表。

我建议您将创建的 javax.jms.Destination 实例存储在本地数据结构(例如 java.util.ArrayList)中,以便跟踪它们。

请记住,javax.jms.Session.createTopic(String)javax.jms.Session.createQueue(String) 都只是分别创建 javax.jms.Topicjavax.jms.Queue 的客户端实例。他们实际上在代理上创建主题或队列。这在 JavaDoc 中有说明,例如:

请注意,此方法只是创建一个封装主题名称的对象。它不会在 JMS 提供者中创建物理主题。 JMS 不提供创建物理主题的方法,因为这将特定于给定的 JMS 提供者。创建物理主题是特定于提供商的,通常是由管理员执行的管理任务,尽管一些提供商可能会在需要时自动创建它们。一个例外是创建一个临时主题,这是使用 createTemporaryTopic 方法完成的。

您引用的 getStats() 方法不是 JMS API 的一部分。它是 ActiveMQ 5.x JMS 客户端实现所独有的。此外,它不会跟踪使用相应会话创建的目的地的名称。

【讨论】:

    猜你喜欢
    • 2016-06-01
    • 2020-10-08
    • 2018-08-03
    • 1970-01-01
    • 2015-04-28
    • 2013-10-23
    • 1970-01-01
    • 2018-06-01
    • 2012-12-10
    相关资源
    最近更新 更多