Activemq-cpp BytesMessage - PullRequest
       14

Activemq-cpp BytesMessage

1 голос
/ 08 марта 2011

Я работаю с 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.

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

1 Ответ

1 голос
/ 08 марта 2011

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

Документы API расположены здесь .

-Tim www.fusesource.com

...