网站建设找哪家公司广州教育平台登录入口

张小明 2026/1/19 17:37:59
网站建设找哪家公司,广州教育平台登录入口,找外包公司做个网站多少钱,三门峡集团网站建设在 RabbitMQ 中#xff0c;生产者发送消息后#xff0c;有可能遇到以下几种情况#xff1a;消息成功投递到交换机#xff08;Exchange#xff09;消息未能成功投递到交换机#xff08;Exchange#xff09;消息成功进入交换机但无法路由到队列#xff08;Queue#xff…在 RabbitMQ 中生产者发送消息后有可能遇到以下几种情况消息成功投递到交换机Exchange消息未能成功投递到交换机Exchange消息成功进入交换机但无法路由到队列Queue如果生产者端没有回调确认机制就可能出现严重的数据不一致举例 Redis 已经增加点赞数但消息并未真正进入 MQ数据库后续也无法更新就出现了 “缓存超前、数据库缺失” 的问题。为了解决这种问题Spring AMQP 提供了RabbitTemplate.setConfirmCallback()RabbitTemplate.setReturnsCallback()来捕获和处理消息投递的成功与失败。但是在复杂系统中不同的业务消息例如“下单”、“扣库存”、“发积分”在投递失败时需要采取不同的补偿逻辑。弊端如果你只写一份大而全的回调逻辑代码就会充满大量的 if else 判断非常难维护。二、策略模式思想引入策略模式的核心思想是定义一系列算法或行为让它们可以相互替换且算法的变化不会影响使用算法的客户。“算法” ≈ “不同的消息回调处理逻辑”“客户” ≈ “RabbitTemplate 的 ConfirmCallback 回调”操作通过根据业务抽象接口 Map 注入在运行时动态选择。代码实现1、定义统一的回调处理接口public interface ConfirmCallbackService {/*** 投递失败后的回调处理* param message 投递的消息对象*/void confirmCallback(Message message);}例定义点赞案例的实现类可选public class LikeConfirmCallback implements ConfirmCallbackService{/*** 注入RedisTemplate*/private final RedisTemplateString,Integer redisTemplate;/*** 执行失败后的反向操作* param message 投递的消息对象*/Overridepublic void confirmCallback(Message message) {byte[] bytes message.getBody();//反向序列化为LikeDTO对象try {LikeDTO dto new ObjectMapper().readValue(bytes, LikeDTO.class);if(dto.getLikeStatus()){redisTemplate.opsForSet().add(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue()dto.getEid(), dto.getUid());}else{redisTemplate.opsForSet().remove(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue()dto.getEid(),dto.getUid());}} catch (IOException e) {throw new RuntimeException(e);}}}小技巧可选不单独定义类而是让业务层本身实现ConfirmCallbackService接口,简化书写操作分离成策略类则更利于模块化、解耦和扩展。2、回调上下文: 策略分发器ComponentRequiredArgsConstructorSlf4jpublic class ConfirmCallbackContext {/*** 注入RabbitTemplate*/private final RabbitTemplate rabbitTemplate;/*** 注入所有ConfirmCallbackService的实现类* 在不同的业务场景调用不同的实现来处理投递失败的业务逻辑*/private final MapString,ConfirmCallbackService confirmCallbackServiceMap;/*** 统一调用回调处理* 在容器初始化就执行这个方法*/PostConstructpublic void confirmCallback(){rabbitTemplate.setConfirmCallback((cdata,ack,cause)-{ReturnedMessage returnedMessage cdata.getReturned();if(ack){log.info(The message was delivered to the{},returnedMessage);}else{//获取业务实现的bean的idString beanName returnedMessage.getReplyText();//根据bean的名称从map中获取相应的实现类ConfirmCallbackService callbackService confirmCallbackServiceMap.get(beanName);callbackService.confirmCallback(returnedMessage.getMessage());}});}}核心原理Spring Boot 会自动扫描所有实现 ConfirmCallbackService 的 BeanBean 名称作为 keyBean 实例作为 value 注入到 MapString, ConfirmCallbackServiceConfirmCallbackContext 根据 replyText 动态找到对应的策略实现类3.消息发送端封装ComponentRequiredArgsConstructorpublic class RabbitManagerT {private final RabbitTemplate rabbitTemplate;public void send(String exchange,String routingKey,String callbackBeanName,T data){try {//创建cdata对象并设置一个idCorrelationData correlationData new CorrelationData(UUID.randomUUID().toString());//将投递的数据转换为byte[]byte[] bytes new ObjectMapper().writeValueAsBytes(data);//将bytes封装为Message对象Message message new Message(bytes);//创建一个投递失败时返回的消息对象ReturnedMessage returnedMessage new ReturnedMessage(message, 0,callbackBeanName, exchange,routingKey);//将ReturnedMesssage保存到cdata中correlationData.setReturned(returnedMessage);//发送rabbitTemplate.convertAndSend(exchange,routingKey,data,correlationData);} catch (Exception e) {throw new RuntimeException(e);}}}** 关键点**callbackBeanName 会被放进 replyText 中作为“回调策略的指针”。4.点赞业务逻辑方法4.1简化写法Overridepublic LikeDTO likeEssay(Integer uid, Integer eid) {boolean likeStatus false;//如果缓存中存在用户id则取消点赞不存在则添加用户id记录点赞if(isLike(eid, uid)) {//将用户ID从set集合中移除redisTemplate.opsForSet().remove(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue() eid, uid);} else {likeStatus true;//将用户ID添加到set集合中redisTemplate.opsForSet().add(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue() eid, uid);}//获取当前帖子在redis中的点赞总数Long likeCount redisTemplate.opsForSet().size(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue() eid);//创建LikeDTO封装修改的数据并发布到消息队列LikeDTO likeDTO new LikeDTO(eid, uid, likeCount,likeStatus);//发送到mq异步更新到数据库rabbitManager.send(RabbitmqConfig.EXCHANGE_NAME, RabbitmqConfig.ROUTING_KEY,likeServiceImpl, likeDTO);return likeDTO;}/*** 消息投递失败后的处理* param message 失败后返回的消息*/Overridepublic void confirmCallback(Message message) {byte[] bytes message.getBody();try {//反序列化为LikeDTO对象LikeDTO dto new ObjectMapper().readValue(bytes, LikeDTO.class);//执行反向操作if(dto.getLikeStatus()) {redisTemplate.opsForSet().remove(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue() dto.getEid(), dto.getUid());} else {redisTemplate.opsForSet().add(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue() dto.getEid(), dto.getUid());}} catch (IOException e) {throw new RuntimeException(e);}}4.2 有业务实现类时public LikeDTO likeEssay(Integer uid, Integer eid) {boolean likeStatus false;//如果缓存中存在用户id则取消点赞不存在则添加用户id记录点赞if(isLike(uid,eid)){//取消点赞redisTemplate.opsForSet().remove(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue()eid,uid.toString());likeMapper.deleteLike(eid,uid);}else{likeStatus true;//将用户ID添加到set集合中redisTemplate.opsForSet().add(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue()eid,uid.toString());}//获取当前帖子在redis中的点赞总数Long likeCount redisTemplate.opsForSet().size(LikeEssayEnum.LIKE_ESSAY_PREFIX.getValue() eid);//创建LikeDTO封装修改的数据并发布到消息队列LikeDTO likeDTO new LikeDTO(eid, uid, likeCount,likeStatus);//发送到mq异步更新到数据库rabbitManager.send(RabbitmqConfig.EXCHANGE_NAME,RabbitmqConfig.ROUTING_KEY,likeConfirmCallbackService,likeDTO);return likeDTO;}最终目标当点赞消息从生产者发送到 RabbitMQ 时一旦投递失败系统能自动执行反向补偿逻辑确保 Redis 与数据库的一致性。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站基础建设和管理暂行办法页面设计及逻辑方案

