- 背景
- 解决
- yml配置
- 生产者
- 消费者
背景
最近在开发一个公众号的项目,现在有一个需求是需要向多个用户发送消息模板,但是由于用户比较多,发送的比较慢。所以采取的措施是,当后台一键提醒之后,先将需要提醒的用户和信息加入消息队列,不请求发送模板消息接口,当加入消息队列成功之后,就返回成功。然后再监听消息队列,当队列中有消息时,自动取出消息,调用发送接口消费,给用户发送模板消息。
但是当消费失败的时候,消息队列会一直重复的发送消息,导致程序死循环。
解决
yml配置
配置RabbitMQ,消费消息失败之后,重试三次,将消息干掉
# rabbitmq
rabbitmq:
host: ****
username: ****
password: ****
virtual-host: ****
listener:
simple:
#决定被拒绝的消息是否重新入队
default-requeue-rejected: true
retry:
#时间间隔5秒
initial-interval: 5000ms
enabled: true
#最大重试次数
max-attempts: 3
生产者
private final AmqpTemplate amqpTemplate;
public void sendTemplateToMany() {
String res = "测试发送消息";
this.amqpTemplate.convertAndSend("","", res);
}
消费者
@Component
@Slf4j
public class ListenerQueue {
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "", durable = "true"),
exchange = @Exchange(
value = "",
ignoreDeclarationExceptions = "true",
type = ExchangeTypes.TOPIC
),
key = {"#.#"}))
public void listen(String res) {
log.info("消费者开始消费,调取微信接口向用户发送模板消息");
System.out.println(res); // 测试发送消息
...
}
}
参考文章:RabbitMQ死信队列(消费失败的消息重复发送-死循环)