我正在使用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。
我没有正确写入数据吗?正确方向的任何一点都非常感谢。谢谢!
答案 0 :(得分:1)
您是否阅读过cms :: BytesMessage的API文档,其中总结得相当好。基本上,您需要在要填充的向量中分配空间量。由于矢量大小不会返回任何内容,您可以使用BytesMessage的 getBodyLength 方法创建矢量。
API文档位于here。
-Tim www.fusesource.com