我想创建一些能够管理队列中消息的工具。所以我希望能够从队列中获取所有消息(类似导出),并且不要将其从中删除。ActiveMQ获取队列中的所有消息
我试图使用JMX API:
ObjectName mbeanNameQueue = new ObjectName("org.apache.activemq:type=Broker,brokerName=static-broker1,destinationType=Queue,destinationName=tmp_queue2");
org.apache.activemq.broker.jmx.QueueViewMBean queueView = JMX.newMBeanProxy(mbsc, mbeanNameQueue, org.apache.activemq.broker.jmx.QueueViewMBean.class);
System.out.println(queueView.browseAsTable());
但我无法得到超过400级的消息。
而且我用这样的方法:
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:55901");
ActiveMQConnection connection = (ActiveMQConnection)connectionFactory.createConnection();
DestinationSource ds = connection.getDestinationSource();
QueueSession queueSession = connection.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);
Queue queue = queueSession.createQueue("tmp_queue2");
QueueBrowser browser = queueSession.createBrowser(queue);
Enumeration<?> messagesInQueue = browser.getEnumeration();
while (messagesInQueue.hasMoreElements()) {
Message queueMessage = (Message) messagesInQueue.nextElement();
System.out.println(queueMessage);
}
但messagesInQueue.hasMoreElements()总是尽管队列返回false包含许多消息。
此外,如果我尝试使用消费者,它将检索所有消息,但它会将其从队列中删除。
我试图使用命令行工具从队列中导出邮件:
activemq browse --amqurl tcp://localhost:55901 tmp_queue2 >> messages22222.txt
但如果队列包含100多万的消息,它抛出
Failed to execute main task. Reason: java.lang.OutOfMemoryError: GC overhead limit exceeded
所以,我怎么能得到的所有消息形成队列中,不要从那里删除它们?
当没有消息传递时,也许你应该先开始连接。在迭代来自浏览器的消息或者甚至创建浏览器对象之前调用connection.start()。 JMS规范指出,在消费消息之前需要连接启动,没有关于浏览应该如何工作的消息,但由于浏览不是那么常见的活动,ActiveMQ可能已经实现了它自己。 – Matej
@Matej,谢谢,我忘了开始连接。当我开始它时,我可以从队列中读取大约5000条消息,但随后它在停止很长一段时间的同时检索下一个元素.... – evgeniy44