前言
前面学习了RabbitMQ的使用场景和基础概念,现在来用一个RabbitMQ案例,来正式学习一下MQ的使用。
这个案例分为两个部分,消息生产者和消息消费者。模拟用户注册场景,生产者将用户手机号发送到MQ,消费者监听MQ队列,获取用户手机号发送短信。
具体实现功能如下:
- 使用RabbitMQ客户端消息confirm和redis,确保消息正确发送到MQ,不会产生丢失;
- 结合消息过期(TTL)和死信队列(DLX)实现消费异常的延迟重试;
- 消息处理失败达到最大重试次数之后,将其发送到失败队列,等待人工处理。
正文
项目版本:Springboot2.0.4、RabbitMQ3.7.7
项目具体流程如下:
具体代码
1、定义一个消息交换机和三个消息队列。
@Slf4j
@Configuration
public class RabbitConfig {
/**
* 声明一个交换机
* @return
*/
@Bean
public TopicExchange smsCaptchaExchange() {
return new TopicExchange("sms_captcha", true, false);
}
/**
* 正常的消费队列
* @return
*/
@Bean
public Queue smsCaptchaQueue() {
return new Queue("sms@captcha", true, false, false);
}
/**
* 延时重试队列
*/
@Bean
public Queue smsCaptchaRetryQueue() {
Map<String, Object> arguments = new HashMap<>();
arguments.put("x-message-ttl", 10 * 1000);
arguments.put("x-dead-letter-exchange", "sms_captcha");
arguments.put("x-dead-letter-routing-key", "sms.captcha");
return new Queue("sms@captcha@retry", true, false, false, arguments);
}
/**
* 处理失败后存放消息的队列
* @return
*/
@Bean
public Queue smsCaptchaFailedQueue() {
return new Queue("sms@captcha@failed", true, false, false);
}
/**
* 将队列与交换机绑定
* @return
*/
@Bean
public Binding smsC