如何从ActiveMQ代理获取所有消息?

时间:2011-10-11 11:14:17

标签: jms activemq

所以我有一个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。

这种方法是否良好,如果是,我做错了什么? 我怎样才能从经纪人那里收到对象?

1 个答案:

答案 0 :(得分:2)

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

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