我正在使用JMX通过QueueControl类及其浏览方法连接到Artemis队列,该方法返回一个CompositeData数组,但我无法使用get方法获取单个标头,因为没有任何标头。请告诉我如何通过Artemis上的JMX获取标头的整个主体,而是某些字段
我也尝试了listMessage方法,但是它提供了一个不完整的标题列表,并且不显示消息的正文
从CompositeData
中获取消息详细信息的关键是CompositeDataCon的
类。
如果我发送这样的消息:
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
如果您不想直接使用常量,您可以在此处找到它们各自的值。
请记住,返回的数据可能会由于管理-消息-属性-大小-限制
而被截断。留档解释了这个设置:
管理消息-属性-大小-限制
是从消息中收集的用于浏览的字节数。这与队列控件上公开的浏览
和列表
管理方法相关。长于此值的消息属性显示为截断。默认为256
。使用-1
关闭此限制。请注意,需要为在给定时刻可见的所有消息分配内存。将此值设置过高可能会影响浏览器稳定性,因为浏览许多消息可能需要大量内存。