如何将CompositeData[]类对象转换为ActiveMQ Artemis JMX中的Message类对象?

问题描述 投票:0回答:1

我正在使用 JMX 通过

QueueControl
类及其浏览方法连接到 ActiveMQ Artemis 队列,该方法返回一个
CompositeData
数组,但我无法使用 get 方法获取各个标头,因为没有任何。请告诉我如何通过 Artemis 上的 JMX 获取某些字段,而不是整个标头

我也尝试了

listMessage
方法,但它给出了不完整的标题列表,并且不显示消息正文

java jmx activemq-artemis
1个回答
0
投票

CompositeData
获取消息详细信息的关键是
CompositeDataConstants
类。

如果我发送这样的消息:

      ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
      Connection connection = connectionFactory.createConnection();
      Session session = connection.createSession();
      MessageProducer messageProducer = session.createProducer(session.createQueue("myQueue"));
      TextMessage message = session.createTextMessage();
      message.setJMSReplyTo(session.createQueue("myReplyTo"));
      message.setText("myText");
      message.setStringProperty("myKey1", "myValue1");
      message.setStringProperty("myKey2", "myValue2");
      messageProducer.send(message);
      connection.close();

您可以浏览队列并反序列化消息数据,例如:

      QueueControl queueControl = ...
      CompositeData[] messages = queueControl.browse();
      for (CompositeData message : messages) {
         System.out.println("JMSMessageID: " + message.get(CompositeDataConstants.USER_ID));
         System.out.println("Destination: " + message.get(CompositeDataConstants.ADDRESS));
         System.out.println("Text: " + message.get(CompositeDataConstants.TEXT_BODY));
         System.out.println("DeliveryMode: " + ((Boolean) message.get(CompositeDataConstants.DURABLE) ? "persistent" : "non-persistent"));
         TabularData stringProps = (TabularData) message.get(CompositeDataConstants.STRING_PROPERTIES);
         for (CompositeData o : (Collection<CompositeData>) stringProps.values()) {
            System.out.println(o.get("key") + ": " + o.get("value"));
         }
      }

这会打印出这样的东西:

JMSMessageID: ID:41171b0e-dfae-11ed-9217-3ce1a1d12939
Destination: myQueue
Text: myText
DeliveryMode: persistent
JMSReplyTo: queue://myReplyTo
myKey1: myValue1
myKey2: myValue2
__AMQ_CID: 41123909-dfae-11ed-9217-3ce1a1d12939

如果您不想直接使用常量,您可以在这里找到它们各自的值。

请记住,返回的数据可能会因

management-message-attribute-size-limit
而被截断。 文档解释了此设置:

management-message-attribute-size-limit
是从消息中收集的用于浏览的字节数。这与队列控件上公开的
browse
list
管理方法相关。长度超过此值的消息属性将显示为被截断。默认为
256
。使用
-1
关闭此限制。请注意,需要为给定时刻可见的所有消息分配内存。将此值设置得太高可能会影响浏览器的稳定性,因为浏览许多消息可能需要大量内存。

© www.soinside.com 2019 - 2024. All rights reserved.