[toc]
## 介紹
Spring AMQP由一些模塊組成,每個模塊由發布中的JAR表示。 這些模塊是:spring-amqp和spring-rabbit。 spring-amqp模塊包含`org.springframework.amqp.core`包。 在該包中,您將找到代表核心AMQP“模型”的類。 我們的目的是提供不依賴于任何特定AMQP代理實現或客戶端庫的通用抽象。 最終用戶代碼在供應商實現中更具可移植性,因為它只能針對抽象層進行開發。 然后使用這些抽象由特定于代理的模塊實現,例如spring-rabbit。 目前只有RabbitMQ實現; 但是,除了RabbitMQ之外,還使用Apache Qpid在.NET中驗證了抽象。 由于AMQP原則上在協議級別運行,因此RabbitMQ客戶端可以與支持相同協議版本的任何代理一起使用,但我們目前不測試任何其他代理。
此處概述假定您已熟悉AMQP規范的基礎知識。 如果不是,請查看第5章“其他資源”中列出的資源
## 消息
0-9-1 AMQP規范未定義Message類或接口。 替代的,當執行諸如`basicPublish()`之類的操作時,內容將作為字節數組參數傳遞,并且其他屬性將作為單獨的參數傳遞。 Spring AMQP將Message類定義為更通用的AMQP域模型表示的一部分。 Message類的目的是簡單地將主體和屬性封裝在單個實例中,以便API可以更簡單。 Message類定義非常簡單。
~~~java
public class Message {
private final MessageProperties messageProperties;
private final byte[] body;
public Message(byte[] body, MessageProperties messageProperties) {
this.body = body;
this.messageProperties = messageProperties;
}
public byte[] getBody() {
return this.body;
}
public MessageProperties getMessageProperties() {
return this.messageProperties;
}
}
~~~
`MessageProperties`接口定義了幾個常見屬性,例如`messageId`,`timestamp`,`contentType`等等。 通過調用`setHeader(String key, Object value)`方法,還可以自定義擴展這些屬性。
## 交換機
接口`Exchange `代表AMQP 的交換機,就是消息生產者要發送的地方. 代理虛擬主機中的每個交換機都具有唯一的名稱以及一些其他屬性:
~~~java
public interface Exchange {
String getName();
String getExchangeType();
boolean isDurable();
boolean isAutoDelete();
Map<String, Object> getArguments();
}
~~~
如您所見,`Exchange`還具有由`ExchangeTypes`中定義的常量表示的類型。 基本類型包括:`Direct`,`Topic`,`Fanout`和`Headers`。 在核心包中,您將找到每種類型的Exchange接口的實現。 在這些Exchange類型處理綁定到隊列的方式方面,行為會有所不同。 例如,直連交換機允許隊列由固定路由鍵(通常是隊列的名稱)綁定。 主題交換機支持具有路由模式的綁定,路由模式可以分別包括*和#通配符,分別用于一個和零或多個。 扇型交換機發布消息到綁定到它的所有隊列,而不考慮任何路由鍵。 有關這些和其他Exchange類型的更多信息,請參閱第5章,其他資源。
## 隊列
`Queue`類表示消息使用者從中接收消息的組件。 與各種Exchange類一樣,我們的實現旨在成為此核心AMQP類型的抽象表示。
~~~java
public class Queue {
private final String name;
private volatile boolean durable;
private volatile boolean exclusive;
private volatile boolean autoDelete;
private volatile Map<String, Object> arguments;
/**
* 隊列是持久的,非獨占的和非自動刪除。
*
* @param name the name of the queue.
*/
public Queue(String name) {
this(name, true, false, false);
}
// Getters and Setters omitted for brevity
}
~~~
請注意,構造函數采用隊列名稱。 根據實現,管理模板可以提供用于生成唯一命名的隊列的方法。 此類隊列可用作“回復”地址或其他臨時情況。 因此,自動生成的Queue的exclusive和autoDelete屬性都將設置為true。
## 綁定
鑒于生產者發送到Exchange并且消費者從隊列接收,將隊列連接到Exchange的綁定對于通過消息傳遞連接這些生產者和消費者是至關重要的。 在Spring AMQP中,我們定義了一個Binding類來表示這些連接。 讓我們回顧一下將隊列綁定到Exchange的基本選項。
您可以使用固定的路由鍵將隊列綁定到DirectExchange。
~~~java
new Binding(someQueue, someDirectExchange, "foo.bar")
~~~
您可以使用路由模式將隊列綁定到TopicExchange。
~~~
new Binding(someQueue, someTopicExchange, "foo.*")
~~~
您可以將隊列綁定到沒有路由鍵的FanoutExchange。
~~~
new Binding(someQueue, someFanoutExchange)
~~~
我們還提供了一個`BindingBuilder`來促進“流暢的API”風格。
~~~
Binding b = BindingBuilder.bind(someQueue).to(someTopicExchange).with("foo.*");
~~~
就其本身而言,Binding類的一個實例只是保存有關連接的數據。 換句話說,它不是“活動”組件。 但是,正如您將在后面的第3.1.10節“配置代理”中看到的那樣,`AmqpAdmin`類可以使用綁定實例來實際觸發代理上的綁定操作。 另外,正如您將在同一部分中看到的那樣,可以使用`@Configuration`類中的Spring的`@Bean`樣式定義Binding實例。 還有一個方便的基類,它進一步簡化了生成與AMQP相關的bean定義并識別隊列,交換和綁定的方法,以便在應用程序啟動時它們都將在AMQP代理上聲明。
`AmqpTemplate`也在核心包中定義。 作為實際AMQP消息傳遞中涉及的主要組件之一,它將在其自己的部分中詳細討論(請參見第3.1.4節“AmqpTemplate”)。
- 1.前言
- 2.介紹
- 2.1 快速瀏覽
- 3.參考
- 3.1 使用spring amqp
- 3.1.1 AMQP抽象
- 3.1.2 資源的連接和管理
- 介紹
- 配置底層客戶端連接工廠
- RabbitConnectionFactoryBean和配置SSL
- 路由連接工廠
- 隊列親和力和LocalizedQueueConnectionFactory
- 發送確認和返回
- 3.1.3 添加自定義客戶端連接屬性
- 3.1.4 AmqpTemplate
- 介紹
- 添加重試功能
- 發送消息是異步的 - 如何檢測成功和失敗
- 發布的確認和返回
- 3.1.5 發送消息
- 介紹
- 消息構建 API
- 發布的返回
- 3.1.6 接收消息
- 介紹
- 輪詢消費者
- 異步消費者