On Wed, Oct 27, 2010 at 11:50 AM, Jun8 <ctaski...@gmail.com> wrote: > I've Google for a day now and could not find full information on the > following problem. > > I want to serialize protobuf messages in C++, send them to a JMS > (using activemq-cpp API) and parse in my Java server. Based on what I > found in my searches, here's my C++ function that serializes the > message: > > /* > * Serialize given protobuf message and send to Active MQ JMS using > the producer. > */ > void MessageProducer::send( const diva::messaging::Message& > proto_mesg ) > { > using namespace google::protobuf::io; > > long bufLength = proto_mesg.ByteSize() + > CodedOutputStream::VarintSize32( proto_mesg.ByteSize() ); > unsigned char buf[bufLength]; > > ZeroCopyOutputStream* raw_output = new ArrayOutputStream( buf, > bufLength ); > CodedOutputStream* coded_output = new CodedOutputStream(raw_output); > > // Prepend the message size to wire message. > coded_output->WriteVarint32( proto_mesg.ByteSize() ); >
You're writing the message size as a prefix to the message data here... > > proto_mesg.SerializeToCodedStream(coded_output); > > // Create an ACtive JMS message and insert task & module information > in header. > cms::BytesMessage* message = m_session->createBytesMessage(); > > // Write serialized protobuf message to the JMS message and send. > message->writeBytes( buf, 0, bufLength ); > m_producer->send( message ); > > delete message; > delete coded_output; > delete raw_output; > } > > And here's the part in Java that parses teh received messages from > JMS: > > // Create a byte array for received message. > BytesMessage receivedMessage = > (BytesMessage)received_message; > logger.info("received message in NAC"); > byte[] mesg_bytes = new > byte[(int)receivedMessage.getBodyLength()]; > int num_read = > receivedMessage.readBytes(mesg_bytes); > Presumably these bytes contain all the data that you wrote out, including the size prefix... > if ( num_read != receivedMessage.getBodyLength() ) { > throw new Exception("Error reading message > into byte array"); > } > > // Create registry for all possible DIVA messages. > ExtensionRegistry er = > ExtensionRegistry.newInstance(); > DivaBase.registerAllExtensions(er); > > // Parse the received message. > diva.messaging.DivaBase.Message m = > diva.messaging.DivaBase.Message.parseFrom( mesg_bytes, er ); > ...but parseFrom expects only the message data, not a message length prefix. I'd just remove the WriteVarint32(proto_mesg.ByteSize()) call, since you are using a transport mechanism that has its own means for delimiting messages. > Currently, I get > > Problem parsing message received in NAC: > com.google.protobuf.InvalidProtocolBufferException: Protocol message > end-group tag did not match expected tag. > Problem parsing message received in NAC: java.lang.ClassCastException: > org.apache.activemq.command.ActiveMQTextMessage cannot be cast to > javax.jms.BytesMessage > > errors for each message and cannot see what I'm doing wrong. > > Thanks for any comments on the code and/or pointers you might provide. > > -- > You received this message because you are subscribed to the Google Groups > "Protocol Buffers" group. > To post to this group, send email to proto...@googlegroups.com. > To unsubscribe from this group, send email to > protobuf+unsubscr...@googlegroups.com<protobuf%2bunsubscr...@googlegroups.com> > . > For more options, visit this group at > http://groups.google.com/group/protobuf?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to proto...@googlegroups.com. To unsubscribe from this group, send email to protobuf+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/protobuf?hl=en.