Как перевести объекты класса CompositeData[] в объекты класса Message в Artemis JMX?

Я использую JMX для подключения к очереди Artemis через класс QueueControl и его метод просмотра, который возвращает массив CompositeData, но я не могу получить отдельные заголовки с помощью методов get, поскольку их нет. Подскажите пожалуйста, как получить не все тело заголовков, а отдельные поля через JMX на Artemis

Я также пробовал метод listMessage, но он выдает неполный список заголовков и не отображает тело сообщения.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ключом к получению сведений о сообщении из 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, чтобы отключить это ограничение. Обратите внимание, что память должна быть выделена для всех сообщений, видимых в данный момент. Слишком большое значение этого параметра может повлиять на стабильность работы браузера из-за большого объема памяти, который может потребоваться для просмотра большого количества сообщений.

Спасибо за ответ, но я не могу найти в этом классе и в документации, как получить заголовки DeliveryMode и ReplyTo

Vanish 20.04.2023 19:10

«DeliveryMode» в JMS определяет, как брокер будет хранить сообщение (т. е. сохранять его на диск или нет). Это представлено «устойчивым» заголовком сообщения (например, CompositeDataConstants.DURABLE). Мой ответ демонстрирует, как получить эту информацию.

Justin Bertram 20.04.2023 20:14

JMS «ReplyTo» можно найти в тексте «PropertiesText» CompositeData (т. е. CompositeDataConstants.PROPERTIES) как JMSReplyTo. Я обновлю свой ответ, чтобы включить это, а также пример вывода.

Justin Bertram 20.04.2023 20:17

Спасибо за ответ. И как тогда выводить отдельный заголовок JMSReplyTo и отдельный HashMap с парой ключевых значений всех свойств, которые мы сами можем задать через метод setStringProperty?

Vanish 20.04.2023 20:57

Я обновил свой ответ, чтобы ответить на ваш комментарий. Надеюсь, это поможет!

Justin Bertram 20.04.2023 21:10

FWIW, все, что я делаю, это смотрю на CompositeData[], возвращаемый методом browse(), в отладчике, а затем пишу код, чтобы получить части, о которых вы спрашиваете. Якобы вы могли бы сделать то же самое.

Justin Bertram 20.04.2023 21:15

Большое спасибо, я сегодня очень глупая, извините

Vanish 20.04.2023 21:36

Другие вопросы по теме