首页 > 其他分享 >一对一视频app开发,RabbitMQ数据隔离步骤详解

一对一视频app开发,RabbitMQ数据隔离步骤详解

时间:2024-05-18 09:18:42浏览次数:26  
标签:return routingKey 队列 app RabbitMQ public 详解 queues String

一对一视频app开发,RabbitMQ数据隔离详解
在这里插入图片描述

一、自动创建影子队列

因为SpringAMQP中的
中的关键方法是私有的,无法通过继承的方式进行实现对以配置好的队列进行扩展,所以需要自定义该类,来实现对自动创建影子队列,并和交换器进行绑定
在这里插入图片描述

代码实现

改造RabbitListenerAnnotationBeanPostProcessor类来实现创建MQ影子队列以及将影子Key绑定到影子队列。

public class WormholeRabbitListenerAnnotationBeanPostProcessor extends RabbitListenerAnnotationBeanPostProcessor {

    @Resource
    private WormholeIsolationConfiguration wormholeIsolationConfiguration;

    /**
     * routingKey 前置处理器
     *
     * @param queueName
     * @param routingKey
     * @return
     */
    @Override
    public String preProcessingRoutingKey(String queueName, String routingKey) {
        //如果是影子队列就将routingKey转换为 影子routingKey
        if (wormholeIsolationConfiguration.checkIsolation(queueName) && !wormholeIsolationConfiguration.checkIsolation(routingKey)) {
            return wormholeIsolationConfiguration.generateIsolationKey(routingKey);
        }
        return routingKey;
    }

    /**
     * 处理队列问题,如果来了一个队列就生成一个shadow的队列
     *
     * @param queues
     * @return
     */
    @Override
    public List<String> handelQueues(List<String> queues) {
        List<String> isolationQueues = new ArrayList<>();
        if (null != queues && !queues.isEmpty()) {
            for (String queue : queues) {
                //添加shadow队列
                isolationQueues.add(wormholeIsolationConfiguration.generateIsolationKey(queue));
            }
            queues.addAll(isolationQueues);
        }
        return queues;
    }
}

 

二、传递染色标识

因为MQ是异步通讯,为了传递染色标识,会在发送MQ的时候将染色标识传递过来,MQ接收到之后放进一对一视频app开发的当前线程的ThreadLocal里面,这个需要扩展Spring的SimpleRabbitListenerContainerFactory来实现
在这里插入图片描述

代码实现

public class WormholeSimpleRabbitListenerContainerFactory extends SimpleRabbitListenerContainerFactory {

    @Override
    protected SimpleMessageListenerContainer createContainerInstance() {
        SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer();
        simpleMessageListenerContainer.setAfterReceivePostProcessors(message -> {
            //防止线程复用 销毁ThreadLocal
            WormholeContextHolder.invalidContext();
            //获取消息属性标识
            String wormholeRequestContext = message.getMessageProperties().getHeader(WormholeContextHolder.WORMHOLE_REQUEST_MARK);
            if (StringUtils.isNotEmpty(wormholeRequestContext)) {
                WormholeContextHolder.setContext(wormholeRequestContext);
            }
            return message;
        });
        return simpleMessageListenerContainer;
    }
}

 

三、发送MQ消息处理

同上,需要传递染色标识,就通过继承RabbitTemplate重写convertAndSend方法来实现传递染色标识。

public class ShadowRabbitTemplate extends RabbitTemplate {
    public ShadowRabbitTemplate(ConnectionFactory connectionFactory) {
        super(connectionFactory);
    }

    @Autowired
    private WormholeIsolationConfiguration isolationConfiguration;

    @Override
    public void send(final String exchange, final String routingKey,
                     final Message message, @Nullable final CorrelationData correlationData)
            throws AmqpException {
        WormholeContext wormholeContext = WormholeContextHolder.getContext();
        if (null == wormholeContext) {
            super.send(exchange, routingKey, message, correlationData);
        } else {
            message.getMessageProperties().setHeader(WormholeContextHolder.WORMHOLE_REQUEST_MARK, wormholeContext.toString());
            //生成Rabbit 隔离Key
            String wormholeRoutingKey = isolationConfiguration.generateIsolationKey(routingKey);
            //调用父类进行发送
            super.send(exchange, wormholeRoutingKey, message, correlationData);
        }
    }
}

 

