java ActiveMQ MapMessage接收带有空表的消息
我正在使用ActiveMQ 5.9.0发送和接收JMS。 首先,我在队列中发送MapMessage:
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("my-queue");
MessageProducer producer = session.createProducer(destination);
MapMessage message = session.createMapMessage();
message.setDouble(key, value);
producer.send(message);
session.commit();
session.close();
connection.close();
System.out.println(message);
打印出来的是:
ActiveMQMapMessage {commandId = 0, responseRequired = false, messageId = ID:LT006632-52708-1382520875674-11:1:1:1:1, originalDestination = null, originalTransactionId = null, producerId = null, destination = queue://my-queue, transactionId = TX:ID:LT006632-52708-1382520875674-11:1:1, expiration = 0, timestamp = 1382520891291, arrival = 0, brokerInTime = 0, brokerOutTime = 0, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@33cf4, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 0, properties = null, readOnlyProperties = false, readOnlyBody = false, droppable = false, jmsXGroupFirstForConsumer = false} ActiveMQMapMessage{ theTable = {entry 6=922.0} }
消息中有正确的表格
它通过以下方式在另一个项目中接收消息:
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
Connection connection = connectionFactory.createConnection();
connection.start();
final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("my-queue");
MessageConsumer consumer = session.createConsumer(destination);
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message msg) {
MapMessage message = (MapMessage) msg;
// TODO something....
try {
System.out.println(message.getJMSType());
session.commit();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Thread.sleep(30000);
session.close();
connection.close();
但在收到打印出来的信息时:
ActiveMQMapMessage {commandId = 6, responseRequired = false, messageId = ID:LT006632-52708-1382520875674-11:1:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:LT006632-52708-1382520875674-11:1:1:1, destination = queue://my-queue, transactionId = TX:ID:LT006632-52708-1382520875674-11:1:1, expiration = 0, timestamp = 1382520891291, arrival = 0, brokerInTime = 1382520891291, brokerOutTime = 1382520891298, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@186db54, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 0, properties = null, readOnlyProperties = true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = false} ActiveMQMapMessage{ theTable = {} }
有一个空的表格项目。 我想知道是什么原因造成的,以及如何解决这个问题。谢谢
# 1 楼答案
以上答案是正确的。我将详细阐述一下它为什么会以这种方式工作
MapMessage map(theMap)的内容被编组为较小的二进制形式进行传输,甚至可以根据OpenWire协议的设置对其进行压缩。只有在访问映射元素时,映射值才会被懒散地解组,这就是为什么日志语句不会在接收方显示它们。这样做有很多原因
在代理端,你真的不想花很多时间记录所有的映射元素,只是为了有一些简单的日志显示通过代理的消息,而且你不想经常打包和解包这个映射,因为它可能会增加一些开销
同样的事情也适用于客户端,在客户端,一些消息可能会根据消息属性等被忽略,因此您不希望无缘无故地增加对映射进行解组的开销
# 2 楼答案
我们使用ActiveMQ 5.8.0,但有相同的“问题”:接收后记录消息不会打印出“表格”条目
但是在解析地图消息并再次记录之后,它会打印“theTable”条目
似乎你不得不“触摸”信息或访问其内容来打印“表格”条目。这至少对我们有用