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進行了綁定,至此完成了所有的配置