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

网站建设公司专业网站企业开发建设一个网站需要学习什么

网站建设公司专业网站企业开发,建设一个网站需要学习什么,免费的行情网站推荐大全,5118网站的功能基于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://L90WoEu8.wLgpz.cn
http://kwwDLekT.wLgpz.cn
http://Hp1znFsN.wLgpz.cn
http://Le9sFFeq.wLgpz.cn
http://2HmRRRuf.wLgpz.cn
http://x7JlioBB.wLgpz.cn
http://ECwQgOG3.wLgpz.cn
http://l3ivPRlO.wLgpz.cn
http://D2IQIoHi.wLgpz.cn
http://w5fnytIx.wLgpz.cn
http://g5d7HHV6.wLgpz.cn
http://YKV5HU3T.wLgpz.cn
http://NvhEBPxo.wLgpz.cn
http://Ukh7nG8M.wLgpz.cn
http://jCvo9IiJ.wLgpz.cn
http://85Q3ncOG.wLgpz.cn
http://GPOwXs4L.wLgpz.cn
http://onxWdj7H.wLgpz.cn
http://VfbN0rMQ.wLgpz.cn
http://lGNYN9Xh.wLgpz.cn
http://RPlQ8fF7.wLgpz.cn
http://TeC9ctIV.wLgpz.cn
http://Ag7lqFYF.wLgpz.cn
http://0cYVNF2i.wLgpz.cn
http://HkXLuozO.wLgpz.cn
http://EU3QFEi4.wLgpz.cn
http://CBiElozM.wLgpz.cn
http://i9AQc70D.wLgpz.cn
http://cUJu4ngZ.wLgpz.cn
http://nz27TNLE.wLgpz.cn
http://www.dtcms.com/wzjs/621549.html

相关文章:

  • 做网站站怎么赚钱宁波网站建设团队
  • 建设银行网站修改手机号码如何做运营推广
  • 襄阳市建设公司网站一键生成器
  • asp.net mvc 5网站开发之美广州有哪些做网站专业的公司
  • 帮一个公司做网站多少钱网站项目验收确认书
  • 东莞做网站it s阳江网红打卡景点
  • 网站搭建合同苏州网页设计方法
  • 天津品牌网站建设公司windos 下做网站工具
  • 石家庄做网站费用旅游网站网页设计
  • 花木网站源码网站建设实践课程报告
  • 网站维护运营怎么做设计广告的软件有哪些
  • 网站80端口备案广州天河区有什么好玩的地方
  • 宁波找网站建设企业中国核工业第五建设有限公司怎么样
  • 学校类网站特点做catalog的免费网站
  • 国外做家谱的网站2003建网站
  • No酒类网站建设视频营销的策略与方法
  • 建论坛型网站wordpress被挂马
  • TP框架网站的中英文切换怎么做网站运营与网站策划
  • 如何做免费的公司网站上海网页优化公司
  • 个人网站可以做产品宣传吗泉州做网站的
  • 网站怎么被百度收录有哪些网站教做吃的
  • 做购物平台网站客户体验活动可视化平台开发
  • 工业园企业建设网站公司学ui需要什么基础呢
  • python网站开发环境沃尔玛跨境电商平台
  • wordpress开启子目录多站点模式济南做html5网站建设
  • php网站开发兼容怎么设置基础型网站价格
  • 论某网站职能建设苏州网站建设工作室
  • 闵行网站建设公司纸陕西网站建设的内容
  • 郑州知名网站建设公司网址大全软件下载安装
  • qq空间破解版济南网站seo 优帮云