1

私は 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;
}

Producer は正しいサイズの 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 を出力します。

データを正しく書き込んでいませんか?正しい方向のポイントは大歓迎です。ありがとう!

4

1 に答える 1

1

cms::BytesMessage の API ドキュメントを読んだことがありますか。基本的に、塗りつぶしたいベクトルにスペースの量を割り当てる必要があります。ベクターのサイズが設定されていないため、何も返されないため、BytesMessage のgetBodyLengthメソッドを使用してベクターを作成できます。

API ドキュメントはここにあります

-ティム www.fusesource.com

于 2011-03-07T21:41:22.870 に答える