我使用 BlockingQueue 的现有代码创建了一个 BlockingQueue 列表(如私有列表>队列;),我可以在其中放置要处理的消息。然而,由于持久性问题,我们计划转移到 activemq。如果我们能得到一个activemq队列列表(在java程序中不是来自配置文件),任何人都可以帮助我。我知道我可以在会话上使用 createQueue 来创建队列的单个实例,但我想要像 BlockingQueue 那样完成的队列列表。
任何帮助将非常感激。
我使用 BlockingQueue 的现有代码创建了一个 BlockingQueue 列表(如私有列表>队列;),我可以在其中放置要处理的消息。然而,由于持久性问题,我们计划转移到 activemq。如果我们能得到一个activemq队列列表(在java程序中不是来自配置文件),任何人都可以帮助我。我知道我可以在会话上使用 createQueue 来创建队列的单个实例,但我想要像 BlockingQueue 那样完成的队列列表。
任何帮助将非常感激。
您可以使用 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 示例链接代码的作用是创建与嵌入在 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");
不仅会建立与代理的连接,而且如果还没有代理,还会在连接中嵌入代理。在本页底部解释
可以使用该功能(您需要一个代理,但如果您想以其他方式设置它):
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("vm://localhost?create=false");
我真的很喜欢 ActiveMQ,但它提供的不仅仅是持久性,所以在做简单的事情时事情可能看起来有点过于复杂。但希望这不会吓到你。
要创建队列列表,您必须创建该列表,然后从会话对象单独创建每个队列。
Queue q = session.createQueue("someQueueName")
然而,从这个意义上说,这并没有真正“创建”队列,因为队列是 ActiveMQ 进程/服务器中的持久“事物”。这只会创建对给定标识符/名称的 ActiveMQ 队列的引用。
我不知道为什么你需要十个队列。通常,每种事件类型或用例(或类似情况)都有一个队列,然后使用并发消费者并行处理。
但是,当然,您总是可以通过一个简单的 for 循环来做类似的事情,一次创建一个队列并将它们附加到一个数组列表。请注意,您无法获得仅Event
包含对象的类型安全队列。
不过,您可以发送ObjectMessage
带有事件的 s。只需创建一个:
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.
从 BlockingQueues 转换为持久 ActiveMQ 队列时,您可能需要重新考虑代码中的一件事或几件事。