一 .概述
在上一次我们整合成功了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,通过这种方式,我们可以更简单的声明一个队列,交换机等基本的操作.