JMS代理接收消息为空

时间:2015-06-02 10:18:24

标签: jms activemq broker

我有一个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只是我创建并填写的一个对象,它不是null,我已经测试过它并且里面有数据。我正在将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 ++端设置,但我不确定它是否会导致问题。

1 个答案:

答案 0 :(得分:-1)

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

message->setStringProperty();