【问题标题】:Spring AMQP Headers are returned as String onlySpring AMQP 标头仅作为字符串返回
【发布时间】:2016-09-15 06:57:15
【问题描述】:

我正在使用带有 AMQP 版本 2.0.0 快照的 Java Spring。我创建了一个 AMQP 消息,发送它。在另一个服务中,我正确接收了消息,除了标题而不是接收类型 Object,每个标题都是 String 类型。

发布者代码:

Message responseMessage = MessageBuilder
    .withBody(SerializationUtils.serialize(person))
    .setContentType(MessageProperties.CONTENT_TYPE_SERIALIZED_OBJECT)
    .setHeader("STUDENT_TYPE", "New") // Not part of person object but related
    .setHeader("PET", getPet()) // This is a pet object
    .build();
rabbitTemplate.send(responseMessage);

消费者代码:

Object messageBody = SerializationUtils.deserialize(amqpMessage.getBody());
Person person = (Person)messageBody;
MessageProperties properties = amqpMessage.getMessageProperties();
String type = properties.getHeaders().get("STUDENT_TYPE").toString();
Pet pet = (Pet)properties.getHeaders().get("PET");

当我运行上述代码时,我将在消费者代码的最后一行失败,并显示错误:无法将字符串转换为宠物。消息正常,除了在消费者代码中接收到的每个标头都是 String 类型。

USAGE: MessageBuilder.setHeader(String Key, Object Value);

USAGE: Properties.getHeaders() returns Map<String,Object>

每个标题都有字符串/对象类型的键/值对。我所做的工作也是序列化我想传递非字符串/整数值的标头,但这似乎超出了标头的重点。我错过了什么吗?

【问题讨论】:

    标签: java spring rabbitmq message amqp


    【解决方案1】:

    您需要将您的 Pet 序列化为一个字符串,并在您在另一个服务中获取它时反序列化它。例如。您可以使用 fasterxml Jackson 并将其序列化为 JSON 字符串

    【讨论】:

    • 它在哪里明确说我的“字符串”真的是一只宠物?我正在填充一个标题。标头只是一个映射条目。这个映射条目,这个键值对,是一种类型——KEY 是 STRING,VALUE 是 OBJECT。 -- , headers.put("MyNewPet", myDog); -- 但是另一方面,当我退出标题时,突然 Map 现在是 - 对象发生了什么?
    • 我猜这是因为 amqp 不会将您的对象序列化为字节,很可能它只是调用 toString() 并通过代理传递字符串。据我所知,这些队列只传递字符串
    【解决方案2】:

    你告诉编译器你的String 真的是一个宠物。但是,Pet 不是 Stringsubclass。有两种可能的解决方案:

    解决方案1:你确定Pet extends String,像这样:

    public class Pet extends String {
        //...
    }
    

    然后您就可以将String 转换为Pet

    解决方案2:您实现Pet 的构造函数,它以String 作为参数:

    public class Pet {
        //...
        Public Pet(String name) {
            //...
        }
        //...
    }
    

    【讨论】:

    • 它在哪里明确说我的“字符串”真的是一只宠物?我正在填充一个标题。标头只是一个映射条目。这个映射条目,这个键值对,是一种类型——KEY 是 STRING,VALUE 是 OBJECT。 -- , headers.put("MyNewPet", myDog); -- 但是另一方面,当我退出标题时,突然 Map 现在是 - 对象发生了什么?
    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    相关资源
    最近更新 更多