Как я могу получить все сообщения от брокера ActiveMQ? - PullRequest
8 голосов
/ 11 октября 2011

Итак, у меня есть брокер 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 установил нулевой объект.

Является ли этот подход хорошим и если да, что я делаю неправильно?Как я могу также получить объект от брокера?

1 Ответ

2 голосов
/ 11 октября 2011

Я думаю, что ваш подход к использованию очереди является хорошим.Если цель состоит в том, чтобы просто просмотреть сообщения в очереди и не предоставлять для него пользовательский интерфейс, вы также можете использовать поддержку JMX - http://activemq.apache.org/jmx.html и использовать такой инструмент, как jconsole или jvisualvm, для подключения к прослушивателю JMX.

Вы, вероятно, запускаете свой обозреватель / монитор очереди в экземпляре, отличном от ваших потребителей или производителей, по этой причине ваши классы недоступны для этого экземпляра и почему происходит сбой вызова objectMessage.getObject () - это будетчтобы определение класса было доступно для преобразования сериализованного объекта в объект.Вы можете попробовать поместить jar-файлы класса в экземпляр, где вы запускаете браузер, и посмотреть, работает ли он.

...