2013-11-27 44 views
5

我想创建一些能够管理队列中消息的工具。所以我希望能够从队列中获取所有消息(类似导出),并且不要将其从中删除。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 

所以,我怎么能得到的所有消息形成队列中,不要从那里删除它们?

+1

当没有消息传递时,也许你应该先开始连接。在迭代来自浏览器的消息或者甚至创建浏览器对象之前调用connection.start()。 JMS规范指出,在消费消息之前需要连接启动,没有关于浏览应该如何工作的消息,但由于浏览不是那么常见的活动,ActiveMQ可能已经实现了它自己。 – Matej

+0

@Matej,谢谢,我忘了开始连接。当我开始它时,我可以从队列中读取大约5000条消息,但随后它在停止很长一段时间的同时检索下一个元素.... – evgeniy44

回答

6

JMS队列浏览器不会保证它会返回队列中的每条消息。它提供了消息的快照,但可能不会全部提供。在ActiveMQ的情况下,它会浏览多少条消息以减少开销。您可以增加限制,请参阅maxBrowsePageSize,但是仍然无法确保对于非常深的队列,您将获得所有这些限制。

一个更好的选择是使用Camel路由,它将针对某个队列的消息发送到另一个进程中队列和镜像队列,您可以使用标准JMS使用者或另一个Camel路由进行排队。这样您就可以按自己的步调使用镜像消息。

+1

镜像队列是解决我的问题的好方法,谢谢! – evgeniy44

0

messagesInQueue.hasMoreElements()始终返回false becouse必须调用

connection.start(); 

之前迭代的队列。

相关问题