第一章:Open-AutoGLM地址总是失效?,一文搞定稳定访问的8种方法在使用 Open-AutoGLM 时,用户常遇到官方地址无法访问或频繁跳转失效的问题。这通常由网络策略、DNS 污染或服务端负载均衡机制导致。为确保持续稳定的访问体验&#x…

张小明 2026/1/17 22:12:32 网站建设

网站开发简称铜陵市建设局网站

状态反馈控制与动态反馈控制器详解 1. 状态反馈控制问题 1.1 问题概述 状态反馈控制中,通常假定所有状态变量都可获取。若无法获取全部状态变量,则需构建状态估计器。以下是一系列相关问题及分析。 1.2 具体问题 1.2.1 离散 - 连续时间模型可控性与可观性证明 假设一个…

张小明 2026/1/17 22:12:33 网站建设

学校网站建设费计入什么科目长沙企业名录大全 湖南

Memobase项目安装与配置指南:构建AI长期记忆系统 【免费下载链接】memobase Profile-Based Long-Term Memory for AI Applications 项目地址: https://gitcode.com/gh_mirrors/me/memobase 项目概述 Memobase是一个创新的基于用户资料的长期记忆系统&#x…

张小明 2026/1/17 22:12:33 网站建设

网站推广营销服务中国上海门户网

第一章:检索重排序的 Dify 参数调优在构建基于大语言模型的应用时,Dify 作为低代码平台提供了强大的检索增强生成(RAG)能力。其中,检索结果的重排序(Re-ranking)环节对最终输出质量具有决定性影…

张小明 2026/1/17 22:12:37 网站建设

找熟人做网站的弊端盱眙有做网站开发的吗

Windows Azure BizTalk Services使用指南 1. 创建BizTalk服务 首先,你需要选择一个现有的存储账户或者创建一个新的存储账户,然后点击“完成”。完成设置向导后,BizTalk服务将会被创建,这个过程可能需要几分钟时间。 2. 导出WABS根证书 创建向导会自动生成一个自签名证…

张小明 2026/1/17 22:12:37 网站建设

有什么教做甜品的网站郑州建设网站

Bash 脚本高级技巧:代码复用、函数定义与信号处理 在编写 Bash 脚本时,为了提高代码的复用性和可维护性,我们可以采用多种技巧。下面将为大家详细介绍代码复用、函数定义、参数传递与返回值、信号捕获以及命令重定义等方面的内容。 代码复用:包含与源文件 在编写脚本时,…

张小明 2026/1/17 22:12:38 网站建设