2011-10-11 113 views
8

所以我有一個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有對象設置爲空。

這種方法很好,如果是的,我做錯了什麼? 我怎樣才能從經紀人收到對象?

+0

消費者仍在運行嗎? Maye他們消耗/從隊列中刪除,而試圖看看? – Dag

+0

不,消費者不運行 – telebog

回答

2

我認爲你使用queuebrowser的方法很好。如果僅用於查看隊列中的消息而不提供UI,則還可以使用JMX支持 - http://activemq.apache.org/jmx.html,並使用jconsole或jvisualvm等工具連接到JMX偵聽器。

您可能正在對不同於消費者或生產者的實例運行您的隊列瀏覽器/監視器,這就是爲什麼您的類不能用於此實例以及objectMessage.getObject()調用失敗的原因 - 它需要類定義可用於將序列化對象轉換爲對象。您可以嘗試將類瓶放入運行瀏覽器的實例中,並查看是否可行。

+0

我有類定義,它接縫,這不是問題。我使用了JConsole,並且看到了它的消息。 – telebog