我将 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 对我来说不是一个有效的解决方案。
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();
}
}
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);
任何帮助将不胜感激!提前非常感谢!
过了一段时间,我的应用程序中的需求发生了变化,现在我需要将两个字符串值作为字符串数组发送到队列中。因此,原帖中描述的问题已得到解决。
这是我更新的制作人:
// 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) {
// ...
}
};
}
我希望它可以帮助也遇到这个问题的人。