当前位置: 首页 > wzjs >正文

淘客网站建设视频怎样更新网站

淘客网站建设视频,怎样更新网站,购物网站开发需求分析,旅游网站代码html基于SpringBoot利用死信队列解决RabbitMQ业务队列故障重试无效场景问题 解决方案项目实战1、生产者服务1.1、RabbitConfig定义相关交换机及死信队列等配置数据1.2、TestController测试接口Controller 2、消费者服务2.1 BusinessQueueConsumer业务队列监听器2.2 DeadLetterConsu…

基于SpringBoot利用死信队列解决RabbitMQ业务队列故障重试无效场景问题

  • 解决方案
  • 项目实战
    • 1、生产者服务
      • 1.1、RabbitConfig定义相关交换机及死信队列等配置数据
      • 1.2、TestController测试接口Controller
    • 2、消费者服务
      • 2.1 BusinessQueueConsumer业务队列监听器
      • 2.2 DeadLetterConsumer死信队列监听器
  • 项目测试
    • 1、启动RabbitMQ、Producer、调用send接口生成业务交换机及队列
    • 2、发送netowrk-error消息,模拟网络故障
  • 项目架构及源码

解决方案

1、场景说明
在这里插入图片描述
利用RabbitMQ的死信队列,解决RabbitMQ业务队列故障重试无效场景问题,在MQ业务队列消费失败时,将消息进行重试,重试若干次数(可自定义),如果还是失败则发送到死信队列,消费者监听死信队列,然后对死信队列的消息再进行相关处理。

项目实战

1、生产者服务

1.1、RabbitConfig定义相关交换机及死信队列等配置数据

@Slf4j
@Configuration
public class RabbitConfig {public static final String BUSINESS_EXCHANGE_NAME = "business-exchange";public static final String DEAD_LETTER_EXCHANGE_NAME = "dead-letter-exchange";public static final String BUSINESS_QUEUE_NAME = "business-queue";public static final String DEAD_LETTER_QUEUE_NAME = "dead-letter-queue";public static final String ROUTING_KEY = "routing-key";// 声明业务交换机@Beanpublic DirectExchange businessExchange(){return new DirectExchange(BUSINESS_EXCHANGE_NAME);}// 声明死信交换机@Beanpublic DirectExchange deadLetterExchange(){return new DirectExchange(DEAD_LETTER_EXCHANGE_NAME);}// 声明业务队列@Beanpublic Queue businessQueue(){Map<String, Object> args = new HashMap<>(2);// 设置业务队列的死信交换机args.put("x-dead-letter-exchange", DEAD_LETTER_EXCHANGE_NAME);return QueueBuilder.durable(BUSINESS_QUEUE_NAME).withArguments(args).build();}// 声明死信队列@Beanpublic Queue deadLetterQueue(){return new Queue(DEAD_LETTER_QUEUE_NAME);}// 将业务队列绑定到业务交换机@Beanpublic Binding bindBusinessQueue(){return BindingBuilder.bind(businessQueue()).to(businessExchange()).with(ROUTING_KEY);}// 将死信队列绑定到死信交换机@Beanpublic Binding bindDeadLetterQueue(){return BindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange()).with(ROUTING_KEY);}
}

1.2、TestController测试接口Controller

@RestController
public class TestController {@AutowiredRabbitTemplate rabbitTemplate;@GetMapping("/send")public void send(@RequestParam String msg){// 发送消息,模拟失败到死信队列rabbitTemplate.convertAndSend(RabbitConfig.BUSINESS_EXCHANGE_NAME, RabbitConfig.ROUTING_KEY, msg);}
}

2、消费者服务

2.1 BusinessQueueConsumer业务队列监听器

@Service
@Slf4j
@RabbitListener(queues = "business-queue")
public class BusinessQueueConsumer {/*** 指定消费的队列*/@RabbitHandlerpublic void consume(String msg, Message message, Channel channel) {boolean success = false;int retryCount = 3;while (!success && retryCount-- > 0) {try {// 处理消息log.info("收到消息: {}, deliveryTag = {}", msg, message.getMessageProperties().getDeliveryTag());if (msg.equals("netowrk-error")) {throw new RuntimeException("模拟调用接口网络故障!");}// 正常处理完毕,手动确认success = true;channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);} catch (Exception e) {log.error("程序异常:{}", e.getMessage());}}// 达到最大重试次数后仍然消费失败if (!success) {// 手动删除,移至死信队列try {channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);} catch (IOException e) {log.error("IO异常:移至死信队列失败", e);}}}
}

2.2 DeadLetterConsumer死信队列监听器

@Service
@Slf4j
@RabbitListener(queues = "dead-letter-queue")
public class DeadLetterConsumer {/*** 指定消费的队列*/@RabbitHandlerpublic void consume(String msg, Message message, Channel channel) throws IOException {log.info("死信队列收到消息: {}, deliveryTag = {}", msg, message.getMessageProperties().getDeliveryTag());log.info("死信队列收到了消息: {}" , msg);log.info("这里模拟向手动处理数据表添加数据完成!");channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);}
}

项目测试

1、启动RabbitMQ、Producer、调用send接口生成业务交换机及队列

在这里插入图片描述
在这里插入图片描述

2、发送netowrk-error消息,模拟网络故障

在这里插入图片描述
在这里插入图片描述
可以看到,消息已经正确被消费失败,自动重试了3次后被发送到了死信队列,另外在死信队列里面进行了消息处理。

项目架构及源码

在这里插入图片描述
源码下载,欢迎Star!

http://www.dtcms.com/wzjs/823824.html

相关文章:

  • 南京网站制作希丁哥潍坊网站建设教程
  • 陕西有没有做网站普查公司wordpress如何添加前台登录
  • 网站建设 方案 评价表学校网站建设申请
  • 怎么注册网站名称国际知名设计公司名称
  • 免费做店招哪个网站好app软件平台
  • 网站建设与实践长春建站网站建设
  • 网站建设案例 算命网站宁波设计网站公司
  • 一站式做网站公司led高端网站建设
  • 网站开发学习网站前端工资
  • 北京网站制作闪快佛山网站开发公司有哪些
  • 让你的静态网站 做后台做平面设计兼职的网站
  • 上海远东建筑设计院成都自然排名优化
  • 家纺营销型网站百胜招聘 网站开发
  • 做机器人的网站wordpress 显示全部文章
  • 网站建设中应该注意什么自建论坛
  • wordpress怎样连接数据库连接网站优化吧
  • 网站开发合同模板企业搭建什么样的平台
  • 网站制作怎么报价单普通人学python有意义吗
  • 公司网站建设维护的岗位wordpress 本地建站教程
  • 我要自学网官方网站杭州市建设住房保障局网站
  • 做个商城网站多少钱宁波做网站的大公司有哪些
  • 安阳网站建设_wordpress上传中文图片
  • 免费html模板素材网站青浦做网站的公司
  • 惠州网站建设找哪个公司笑话网站html模板
  • 淘宝网站建设不允许wordpress 浏览次数
  • 做系统前的浏览网站能找回吗网站标题关键词怎么做
  • 北京建设银行网站田村lnmp wordpress 502
  • 浙江建设局图审网站高端网站建设费用
  • 如何查询注册过的网站网站建设代理商
  • 吉林电商网站建设公司电话上海牛巨仁seo