有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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 = {} }

有一个空的表格项目。 我想知道是什么原因造成的,以及如何解决这个问题。谢谢


共 (2) 个答案

  1. # 1 楼答案

    以上答案是正确的。我将详细阐述一下它为什么会以这种方式工作

    MapMessage map(theMap)的内容被编组为较小的二进制形式进行传输,甚至可以根据OpenWire协议的设置对其进行压缩。只有在访问映射元素时,映射值才会被懒散地解组,这就是为什么日志语句不会在接收方显示它们。这样做有很多原因

    在代理端,你真的不想花很多时间记录所有的映射元素,只是为了有一些简单的日志显示通过代理的消息,而且你不想经常打包和解包这个映射,因为它可能会增加一些开销

    同样的事情也适用于客户端,在客户端,一些消息可能会根据消息属性等被忽略,因此您不希望无缘无故地增加对映射进行解组的开销

  2. # 2 楼答案

    我们使用ActiveMQ 5.8.0,但有相同的“问题”:接收后记录消息不会打印出“表格”条目

    但是在解析地图消息并再次记录之后,它会打印“theTable”条目

    似乎你不得不“触摸”信息或访问其内容来打印“表格”条目。这至少对我们有用