RabbitAdmin

RabbitAdmin底層實現就是從Spring容器中獲取Exchange、Binding、Routingkey以及Queue的@聲明
然後使用RabbitTemplate的execute方法執行對應的聲明、修改、刪除等一系列RabbitMQ基礎功能操作
例如添加一個交換機、刪除一個綁定、清空一個隊列裏的消息等

注意:autoStartup必須設置爲true,否則Spring容器不會加載RabbitAdmin類

創建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);//隊列持久化
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章