结论
消息发送者和消费者 使用的消息转换器不同导致的(查看是否在消息发送者和消费者中添加了相同的消息转换器),默认使用的是 SimpleMessageConverter,在消息发送者和消费者中添加 Jackson2JsonMessageConverter 转换器,并导入相关依赖如下所示
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
其他报错
1、Cannot construct instance of RabbitMqAccepted ` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
解决方法:也是在 RabbitMqAccepted 类中 加入 @NoArgsConstructor 注解
2、No serializer found for class RabbitMqAccepted and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
解决方法:在 RabbitMqAccepted 类中 加入 @Getter 注解
参考另一文章
以下是我的详细代码
1、配置队列
@Configuration
@RequiredArgsConstructor
public class RabbitAcceptConfig {
/** 队列名称 */
public static final String QUEUE_NAME = "tmp-accepted";
/** 死信名称 */
public static final String DEAD_LETTER_QUEUE_NAME = "tmp-accepted-dl";
/**
* 队列
* @return queue
*/
@Bean
Queue acceptQueue() {
return new DefaultQueue(QUEUE_NAME, this.acceptDeadLetterQueue().getName());
}
/**
* 死信队列
* @return queue
*/
@Bean
Queue acceptDeadLetterQueue() {
return new DefaultDeadLetterQueue(DEAD_LETTER_QUEUE_NAME);
}
}
/**
* 注意:不加 @Getter 注解,会报上述第二种错误
* 不加 @NoArgsConstructor,会报第一种错误,
*/
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class RabbitMqAccepted implements Serializable {
private String content;
}
使用 rabbitTemplate 发送消息
@Service
@Transactional
public class CustomService {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage() {
// Message送信
this.rabbitTemplate.convertAndSend(RabbitAcceptConfig.QUEUE_NAME, new RabbitMqAccepted("test"));
}
}
监听消息,对消息进行处理
@Slf4j
@Component
@Transactional
public class Handler {
// 监听消息处理
@RabbitListener(id = RabbitAcceptConfig.QUEUE_NAME,
queues = RabbitAcceptConfig.QUEUE_NAME)
public void on(RabbitMqAccepted accepted) {
String content = accepted.getContent();
// 输出:content :test
log.info("content :{}", content);
}
}