一、需求 发送时需要将对象序列化为json接收时,字符串反序列化为对象。
二、方案 1、序列化 在任何配置类别下提供RabbitTemplate的bean,覆盖Springboot自动配置。将信息转译器设置为springboot提供的Jackson转译器。
// 提供自定义RabbitTemplate,将对象序列化为json串 @Bean public RabbitTemplate jacksonRabbitTemplate(ConnectionFactory connectionFactory) {undefined RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter()); return rabbitTemplate; }
2、反序列化 实现RabbitListenerConfigurer配置反序列化转译器的接口(可以是序列化转译器)bean也放在这里))
@Configuration public class RabbitMQConfig implements RabbitListenerConfigurer { // 可以将json串反序列化为对象 @Override public void configureRabbitListeners(RabbitListenerEndpointRegistrar rabbitListenerEndpointRegistrar) { rabbitListenerEndpointRegistrar.setMessageHandlerMethodFactory(messageHandlerMethodFactory()); } @Bean MessageHandlerMethodFactory messageHandlerMethodFactory(){ DefaultMessageHandlerMethodFactory messageHandlerMethodFactory = new DefaultMessageHandlerMethodFactory(); messageHandlerMethodFactory.setMessageConverter(mappingJackson2MessageConverter()); return messageHandlerMethodFactory; } @Bean public MappingJackson2MessageConverter mappingJackson2MessageConverter(){ return new MappingJackson2MessageConverter(); } // 提供自定义RabbitTemplate,将对象序列化为json串 @Bean public RabbitTemplate jacksonRabbitTemplate(ConnectionFactory connectionFactory) { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter()); return rabbitTemplate; } }
三、测试 可以定义消费者直接以对象的形式接收消息
@RabbitListener(queues = "huawei") public void huaweiHandler(SysUserEntity msg) { System.out.println("huaweiHandler>>>>>" msg); }
生产者直接发送对象
SysUserEntity user = new SysUserEntity(1l,"wtq","123",new Date()); rabbitTemplate.convertAndSend(RabbitTopicConfig.TOPIC_NAME, "huawei.",user);
与序列化无关
@Payload 与 @Headers
- 使用 @Payload 和 @Headers 可以在消息中注释 body 与 headers 信息
@RabbitListener(queues = "debug") public void processMessage1(@Payload String body, @Headers Map<String,Object> headers) { System.out.println("body:" body); System.out.println("Headers:" headers); }
也可获得单个 Header 属性
@RabbitListener(queues = "debug") public void processMessage1(@Payload String body, @Header String token) { System.out.println("body:" body); System.out.println("token:" token); }
注意:@payload代表的请求体是我们发送的信息