我使用BlockingQueue的现有代码创建了一个BlockingQueue列表(如私有List>队列;),我可以在其中处理消息。 但是由于持久性问题,我们计划转向activemq。 如果我们可以获得activemq队列列表(在java程序中不是来自配置文件),任何人都可以帮助我。我知道我可以在会话中使用createQueue来创建队列的单个实例,但我想要像BlockingQueue那样完成队列列表。
非常感谢任何帮助。
答案 0 :(得分:5)
您可以从连接中使用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,但它提供的不仅仅是持久性,所以在做简单的事情时,事情似乎有点过于复杂。但希望不会吓到你。
答案 1 :(得分:0)
要创建队列列表,您必须创建该列表,然后从会话对象中单独创建每个队列。
Queue q = session.createQueue("someQueueName")
然而,这并不是真正“创建”这种意义上的队列,因为队列是ActiveMQ进程/服务器中的持久“事物”。这将仅在给定标识符/名称的情况下创建对ActiveMQ队列的引用。
我不确定为什么你需要十个队列。通常,每个事件类型或用例(或类似)都有一个队列,然后使用并发使用者并行处理。
但是,当然,你总是可以通过一个简单的for循环来做类似事情,一次创建一个队列并将它们附加到一个arraylist。请注意,您不能获得仅包含Event
个对象的类型安全队列。
您可以发送ObjectMessage
个事件。只需创建一个:
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队列时,您可能需要重新考虑代码中的一件或几件事。