以上就是一对一视频app开发,RabbitMQ数据隔离步骤详解, 更多内容欢迎关注之后的文章

 

标签:return,routingKey,队列,app,RabbitMQ,public,详解,queues,String
From: https://www.cnblogs.com/yunbaomengnan/p/18199025

相关文章

  • CSAPP第二章
    gcc指定不同的C语言版本 注意寻址和字节顺序讲的, 对象的地址都是从小地址开始算起, 而所谓大端法就是高位字节在前; 小端法则是低位字节在前注意: 等号上的小圆点的组合表示"被定义为"的意思 反码有+0和-0,-0就是全为1的位模式,负数的反码就是对应正数所有位取反......
  • IKNP协议详解
    一起学习OTextension的重要文章:ExtendingObliviousTransfersEfficiently.作者是YuvalIshai,JoeKilian,KobbiNissim,andErezPetrank,发表在2003的Crypto上.目录1.简介2.具体协议2.1协议流程2.2协议设计原理COT和ROT2.2.1第一步:\(OT^k_m\impliesCOT^m_k\)......
  • Games101-8 material and appearance
    漫反射的prdfglossymaterial折射BTDF全反射的情况:$n_i$远大于$n_{t}$也就是说入射密度大。因此水底看空气---会发生全反射情况。fresnelreflectionterm菲涅尔项绝缘体见到那说就是如果如何入射光和法线几乎平行---则大量会被反射。导体......
  • Redis 的安装与配置详解【Redis系列一】
    〇、前言关于Redis在日常开发中还是用的比较多的,特别是在秒杀、消息队列、排行榜等数据交互时效要求较高的场景,Redis都可以轻松应对。本文将针对Redis进行简单介绍,以及如何安装,并罗列下全部配置项。后续还将另行发文汇总Redis的常用数据结构和常见问题等。一、什么是Re......
  • RabbitMQ的基本用法
    RabbitMQ是一个实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。它使用Erlang语言编写,并广泛用于分布式系统、微服务架构、大数据处理等领域。RabbitMQ的基本用法涉及几个核心概念,包括消息(Message)、消息队列(Queue)、交换器(Exchange)、绑定(Binding)和网络连接(C......
  • 打开、关闭、切换App以及清除App进程,操作so easy!
    此文章来源于项目官方公众号:“AirtestProject”版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途#一、前言很多新手同学在写自动化测试脚本的时候,打开、关闭、切换App的方式还是使用最基础的方式,也有同学在交流群内多次询问是否有打开、关闭、切换App以及清除A......
  • ABP 框架 AutoMapper 映射实体时提示 Unmapped members were found 缺少 FullAuditedE
    在配置MapperProfile的时候, 运行提示映射出错:对于Workflow->WorkflowDto和CreateUpdateWorkflowDto->Workflow的映射,存在没有映射的属性 IsDeleted,DeleterId,DeletionTime,LastModificationTime,LastModifierId,CreationTime和CreatorId。我之前写代码都没有映射这......
  • 第四节:MySQL主从集群搭建、扩容与数据迁移、半同步复制详解
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • ASP.NET Core Web中使用AutoMapper进行对象映射
    前言在日常开发中,我们常常需要将一个对象映射到另一个对象,这个过程中可能需要编写大量的重复性代码,如果每次都手动编写,不仅会影响开发效率,而且当项目越来越复杂、庞大的时候还容易出现错误。为了解决这个问题,对象映射库就随之而出了,这些库可以自动完成对象之间的映射,从而减少大量......
  • 通过mybatisflex获取多数据源mapper
    基于mybatisflex1.8.4:@NoArgsConstructor(access=AccessLevel.PRIVATE)@Slf4jpublicclassDataSource{publicstaticfinalStringA="a";publicstaticfinalStringB="b";publicstaticfinalStringC="c";pub......