• 023 RabbitAdmin组件


    一 .概述

      在上一次我们整合成功了ConnectionFactory,本次我们需要整合RabbitAdmin组件,该组件可以帮助我们声明交换机,队列,绑定,并可以完成一般性的工作.


     二 .添加RabbitAdmin组件

    向容器之中添加一个下面的bean,这个bean就是我们希望添加的一个RabbitAdmin.  

    @Bean
        public RabbitAdmin amqpAdmin(ConnectionFactory connectionFactory) {
            RabbitAdmin admin =  new RabbitAdmin(connectionFactory);
            admin.setAutoStartup(true);
            return admin;
        }

    下面我们演示声明一个交换机,声明一个队列,声明一个绑定,这是我们使用RabbitAdmin最常用的使用方式.  

        @Resource
        private RabbitAdmin admin;
        
        @Test
        public void rabbitmqAdmin() {
            // 声明一个交换机
            admin.declareExchange(new DirectExchange("admin_exchange", false, false));
            
            // 声明一个队列
            admin.declareQueue(new Queue("admin_queue", false, false, false));
            
            // 声明一个绑定
            admin.declareBinding( new Binding("admin_queue", DestinationType.QUEUE, "admin_exchange", "admin", null));
            
        }

    我们在上面声明了我们了一个交换机,一个队列和一个绑定,我们发现使用这种方式比我们使用客户端进行组件的声明要简单的多.


     三 .源码分析 

    public class RabbitAdmin implements AmqpAdmin, ApplicationContextAware, ApplicationEventPublisherAware,
            InitializingBean {

    我们首先看一下我们的RabbitAdmin组件,我们发现它实现了一个InitializingBean接口,那么我们需要关心的就是实现的方法了.

    @Override
        public void afterPropertiesSet() {

    在上面的这个实现的方法之中,我们找到最关键的方法initialize();

    我们进去看看是怎么实现的

    Collection<Exchange> contextExchanges = new LinkedList<Exchange>(
                    this.applicationContext.getBeansOfType(Exchange.class).values());
            Collection<Queue> contextQueues = new LinkedList<Queue>(
                    this.applicationContext.getBeansOfType(Queue.class).values());
            Collection<Binding> contextBindings = new LinkedList<Binding>(
                    this.applicationContext.getBeansOfType(Binding.class).values());

    我们发现,首先就是从IOC容器之中获取到所有的交换机和队列和绑定.

    this.rabbitTemplate.execute(new ChannelCallback<Object>() {
                @Override
                public Object doInRabbit(Channel channel) throws Exception {
                    declareExchanges(channel, exchanges.toArray(new Exchange[exchanges.size()]));
                    declareQueues(channel, queues.toArray(new Queue[queues.size()]));
                    declareBindings(channel, bindings.toArray(new Binding[bindings.size()]));
                    return null;
                }
            });

    然后我们就发现使用了rabbitTemplate对象进行声明了.

      从上面的代码之中,我们能够得到一个快速创建交换机,队列,绑定的的方法,那就是我们直接将这些对象注入到IOC容器之中,那么spring就会帮助我们进行声明.

    下面我们就做一个测试: 

    @Bean
        public Exchange exchange() {
            return new TopicExchange("bean_exchange", true, false);
        }

    我们启动容器,看看是否能帮助我们声明一个交换机呢?

    我们发现我们成功的创建了一个bean_exchange,通过这种方式,我们可以更简单的声明一个队列,交换机等基本的操作.

  • 相关阅读:
    使用pickle进行存储变量
    tensorflow的save和restore
    使用tf.print()打印tensor内容
    用python对txt中文件读取,然后按顺序标号存入excel中
    cv2对图像进行旋转和放缩变换
    spring security 允许 iframe 嵌套
    Java+protobuf 实例
    Java处理文件小例子--获取全国所有城市的坐标
    Java 多线程并发 Future+callable 实例
    Java 执行jar linux 实例
  • 原文地址:https://www.cnblogs.com/trekxu/p/9784166.html
Copyright © 2020-2023  润新知