ActiveMQ从队列中获取所有消息

时间:2013-11-27 14:41:00

标签: java activemq jmx

我想创建一些能够管理队列内部消息的工具。所以我希望能够从队列中获取所有消息(类似于导出)并且不要从那里删除它。

我尝试使用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。

此外,如果我尝试使用consumer,它会检索所有消息,但会将其从队列中删除。

我尝试使用命令行工具从队列中导出消息:

activemq browse --amqurl tcp://localhost:55901 tmp_queue2  >> messages22222.txt

但如果队列包含大约1000000条消息,则抛出

Failed to execute main task. Reason: java.lang.OutOfMemoryError: GC overhead limit exceeded

那么,如何从队列中获取所有消息并且不从那里删除它们?

2 个答案:

答案 0 :(得分:6)

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

更好的选择是使用Camel路由将针对某个队列的消息发送到另一个进程队列和镜像队列,您可以使用标准JMS使用者或其他Camel路由来消耗这些队列。这样,您可以按自己的节奏使用镜像消息。

答案 1 :(得分:1)

messagesInQueue.hasMoreElements()总是返回false,因为你必须调用

connection.start();
在迭代队列之前