Байтессообщение Activemq-cpp

Я работаю с activemq-cpp и пытаюсь отправить двоичные данные с помощью BytesMessage. У меня есть производитель и потребитель, настроенные для отправки и получения сообщения. Соединение и сеанс работают правильно, потому что я могу опубликовать сообщение в теме и разрешить потребителю получить сообщение с помощью TextMessage. После проверки подключения я изменил свою реализацию TextMessage на BytesMessage. Проблема, с которой я сталкиваюсь сейчас, заключается в перекодировании BytesMessages и получении данных из сообщения после его получения.

В моем продюсере у меня есть:

    void producer() {
        try {
                //....setup code

                //temporary vector
                vector<unsigned char> vec;
                unsigned char temp1 = 'a';
                vec.push_back(temp1);
                vec.push_back(temp1);
                vec.push_back(temp1);

                BytesMessage * message = session->createBytesMessage();
                message->writeBytes(vec);
                cout << "SIZE IS: " << vec.size() << endl;
                producer->send( message );

                delete message;

            } catch (CMSException& e) {
                e.printStackTrace();
            }

} 

В моем потребителе у меня есть:

void begin(){
    // setup code to get session, etc.

    shared_ptr<BytesMessage> bytemessage =
            boost::dynamic_pointer_cast<BytesMessage>(message);

    vector<unsigned char> temp;
    bytemessage->readBytes(temp);

    cout << "SIZE IS: " << temp.size() << endl;
}

Производитель распечатывает размер 3, что является правильным. Но потребитель выводит размер 0, указывая на то, что он не прочитал сообщение, которое ранее было написано правильно. Что заставляет меня спросить, что я делаю неправильно?

Я попытался написать и прочитать его локально, и все же я не могу этого сделать:

    void producer() {
        try {
                //....setup code

                //temporary vector
                vector<unsigned char> vec;
                unsigned char temp1 = 'a';
                vec.push_back(temp1);
                vec.push_back(temp1);
                vec.push_back(temp1);

                BytesMessage * message = session->createBytesMessage();
                message->writeBytes(vec);
                cout << "SIZE IS: " << vec.size() << endl;

                message->reset();

                vector<unsigned char> temp2;
                message->readBytes(temp2);

                cout << "SIZE IS2: " << temp2.size() << endl;

                delete message;

            } catch (CMSException& e) {
                e.printStackTrace();
            }

} 

cout после записи выводит 3, но cout после чтения по-прежнему печатает 0.

Я не правильно пишу данные? Любая точка в правильном направлении высоко ценится. Спасибо!


person user459811    schedule 07.03.2011    source источник


Ответы (1)


Вы читали документацию по API для cms::BytesMessage, она достаточно хорошо изложена там. В основном вам нужно выделить объем пространства в векторе, который вы хотите заполнить. Поскольку ваш вектор не имеет размера, он ничего не возвращает, вы можете создать вектор, используя метод getBodyLength BytesMessage.

Документация по API находится здесь.

-Тим www.fusesource.com

person Tim Bish    schedule 07.03.2011