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);//隊列持久化 }