JMS Broker 收到消息为空

JMS Broker receives the message as null

我有一个 C++ 组件,它使用 ActiveMQ 通过 tcp 将消息传递给 JMS 代理。我的经纪人写在JAVA。我想让这两个交流;到 C++ 组件将消息发送到 JAVA 代理。

在 C++ 方面,我正在做的是创建一条消息(使用协议缓冲区),将其转换为字节向量并将其传递给代理。在 JAVA 方(经纪人),我不断地倾听并根据收到的消息采取行动。

现在,我可以看出系统以某种方式工作,因为当我执行我的 C++ 组件时(以及当它传递消息时),我看到我的 JAVA 代理打印一条错误消息:unexpected error:null 每条我从我的 C++ 组件发送的消息。这意味着至少我的消息确实到达了代理,但不知何故它们无法解密,因此出现了空问题。

我正在使用以下内容从 C++ 端编写消息:

            // convert pointmsg to byte
            int size = pointmsg.ByteSize();
            char* byteArray = new char[size];
            pointmsg.SerializeToArray(byteArray, size);

            // convert bytearray to vector
            vector<unsigned char> v(byteArray, byteArray + sizeof byteArray / sizeof byteArray[0]);

            // pass as a vector
            BytesMessage *message = session->createBytesMessage();
            message->writeBytes(v);
            producer->send(message);
            printf("Sent message #%d from thread %s\n", ix + 1, threadIdStr.c_str());

pointmsg只是我创建并填充的一个对象,它不是空的,我已经测试过了,里面有数据。我正在将 pointmsg 转换为字节数组,因为这是我在文档中阅读的传递对象的方式。由于 writeBytes() 函数需要一个向量,因此我将字节数组转换为一个向量。我怀疑这部分可能有问题。

在 JMS 方面,我只是简单地通过以下方式收听即将到来的消息:

public void onMessage(final javax.jms.Message message) {
    final Timer traceTimer = new Timer();
    final long messageReceived = System.currentTimeMillis();
    try {
        if (message instanceof ActiveMQBytesMessage) {

            final ActiveMQBytesMessage amqBytesMsg = (ActiveMQBytesMessage) message;
            final byte[] buffer = amqBytesMsg.getContent().data;

            final String msgType = amqBytesMsg.getStringProperty(LLCom.MSG_PROP_CLASS_NAME);
            final String topic = amqBytesMsg.getStringProperty(LLCom.MSG_PROP_TOPIC_NAME);
            String msgLookUpType;
            if (topic == null || topic.isEmpty()) {
                // get message class name: foo.bar$MessageMsg
                msgLookUpType = msgType.split("\$")[1];
            } else {
                // it's a topic we assume, that all subscribers have the
                // correct type
                msgLookUpType = topic;
            }
            if (logger.isDebugEnabled())
                logger.debug("Router(" + name + ") received message ( " + buffer.length + "bytes)of type or topic " + msgLookUpType);

            final Message req = parsers.createMessage(buffer, msgType);

            // process explicit topic/queue subscriber
            processServiceMessage(msgLookUpType, messageReceived, amqBytesMsg, req, traceTimer);

        } else {
            logger.error("Not supported JMS MessageType: " + message);
        }
    } catch (final Exception e) {
        logger.error("Unexpected error: " + e.getMessage());
        // e.printStackTrace();
    }
}

当我调试它时,我可以看到 msgTypetopic 变量(在 JMS 端)为空,这意味着 activemq 消息不知何故未被解密。这可能是什么原因?我可以看到消息正在发送、接收但未被理解。

有什么想法吗?

更新: 我注意到我希望在 JMS 端获得 stringProperties,我没有在 C++ 端设置它,但我不确定它是否会导致问题或不是。

好的,看来错误与设置属性有关,msgTypetopic,我在 C++ 端使用 setStringProperty() 给了他们预期的字符串和所需的方法,现在初始错误消失了。

message->setStringProperty();