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() );

        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);
                        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 );

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 [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en.

Reply via email to