AMQP协议是描述了有关消息服务器是如何配置我们经常提到的队列(Queues)、交换器(Exchanges)以及绑定关系(Bindings),这个服务器也经常被称为Broker。
在AMQP0.8版本以及更高版本都有一系列方便易用的方法来完成上面的这些声明创建,他们都在AmqpAdmin接口下,而RabbitMQ也有基于AmqpAdmin的相应实现,即位于org.springframework.amqp.rabbit.core报下的RabbitAdmin。
AmqpAdmin
下面是AmqpAdmin接口的所有成员方法,其是在Spring AMQP的基础上高度抽象出来的
getQueueProperties方法可以得到与queue相关的属性信息比如消息个数以及消费者的个数等。这些在RabbitAdmin中都定义了相应的常量QUEUE_NAME、QUEUE_MESSAGE_COUNT、QUEUE_CONSUMER_COUNT(这段在官方API文档表述有误,将RabbitAdmin说成了RabbitTemplate)
无参函数declareQueue用于创建一个服务器分配好名字的queue,其他属性都是采用默认值,即exclusive=true,autoDelete=true,durable=false
declareQueue(Queue queue)入参为一个队列的对象,返回值为该队列的队列名称。如果这个队列的名称就是一个空字符串,那么服务器就会为其生成一个名称,但是不影响入参queue对象本身
这里要注意,我们还有一个AnonymousQueue,匿名队列是由框架默认通过UUID规则为其分配一个名字,相应的属性也是exclusive=true,autoDelete=true,durable=false
匿名队列有个特性,就是即使服务挂了,当服务再次启动的时候,它的名称还会和原来一样,但是前面说到的服务分配的声明队列就不会。
另外,关于声明队列有一点,其必须要有一个固定的名字,因为这是用于标识这个队列,同时也是方便在不同的绑定或者注册到某上下文中标识自己,比如注册到一个监听器中
声明RabbitAdmin
上面提到的AmqpAdmin的实现类RabbitAdmin主要用于创建队列和交换器以及绑定关系等,其在XML中声明方式如下
声明Queue
在XML中声明一个Queue很简单
<rabbit:queue name="stocks.trade.queue"/>
除了声明Queue的name属性,还可以通过id属性来标识queue。除此以外,还可以声明queue的其他属性信息比如x-message-ttl、x-ha-policy,借助<rabbit:queue-arguments>标签即可
我们还可以在<rabbit:queue-arguments>标签中定义不同类型的参数
在Spring Framework 3.2版本之后,我们可以使用下面更加简洁的方式来声明
忽略异常
默认情况下,RabbitAdmin如果遇到一处抛异常,那么RabbitAdmin就会直接停止服务,这种情况因为一处异常而影响了RabbitAdmin的正常运行,我们可以通过声明ignore-declaration-exceptions属性来解决这个问题,从这个属性的命名就可以知道他的作用了。
在RabbitAdmin中,我们可以通过ignoreDeclarationExceptions这个属性来设置。在1.6版本之前,这个属性还只能作用与IOException,在该版本之后,该属性作用于所有的异常情况,保证及时有一处因为某种原因抛异常,但是RabbitAdmin仍然能够很好的工作,完成队列、交换器等的声明和定义。
实例
下面通过实例,来看看AMQP服务Broker是如何完成服务端和客户端的声明以及绑定等操作的,这里通过JAVA配置类的方式实现的。
先创建一个抽象类AbstractStockAppRabbitConfiguration配置类
定义了ConnectionFactory,配置了连接服务的必要信息
声明了一个Jackson2JsonMessageConverter消息转换器
创建了RabbitTemplate,并注册了上面的消息转换器
新建了一个TopicExchange
服务端声明
客户端声明********
通过Value注入routingKey
声明了一个队列
将队列与上面的TopicExchange进行了绑定,至此完成了所有的配置