【问题标题】:How can I get all messages from a ActiveMQ broker?如何从 ActiveMQ 代理获取所有消息?
【发布时间】:2011-12-05 05:24:07
【问题描述】:

所以我有一个 ActiveMQ 代理和一些将一些自制对象放入代理的生产者。我也有一些消费者可以毫无问题地接收这些消息(序列化对象)。但我想创建一个连接代理并显示所有消息(序列化对象)的工具。

我尝试使用 ActiveMQConnection 来做到这一点:

Set<ActiveMQQueue> currentMessageQueues = activeMQConnection.getDestinationSource().getQueues();
Iterator<ActiveMQQueue> messageQueueIterator = currentMessageQueues.iterator();

while (messageQueueIterator.hasNext()) {
    ActiveMQQueue currentQueue = messageQueueIterator.next();
    QueueSession queueSession = activeMQConnection.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
    QueueBrowser browser = queueSession.createBrowser(currentQueue);
    Enumeration<?> messagesInQueue = browser.getEnumeration();

    while (messagesInQueue.hasMoreElements()) {
       Message queueMessage = (Message) messagesInQueue.nextElement();

       if (queueMessage instanceof ActiveMQObjectMessage) {
          ActiveMQObjectMessage objectMessage = (ActiveMQObjectMessage) queueMessage;
          objectMessage.getObject();
       }
    }
 }

使用此代码,我在 objectMessage.getObject() 上遇到异常:

javax.jms.JMSException: Failed to build body from content. Serializable class not available to broker. Reason: java.lang.ClassNotFoundException: MyMessage

我使用了调试模式,ActiveMQObjectMessage 将对象设置为 null。

这种方法好吗?如果是,我做错了什么? 我如何也可以从代理接收对象?

【问题讨论】:

  • 消费者还在运行吗?可能他们在尝试查看时消耗/从队列中删除?

标签: jms activemq


【解决方案1】:

我认为您使用队列浏览器的方法很好。如果目的只是查看队列上的消息而不为其提供 UI,您还可以使用 JMX 支持 - http://activemq.apache.org/jmx.html 并使用 jconsole 或 jvisualvm 之类的工具连接到 JMX 侦听器。

您可能在与您的消费者或生产者不同的实例上运行您的队列浏览器/监视器,这就是您的类对该实例不可用以及 objectMessage.getObject() 调用失败的原因 - 它需要类定义可用于将序列化对象转换为对象。您可以尝试将类 jar 放在运行浏览器的实例中,看看是否可行。

【讨论】:

  • 我有类定义,看起来这不是问题。我使用了 JConsole,我看到了我的消息。
猜你喜欢
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 2019-10-27
相关资源
最近更新 更多