赞
踩
目录
业务代码自己重试或者组件重试
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;
-
- /**
- * 异常交换机
- * @return
- */
- @Bean
- public TopicExchange errorTopicExchange(){
- return new TopicExchange(shortLinkErrorExchange,true,false);
- }
-
- /**
- * 异常队列
- * @return
- */
- @Bean
- public Queue errorQueue(){
- return new Queue(shortLinkErrorQueue,true);
- }
-
- /**
- * 队列与交换机进行绑定
- * @return
- */
- @Bean
- public Binding BindingErrorQueueAndExchange(Queue errorQueue,TopicExchange errorTopicExchange){
- return BindingBuilder.bind(errorQueue).to(errorTopicExchange).with(shortLinkErrorRoutingKey);
- }
-
-
- /**
- * 配置 RepublishMessageRecoverer
- * 用途:消息重试一定次数后,用特定的routingKey转发到指定的交换机中,方便后续排查和告警
- *
- * 顶层是 MessageRecoverer接口,多个实现类
- *
- * @return
- */
- @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("告警成功,发送通知短信");
-
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。