java - 使用 Protobuf 的 Java 中的 RabbitMQ。解析接收到的数据

标签 java rabbitmq message-queue protocol-buffers spring-amqp

我目前正在使用 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;
}

我必须做什么才能构建对象?

这是我的原型(prototype)文件:

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

我想从 template.receiveAndConvert() 获取类 queueReply

最佳答案

找到解决方案。

DynamicMessage o = (DynamicMessage)template.receiveAndConvert("queueName");
ProtoObject request = ProtoObject.parseFrom(o.toByteArray()); 

关于java - 使用 Protobuf 的 Java 中的 RabbitMQ。解析接收到的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25260223/

相关文章:

c++ - 消息队列,C++多线程

java - 在 RESTful Web 服务中将对象作为参数传递

java - 在 JTextPane 中设置字体宽度

java - 为什么我在通过 TCP 套接字发送手动创建的 HTTP 请求时收到 HTTP 400 错误请求响应?

c# - SSL 端口 5671 上的 RabbitMQ 无法访问,但可在 telnet 上访问

RabbitMQ - 非持久队列的用例

java - 如何在另一个类中调用列表对象

rabbitmq - 如何修改 spring-websocket 以通过 MQTT 而不是 STOMP 与代理接口(interface)?

java - 在同一 channel 上消费和发布消息

php - PHP (CakePHP) 中的异步处理或消息队列