【问题标题】:JMS Broker receives the message as nullJMS Broker 接收到的消息为 null
【发布时间】:2015-08-16 01:59:10
【问题描述】:

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

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

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

我正在使用以下内容从 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++ 端设置它,但我不确定它是否会导致问题。

【问题讨论】:

    标签: jms activemq broker


    【解决方案1】:

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

    message->setStringProperty();
    

    【讨论】:

    • 请您添加对所做操作的详细说明吗?当您说“错误与设置属性、msgType 和主题有关,我给了他们预期的字符串”时,您是什么意思?给了?谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 2012-01-19
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2014-12-30
    相关资源
    最近更新 更多