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

标签 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

我使用了 Debug模式,并且 ActiveMQObjectMessage 将对象设置为 null。

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

最佳答案

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

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

关于jms - 如何从 ActiveMQ 代理获取所有消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7725145/

相关文章:

spring activemq jmsTemplate.setTimeToLive 需要超过指定毫秒数的时间来删除消息

java - 如何拒绝消息

java - Camel 是否能提高性能?

client - OpenJMS - 客户端端口号

java - 使用 JMS 的 Websphere MQ,关闭的连接卡在 MQ 上

java - 如何知道监听器是否收到 JMS 中的消息?

spring-boot - 在 DefaultMessageListenerContainer 中配置 sessionAcknowledgeMode

java - MessageConsumer接收方法未从远程机器队列读取消息

spring-boot - 如何在spring boot中实现jms队列

java - 通过通用代码向各种设备推送通知