• RabbitAdmin


    RabbitAdmin底层实现就是从Spring容器中获取Exchange、Binding、Routingkey以及Queue的@声明
    然后使用RabbitTemplate的execute方法执行对应的声明、修改、删除等一系列RabbitMQ基础功能操作
    例如添加一个交换机、删除一个绑定、清空一个队列里的消息等

    注意:autoStartup必须设置为true,否则Spring容器不会加载RabbitAdmin类

    需导入的依赖

    <!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

    创建RabbitAdmin,使用@Bean将其注入到spring容器中

    package com.dwz.spring;
    
    import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
    import org.springframework.amqp.rabbit.connection.ConnectionFactory;
    import org.springframework.amqp.rabbit.core.RabbitAdmin;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ComponentScan("com.dwz.spring.*")
    public class RabbitMQConfig {
        
        @Bean
        public ConnectionFactory connectionFactory() {
            CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
            connectionFactory.setAddresses("127.0.0.1:5672");
            connectionFactory.setVirtualHost("/vhost_dwz");
            connectionFactory.setUsername("root_dwz");
            connectionFactory.setPassword("123456");
            return connectionFactory;
        }
        
        @Bean
        public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
            RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
            System.err.println("RabbitAdmin启动了。。。");
            //设置启动spring容器时自动加载这个类(这个参数现在默认已经是true,可以不用设置)
            rabbitAdmin.setAutoStartup(true);
            return rabbitAdmin;
        }
    }

    在test演示其相关方法

    package com.dwz.spring;
    import java.util.HashMap;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.amqp.core.Binding;
    import org.springframework.amqp.core.BindingBuilder;
    import org.springframework.amqp.core.DirectExchange;
    import org.springframework.amqp.core.FanoutExchange;
    import org.springframework.amqp.core.Queue;
    import org.springframework.amqp.core.TopicExchange;
    import org.springframework.amqp.rabbit.core.RabbitAdmin;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class TestDwz {
        @Autowired
        private RabbitAdmin rabbitAdmin;
        
        @Test
        public void test() {
            rabbitAdmin.declareExchange(new DirectExchange("test.direct", false, false));
            rabbitAdmin.declareExchange(new TopicExchange("test.topic", false, false));
            rabbitAdmin.declareExchange(new FanoutExchange("test.fanout", false, false));
    
            rabbitAdmin.declareQueue(new Queue("test.direct.queue", false));
            rabbitAdmin.declareQueue(new Queue("test.topic.queue", false));
            rabbitAdmin.declareQueue(new Queue("test.fanout.queue", false));
            
            //先声明队列和交换机再绑定
            rabbitAdmin.declareBinding(new Binding("test.direct.queue", 
                    Binding.DestinationType.QUEUE, 
                    "test.direct", "direct", new HashMap<>()));
            
            //绑定的时候再声明队列和交换机
            rabbitAdmin.declareBinding(BindingBuilder.bind(new Queue("test.topic.queue", false))//直接创建队列
                    .to(new TopicExchange("test.topic", false, false))//直接创建交换机,建立关联关系
                    .with("user.#"));//指定路由key
            
            rabbitAdmin.declareBinding(BindingBuilder.bind(new Queue("test.fanout.queue", false))
                    .to(new FanoutExchange("test.fanout", false, false)));
            
            //清空队列数据
            rabbitAdmin.purgeQueue("test.topic.queue", false);
        }
    }

     使用SpringAMQP的@Bean方式去声明

    /**
         *     针对消费者的配置
         * 1.设置交换机的类型
         * 2.将队列绑定到交换机
         * FanoutExchange:将消息分发到所有绑定的队列,无routingkey的概念
         * TopicExchange:多关键字匹配
         * HeadersExchange:通过添加属性key-value匹配
         * DirectExchange:按照routingkey分发到指定队列
         */
        @Bean
        public TopicExchange exchange001() {
            return new TopicExchange("topic001", true, false);
        }
        
        @Bean
        public Queue queue001() {
            return new Queue("queue001", true);//队列持久化
        }
        
        @Bean
        public Binding binding001() {
            return BindingBuilder.bind(queue001()).to(exchange001()).with("spring.*");
        }
        
        @Bean
        public TopicExchange exchange002() {
            return new TopicExchange("topic002", true, false);
        }
        
        @Bean
        public Queue queue002() {
            return new Queue("queue002", true);//队列持久化
        }
        
        @Bean
        public Binding binding002() {
            return BindingBuilder.bind(queue002()).to(exchange002()).with("rabbit.*");
        }
        
        @Bean
        public TopicExchange exchange003() {
            return new TopicExchange("topic003", true, false);
        }
        
        @Bean
        public Queue queue003() {
            return new Queue("queue003", true);//队列持久化
        }
        
        @Bean
        public Binding binding003() {
            return BindingBuilder.bind(queue003()).to(exchange003()).with("mq.*");
        }
        
        @Bean
        public Queue queue_image() {
            return new Queue("image_queue", true);//队列持久化
        }
        
        @Bean
        public Queue queue_pdf() {
            return new Queue("pdf_queue", true);//队列持久化
        }
  • 相关阅读:
    最大上升子序列
    vue的keep-alive组件
    对小程序的研究3
    对getBoundingClientRect属性的研究
    消除浮动的方式
    对微信小程序的研究2
    对小程序的研究1
    对props的研究
    对provide/inject的研究
    对calc()的研究
  • 原文地址:https://www.cnblogs.com/zheaven/p/11890745.html
Copyright © 2020-2023  润新知