做软装找图片的网站网站建设公司源码

张小明 2026/3/13 9:11:42
做软装找图片的网站,网站建设公司源码,坊子营销型网站建设,建设电影会员网站Spring Boot整合RabbitMQ死信队列详解 为啥那么讲解死信队列#xff0c;因为好多人不会使用#xff0c;不知道什么场景下使用#xff0c;此案例是我在公司实现的一种方式#xff0c;让大家都可以学习到 一、死信队列的好处 1. 提高系统可靠性 避免消息丢失#xff0c;确保…Spring Boot整合RabbitMQ死信队列详解为啥那么讲解死信队列因为好多人不会使用不知道什么场景下使用此案例是我在公司实现的一种方式让大家都可以学习到一、死信队列的好处1.提高系统可靠性避免消息丢失确保处理失败的消息有备份防止因消息处理异常导致的消息无限重试2.异常消息管理将异常消息与正常消息分离便于监控和排查问题消息3.灵活的重试机制支持延迟重试可设置不同的重试策略4.系统解耦业务逻辑与异常处理逻辑分离提高代码的可维护性二、注解式配置说明1.主配置注解ConfigurationpublicclassRabbitMQConfig{// 主队列BeanpublicQueueorderQueue(){returnQueueBuilder.durable(order.queue).deadLetterExchange(dlx.exchange)// 死信交换器.deadLetterRoutingKey(dlx.routing.key)// 死信路由键.ttl(10000)// 消息10秒未消费进入死信.maxLength(1000)// 队列最大长度.build();}// 死信队列BeanpublicQueuedeadLetterQueue(){returnQueueBuilder.durable(dl.queue).build();}// 死信交换器BeanpublicDirectExchangedeadLetterExchange(){returnnewDirectExchange(dlx.exchange);}// 绑定死信交换器和队列BeanpublicBindingdeadLetterBinding(){returnBindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange()).with(dlx.routing.key);}}2.监听器注解ComponentpublicclassOrderMessageListener{// 监听正常队列RabbitListener(queuesorder.queue)publicvoidprocessOrderMessage(OrderDTOorder,Channelchannel,Header(AmqpHeaders.DELIVERY_TAG)longtag){try{// 业务处理逻辑if(processOrder(order)){// 手动确认channel.basicAck(tag,false);}else{// 拒绝消息进入死信队列channel.basicNack(tag,false,false);}}catch(Exceptione){// 异常时拒绝channel.basicNack(tag,false,false);}}// 监听死信队列RabbitListener(queuesdl.queue)publicvoidprocessDeadLetter(OrderDTOorder){log.error(收到死信消息: {},order);// 死信消息处理逻辑handleDeadLetter(order);}}三、详细整合步骤1.添加依赖dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId/dependency2.配置属性spring:rabbitmq:host:localhostport:5672username:guestpassword:guest# 开启消息返回机制publisher-returns:true# 开启确认机制publisher-confirm-type:correlatedlistener:simple:# 手动确认acknowledge-mode:manual# 重试配置retry:enabled:truemax-attempts:3initial-interval:10003.完整配置类ConfigurationSlf4jpublicclassRabbitMQFullConfig{// 正常业务队列配置 BeanpublicDirectExchangeorderExchange(){returnnewDirectExchange(order.exchange,true,false);}BeanpublicQueueorderQueue(){MapString,ObjectargsnewHashMap();// 死信交换器args.put(x-dead-letter-exchange,order.dlx.exchange);// 死信路由键args.put(x-dead-letter-routing-key,order.dlx.key);// 消息TTL毫秒args.put(x-message-ttl,30000);// 队列最大长度args.put(x-max-length,10000);returnQueueBuilder.durable(order.queue).withArguments(args).build();}BeanpublicBindingorderBinding(){returnBindingBuilder.bind(orderQueue()).to(orderExchange()).with(order.key);}// 死信队列配置 BeanpublicDirectExchangedeadLetterExchange(){returnnewDirectExchange(order.dlx.exchange,true,false);}BeanpublicQueuedeadLetterQueue(){returnQueueBuilder.durable(order.dl.queue).build();}BeanpublicBindingdeadLetterBinding(){returnBindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange()).with(order.dlx.key);}// 重试队列延时队列替代方案BeanpublicCustomExchangedelayExchange(){MapString,ObjectargsnewHashMap();args.put(x-delayed-type,direct);returnnewCustomExchange(delay.exchange,x-delayed-message,true,false,args);}BeanpublicQueuedelayQueue(){returnQueueBuilder.durable(delay.queue).build();}BeanpublicBindingdelayBinding(){returnBindingBuilder.bind(delayQueue()).to(delayExchange()).with(delay.key).noargs();}}4.消息生产者ComponentSlf4jpublicclassMessageProducer{AutowiredprivateRabbitTemplaterabbitTemplate;// 发送普通消息publicvoidsendOrderMessage(OrderDTOorder){CorrelationDatacorrelationDatanewCorrelationData(order.getId());rabbitTemplate.convertAndSend(order.exchange,order.key,order,message-{// 设置消息属性message.getMessageProperties().setExpiration(30000)// 消息TTL.setDeliveryMode(MessageDeliveryMode.PERSISTENT);returnmessage;},correlationData);// 确认回调correlationData.getFuture().addCallback(result-{if(result.isAck()){log.info(消息发送成功: {},order.getId());}},ex-log.error(消息发送失败: {},ex.getMessage()));}// 发送延迟消息publicvoidsendDelayMessage(OrderDTOorder,intdelayTime){rabbitTemplate.convertAndSend(delay.exchange,delay.key,order,message-{message.getMessageProperties().setHeader(x-delay,delayTime);returnmessage;});}}5.消息消费者完整版ComponentSlf4jpublicclassOrderMessageConsumer{privatestaticfinalintMAX_RETRY_COUNT3;AutowiredprivateMessageProducermessageProducer;/** * 监听订单队列 */RabbitListener(queuesorder.queue)publicvoidhandleOrderMessage(PayloadOrderDTOorder,HeadersMapString,Objectheaders,Channelchannel,Header(AmqpHeaders.DELIVERY_TAG)longdeliveryTag){try{log.info(收到订单消息: {},order);// 模拟业务处理booleansuccessprocessOrderBusiness(order);if(success){// 业务成功确认消息channel.basicAck(deliveryTag,false);log.info(订单处理成功: {},order.getId());}else{// 获取重试次数IntegerretryCount(Integer)headers.get(x-retry-count);retryCount(retryCountnull)?1:retryCount1;if(retryCountMAX_RETRY_COUNT){// 重试次数未超限重新入队log.warn(订单处理失败第{}次重试: {},retryCount,order.getId());// 设置重试计数headers.put(x-retry-count,retryCount);// 延迟重试messageProducer.sendDelayMessage(order,5000);// 确认消息避免重新投递channel.basicAck(deliveryTag,false);}else{// 超过重试次数进入死信队列log.error(订单处理失败次数超过上限进入死信队列: {},order.getId());channel.basicNack(deliveryTag,false,false);}}}catch(Exceptione){log.error(处理订单消息异常: {},e.getMessage());try{// 拒绝消息进入死信队列channel.basicNack(deliveryTag,false,false);}catch(IOExceptionex){log.error(拒绝消息失败: {},ex.getMessage());}}}/** * 监听死信队列 */RabbitListener(queuesorder.dl.queue)publicvoidhandleDeadLetterMessage(PayloadOrderDTOorder,HeadersMapString,Objectheaders){log.error(收到死信消息: {},order);// 记录死信消息logDeadLetter(order,headers);// 发送告警sendAlert(order);// 人工处理或其他补偿措施manualProcess(order);}/** * 监听延迟队列 */RabbitListener(queuesdelay.queue)publicvoidhandleDelayMessage(PayloadOrderDTOorder){log.info(收到延迟消息开始重试: {},order);// 重新发送到订单队列messageProducer.sendOrderMessage(order);}privatebooleanprocessOrderBusiness(OrderDTOorder){// 业务处理逻辑// 返回true表示成功false表示失败returnnewRandom().nextBoolean();}privatevoidlogDeadLetter(OrderDTOorder,MapString,Objectheaders){// 记录死信日志log.info(记录死信: {}, headers: {},order,headers);}privatevoidsendAlert(OrderDTOorder){// 发送告警通知log.warn(发送告警: 订单{}处理失败,order.getId());}privatevoidmanualProcess(OrderDTOorder){// 人工处理逻辑log.info(等待人工处理订单: {},order.getId());}}四、使用场景1.订单超时取消// 订单创建时发送延迟消息publicvoidcreateOrder(OrderDTOorder){// 保存订单orderService.save(order);// 发送30分钟过期的消息rabbitTemplate.convertAndSend(order.exchange,order.key,order,message-{message.getMessageProperties().setExpiration(1800000);// 30分钟returnmessage;});}2.支付回调重试// 支付回调失败时进入死信队列人工处理RabbitListener(queuespayment.callback.queue)publicvoidhandlePaymentCallback(PaymentDTOpayment){if(!paymentService.processCallback(payment)){thrownewRuntimeException(支付回调处理失败);}}3.库存锁定与释放// 库存锁定15分钟后自动释放publicvoidlockInventory(StringorderId){inventoryService.lock(orderId);// 发送15分钟后到期的消息rabbitTemplate.convertAndSend(inventory.exchange,inventory.lock.key,orderId,message-{message.getMessageProperties().setExpiration(900000);// 15分钟returnmessage;});}4.消息重试机制// 分级重试策略publicclassRetryStrategy{// 第一次重试5秒后// 第二次重试30秒后// 第三次重试5分钟后// 超过3次进入死信队列}五、优点总结可靠性确保消息不丢失即使处理失败也有备份灵活性支持多种死信策略超时、长度限制、拒绝等可维护性异常处理与正常业务逻辑分离监控性死信队列便于监控和统计异常消息可扩展性支持多种重试和补偿机制六、最佳实践建议合理设置TTL根据业务需求设置合适的过期时间监控死信队列设置告警及时处理死信消息限制队列大小防止消息积压记录详细日志便于问题排查死信消息分析定期分析死信原因优化系统通过Spring Boot4.0整合RabbitMQ死信队列可以构建更加健壮、可靠的消息驱动系统有效处理各种异常场景提高系统的整体稳定性。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

