目录
一、消费者异常情况处理
二、多次重试依然失败怎么处理
一、消费者异常情况处理
业务代码自己重试或者组件重试
RabbitMQ配置重试:
#开启重试,消费者代码不能添加try catch捕获不往外抛异常 spring.rabbitmq.listener.simple.retry.enabled=true #最大重试次数 spring.rabbitmq.listener.simple.retry.max-attempts=4 # 重试消息的时间间隔,5秒 spring.rabbitmq.listener.simple.retry.initial-interval=5000
二、多次重试依然失败怎么处理
解决方式:RepublishMessageRecoverer
消息重试一定次数后,用特定的routingKey转发到指定的交换机中,方便后续排查和告警
注意: 消息消费确认使用自动确认方式
#消息确认方式,manual(手动ack) 和auto(自动ack); 消息消费重试到达指定次数进到异常交换机和异常队列,需要改为自动ack确认消息
@Configuration
@Data
public class RabbitMQErrorConfig {
private String shortlinkErrorExchange = "short_link.error.exchange";
private String shortlinkErrorQueue = "short_link.error.queue";
private String shortlinkErrorRoutingKey = "short_link.error.routing.key";
@Autowired
private RabbitTemplate rabbitTemplate;
@Bean
public TopicExchange errorTopicExchange(){
return new TopicExchange(shortlinkErrorExchange,true,false);
}
@Bean
public Queue errorQueue(){
return new Queue(shortlinkErrorQueue,true);
}
@Bean
public Binding BindingErrorQueueAndExchange(Queue errorQueue,TopicExchange errorTopicExchange){
return BindingBuilder.bind(errorQueue).to(errorTopicExchange).with(shortlinkErrorRoutingKey);
}
@Bean
public MessageRecoverer messageRecoverer(){
return new RepublishMessageRecoverer(rabbitTemplate,shortlinkErrorExchange,shortlinkErrorRoutingKey);
}
}
消息重试4次后,被发送到了short_link.error.routing.key
剩下的就是业务监听这个 short_link.error.routing.key队列,处理发送邮件等信息告警了
@Component
@Slf4j
@RabbitListener(queuesToDeclare = { @Queue("short_link.error.queue") })
public class ShortlinkErrorMQListener {
@RabbitHandler
public void shortlinkHandler(EventMessage eventMessage, Message message, Channel channel) throws IOException {
log.error("告警:监听到消息ShortlinkErrorMQListener eventMessage消息内容:{}",eventMessage);
log.error("告警:Message:{}",message);
log.error("告警成功,发送通知短信");
}
}



