RabbitMQ 与 Jackson2JsonMessageConverter 对字符串进行双重编码

问题描述 投票:0回答:1

我将 RabbitMQ 配置为使用以下消息转换器:Jackson2JsonMessageConverter。然而,它产生了一个问题:当生产者以 JSON 字符串形式发送消息时,消费者收到了这个字符串双编码

示例:

The string sent by producer:     "message": "Hello World!" 
The string received by consumer: "\"message\": \"Hello World!\""

我尝试过的:

解决方案之一是从我的 RabbitMQ 配置中删除 Jackson2JsonMessageConverter,但是我需要 Jackson2JsonMessageConverter,因为我的其他生产者之一将

List<List<MyObject>>
发送到队列,并且我希望能够反序列化它。因此,删除 Jackson2JsonMessageConverter 对我来说不是一个有效的解决方案。


RabbitMQConfig.java:

package dev.abu.screener_backend.rabbitmq;

import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    @Bean
    public AmqpAdmin amqpAdmin(CachingConnectionFactory connectionFactory) {
        return new RabbitAdmin(connectionFactory);
    }

    @Bean
    public RabbitTemplate rabbitTemplate(CachingConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(jacksonConverter());
        return rabbitTemplate;
    }

    @Bean
    public Jackson2JsonMessageConverter jacksonConverter() {
        return new Jackson2JsonMessageConverter();
    }
}

RabbitMQService.java 中用于创建队列、消费者和侦听器的方法:

public void createQueue(String queueName) {
        amqpAdmin.declareQueue(new Queue(queueName, false, true, true));
}

public void createConsumer(String queueName) {
        DirectMessageListenerContainer container = new DirectMessageListenerContainer(connectionFactory);
        container.setQueueNames(queueName);
        container.setMessageListener(getListener());
        container.start();
    }

public MessageListener getListener() {
        return (Message message) -> {
            String payload = new String(message.getBody());
            System.out.println(payload); 
            // and doing something here with payload ...
        };
}

最后,这就是我的生产者向队列发送消息的方式:

String data =
        """
        "message": "Hello World!"
        """; // this is example json
rabbitTemplate.convertAndSend(queue, data);

任何帮助将不胜感激!提前非常感谢!

java json spring rabbitmq jackson-databind
1个回答
0
投票

过了一段时间,我的应用程序中的需求发生了变化,现在我需要将两个字符串值作为字符串数组发送到队列中。因此,原帖中描述的问题已得到解决。

这是我更新的制作人:

// some code above..
String symbol = "abc";
String payload = "{\"message\": \"hello world\"}"; // it is just example, the real payload is different and is not hardcoded. 
rabbitTemplate.convertAndSend(queue, new String[]{symbol, payload});

这里,

symbol
只是一些值,而
payload
是一个真正的json字符串。 这就是我的消费者提取这些数据的方式:

public MessageListener getListener() {
    return (Message message) -> {
        try {
            ObjectMapper mapper = new ObjectMapper();
            String[] data = mapper.readValue(message.getBody(), new TypeReference<>() {});
            String symbol = data[0];
            String payload = data[1]; // now the payload is decoded correctly
            // ...
        } catch (Exception e) {
            // ...
        }
    };
}

我希望它可以帮助也遇到这个问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.