RabbitMQ на Java с использованием Protobuf. Разобрать полученные данные

В настоящее время я использую springAMQP для связи между java и моим узлом RabbitMQ. Я отправляю данные Protobuf.

Я хотел бы преобразовать/преобразовать/разобрать полученное сообщение в соответствующий ProtoClass.

Вот фрагмент моего конвертера:

@Override
protected Message createMessage(Object object, MessageProperties messageProperties) {
    Preconditions.checkNotNull(object, "Object to send is null !");

    if (!com.google.protobuf.Message.class.isAssignableFrom(object.getClass())) {
        throw new MessageConversionException("Message wasn't a protobuf");
    } else {
        com.google.protobuf.Message protobuf = (com.google.protobuf.Message) object;
        byte[] byteArray = protobuf.toByteArray();

        messageProperties.setContentLength(byteArray.length);
        messageProperties.setContentType(ProtobufMessageConverter.CONTENT_TYPE_PROTOBUF);
        messageProperties.setHeader(ProtobufMessageConverter.MESSAGE_TYPE_NAME, protobuf.getDescriptorForType().getName());

        return new Message(byteArray, messageProperties);
    }
}

@Override
public Object fromMessage(Message message) throws MessageConversionException {

    com.google.protobuf.Message parsedMessage = null;
    try {
        if(ProtobufMessageConverter.CONTENT_TYPE_PROTOBUF.equals(message.getMessageProperties().getContentType())) {
            String typeName = getMessageTypeName(message);
            Descriptors.Descriptor messageType = fileDescriptor.findMessageTypeByName(typeName);
            parsedMessage = DynamicMessage.parseFrom(messageType, message.getBody());
        }
    } catch (Exception e) {
        throw new AmqpRejectAndDontRequeueException("Cannot convert, unknown message type %s".format(getMessageTypeName(message)));
    }
    return parsedMessage;
}

Что мне нужно сделать, чтобы иметь возможность построить объект?

Вот мой прото файл:

message queueReply {
    required string identifier = 1; cycle
    required uint32 keyId = 2;
    required bool success = 3; 
    required bytes result = 4; 
}

Я хотел бы получить класс queueReply из template.receiveAndConvert()


person mangusbrother    schedule 12.08.2014    source источник
comment
У вас есть где-нибудь полный код? Я пытаюсь интегрировать это с Spring Boot, но пока это не работает.   -  person Adam Arold    schedule 18.10.2016
comment
может у меня где-то есть копия. хотя и не с открытым исходным кодом.   -  person mangusbrother    schedule 19.10.2016
comment
У меня есть код (идентификатор где-то общедоступен на github), но он не вызывается. У вас есть код для получения сообщений protobuf? Я говорю о MessageListener здесь.   -  person Adam Arold    schedule 19.10.2016
comment
думаю, я использовал amqptemplate в SpringAMQP   -  person mangusbrother    schedule 19.10.2016
comment
И откуда fileDescriptor в вашем коде?   -  person Adam Arold    schedule 19.10.2016
comment
это дескриптор файла protobuf разработчиков. google.com/protocol-buffers/docs/reference/java/com/   -  person mangusbrother    schedule 19.10.2016
comment
Я знаю его тип, но ссылки на него нет   -  person Adam Arold    schedule 19.10.2016


Ответы (1)


Решение найдено.

DynamicMessage o = (DynamicMessage)template.receiveAndConvert("queueName");
ProtoObject request = ProtoObject.parseFrom(o.toByteArray()); 
person mangusbrother    schedule 12.08.2014