2011-10-11 9 views
8

Quindi ho un broker ActiveMQ e alcuni produttori che mettono alcuni oggetti autoprodotti nel broker. Ho anche alcuni consumatori che ricevono questi messaggi (oggetti serializzati) senza problemi. Ma voglio creare uno strumento che si connetta al broker e mostri tutti i messaggi (oggetti serializzati).Come posso ottenere tutti i messaggi da un broker ActiveMQ?

ho cercato di farlo usando e 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(); 
     } 
    } 
} 

Con questo codice ottengo un'eccezione sulla objectMessage.getObject():

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

Ho usato la modalità di debug e ActiveMQObjectMessage ha l'oggetto impostato su null.

Questo approccio è buono e se sì, cosa sto facendo male? Come posso ricevere l'oggetto anche dal broker?

+0

Il consumatore è ancora in esecuzione? Possono consumare/rimuovere dalla coda mentre cercano di dare un'occhiata? – Dag

+0

no, l'utente non esegue – telebog

risposta

2

Penso che il tuo approccio all'utilizzo di un queue-mooner sia buono. Se lo scopo è solo visualizzare i messaggi sulla coda e non fornirvi un'interfaccia utente, è anche possibile utilizzare il supporto JMX - http://activemq.apache.org/jmx.html e utilizzare uno strumento come jconsole o jvisualvm per connettersi al listener JMX.

Probabilmente stai eseguendo il tuo browser di coda/monitor su un'istanza diversa dai tuoi consumatori o produttori, questo è il motivo per cui le tue classi non sono disponibili per questa istanza e perché la chiamata objectMessage.getObject() ha esito negativo - avrebbe bisogno la definizione della classe deve essere disponibile per trasformare l'oggetto serializzato in un oggetto. Puoi provare a inserire i jar di classe nell'istanza in cui stai eseguendo il browser e vedere se funziona.

+0

Ho la definizione della classe, è sufficiente che questo non sia il problema. Ho usato JConsole e vedo i miei messaggi con esso. – telebog