【问题标题】:create list of activemq queue创建activemq队列列表
【发布时间】:2012-12-10 21:06:24
【问题描述】:

我使用 BlockingQueue 的现有代码创建了一个 BlockingQueue 列表(如私有列表> 队列;),我可以在其中放置要处理的消息。 然而,由于持久性问题,我们计划转移到 activemq。 如果我们能得到一个activemq队列列表(在java程序中而不是从配置文件中),任何人都可以帮助我。我知道我可以在会话上使用 createQueue 来创建队列的单个实例,但我想要像 BlockingQueue 一样完成的队列列表。

任何帮助将不胜感激。

【问题讨论】:

    标签: activemq


    【解决方案1】:

    您可以使用 DestinationSource 从您的连接中获取可用队列的列表。

    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    ActiveMQConnection connection = (ActiveMQConnection)connectionFactory.createConnection();
    DestinationSource ds = connection.getDestinationSource();
    Set<ActiveMQQueue> queues = ds.getQueues();
    

    编辑: 要创建队列,请查看 ActiveMQ Hello world 示例link 代码的作用是创建与嵌入在 jvm 中的 activeMQ-broker 的连接

    // Create a ConnectionFactory
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
    
    // Create a Connection
    Connection connection = connectionFactory.createConnection();
    connection.start();
    
    // Create a Session
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    
    // Create the destination (Topic or Queue)
    Destination destination = session.createQueue("TEST.FOO");
    

    上面的代码可能不明显的是这行:

    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
    

    不仅会建立与代理的连接,还会在连接中嵌入代理(如果还没有代理)。在this page底部解释

    可以关闭该功能(您需要代理,但如果您想以其他方式进行设置):

    ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("vm://localhost?create=false");
    

    我真的很喜欢 ActiveMQ,但它提供的不仅仅是持久性,所以在做简单的事情时,事情可能看起来有点过于复杂。但希望这不会吓到你。

    【讨论】:

    • 非常感谢您的回复。我的意思是创建一个队列列表,例如 List> queues = new ArrayList>(10);这将创建一个包含 10 个阻塞队列的列表。可以对 activemq 做同样的事情吗(创建 10 个 activemq 队列的列表)?
    • 在连接对象上,您有一些在代理中创建队列的方法。如果你到那时还没有弄清楚,今晚我会添加一些例子(还不能用电话编码:))
    • 非常感谢 Aksel 的回复,但是我不确定上面的代码是否为我提供了创建 activemq 队列列表的选项。正如我所提到的,在使用 BlockingQueue 时,我使用以下代码创建了一个队列列表: List> queues = new ArrayList>(10);它创建了一个包含 10 个 BlockingQueue 的列表。我想知道是否可以以相同的方式创建一个包含 10 个(或任意数量)的 activemq 的列表。我想要多个队列来处理我的事件,而不是只用一个队列来处理我的事件。
    • 在 ActiveMQ 中你需要做的是让多个消费者从一个队列中消费消息,但如果我正确理解你的场景,你应该只有一个队列
    • 同意,但如果我想为每种消费者类型创建单独的队列怎么办。比如说消费者类型 1、队列 1 等等......在这种情况下,我将不得不创建多个队列。我能做的一件事是在 for 循环中创建多个队列,但我不确定我该怎么做。感谢您的帮助和耐心
    【解决方案2】:

    要创建队列列表,您必须创建该列表,然后从会话对象中单独创建每个队列。

    Queue q = session.createQueue("someQueueName")

    然而,从这个意义上说,这并没有真正“创建”队列,因为队列是 ActiveMQ 进程/服务器中的持久“事物”。这只会创建对给定标识符/名称的 ActiveMQ 队列的引用。

    我不知道你为什么需要十个队列。通常,每种事件类型或用例(或类似情况)都有一个队列,然后使用并发消费者并行处理。

    当然,您总是可以通过一个简单的 for 循环来做类似的事情,一次创建一个队列并将它们附加到一个数组列表。请注意,您无法获得仅包含 Event 对象的类型安全队列。

    您可以发送带有事件的ObjectMessages。只需创建一个:

    Event event = createEvent(..); // Given "Event" is serializable (need to be able to persist it).
    Message m = session.createObjectMessage(event);
    // Send message as usual in ActiveMQ.
    

    在从 BlockingQueue 转换为持久 ActiveMQ 队列时,您可能需要重新考虑代码中的一件事或几件事。

    【讨论】:

      猜你喜欢
      • 2015-04-21
      • 2015-07-05
      • 1970-01-01
      • 2016-03-01
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 2021-02-21
      相关资源
      最近更新 更多