短链接转换网站200平方办公室装修设计

OpenAI开源GPT-OSS-120B:千亿大模型单卡部署时代来临 【免费下载链接】gpt-oss-120b gpt-oss-120b是OpenAI开源的高性能大模型,专为复杂推理任务和智能代理场景设计。这款拥有1170亿参数的混合专家模型采用原生MXFP4量化技术,可单卡部署在H10…

张小明 2026/3/5 3:14:50 网站建设

十大网页设计网站精美静态网站源码

火山引擎AI大模型训练后如何用vLLM做推理? 在大模型落地的“最后一公里”,推理性能往往成为制约业务规模化的核心瓶颈。你可能已经完成了千亿参数模型的训练,但在实际部署时却发现:GPU利用率不到40%,每秒只能处理十几个…

张小明 2026/3/5 3:14:49 网站建设

网页设计做音乐网站用eclipse做jsp网站

在当今数据隐私日益重要的时代,PrivateGPT作为一款完全离线的AI文档处理工具,让您能够在本地环境中安全地处理各类文档并获得智能回答。这款工具的核心优势在于其强大的上下文窗口优化能力,能够轻松应对超长文档的处理需求。🚀 【…

张小明 2026/3/5 3:14:49 网站建设

英文网站seo晋江论坛兔区

你是不是也曾想过,为什么花大价钱买的Nintendo Switch Joy-Con手柄只能在Switch上使用?现在有了JoyCon-Driver这款PC手柄驱动,你的Joy-Con手柄终于可以摆脱平台束缚,在PC上大显身手了! 【免费下载链接】JoyCon-Driver …

张小明 2026/3/5 3:14:53 网站建设

广东网站建设哪里有网站开发服务费会计处理

保障 Windows 8 安全与稳定的实用指南 在数字化时代,计算机安全至关重要。对于 Windows 8 用户而言,了解并掌握系统自带的安全工具和策略,是保障系统安全稳定运行的关键。下面将为大家详细介绍 Windows 8 中一些重要的安全功能及使用方法。 1. Windows 防火墙的操作 Wind…

张小明 2026/3/5 3:14:52 网站建设

有广告的网站网站建设陆金手指谷哥9

基于博途1200plc堆垛立体车库设计 IO分配表,电气接线图,plc程序,组态界面程序,动画仿真立体车库的PLC控制核心在于逻辑处理和设备联动。先说说IO分配这事儿,新手最容易犯的毛病就是变量命名混乱。比如把升降电机的正转…

张小明 2026/3/5 3:14:52 网站建设