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




Ключом к получению сведений о сообщении из 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» в JMS определяет, как брокер будет хранить сообщение (т. е. сохранять его на диск или нет). Это представлено «устойчивым» заголовком сообщения (например, CompositeDataConstants.DURABLE). Мой ответ демонстрирует, как получить эту информацию.
JMS «ReplyTo» можно найти в тексте «PropertiesText» CompositeData (т. е. CompositeDataConstants.PROPERTIES) как JMSReplyTo. Я обновлю свой ответ, чтобы включить это, а также пример вывода.
Спасибо за ответ. И как тогда выводить отдельный заголовок JMSReplyTo и отдельный HashMap с парой ключевых значений всех свойств, которые мы сами можем задать через метод setStringProperty?
Я обновил свой ответ, чтобы ответить на ваш комментарий. Надеюсь, это поможет!
FWIW, все, что я делаю, это смотрю на CompositeData[], возвращаемый методом browse(), в отладчике, а затем пишу код, чтобы получить части, о которых вы спрашиваете. Якобы вы могли бы сделать то же самое.
Большое спасибо, я сегодня очень глупая, извините
Спасибо за ответ, но я не могу найти в этом классе и в документации, как получить заголовки DeliveryMode и ReplyTo