| 
         此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring AMQP 3.2.6!  | 
    
AMQP 抽象
Spring AMQP 由两个模块组成(每个模块在发行版中由一个 JAR 表示):spring-amqp和spring-rabbit.
'spring-amqp'模块包含org.springframework.amqp.core包。
在该包中,您可以找到表示核心 AMQP“模型”的类。
我们的目的是提供不依赖于任何特定 AMQP 代理实现或客户端库的通用抽象。
最终用户代码可以更易于跨提供商实现,因为它只能针对抽象层进行开发。
然后,这些抽象由特定于代理的模块实现,例如“spring-rabbit”。
目前只有一个 RabbitMQ 实现。
但是,除了 RabbitMQ 之外,还使用 Apache Qpid 在 .NET 中验证了抽象。
由于 AMQP 在协议层面运行,原则上你可以将 RabbitMQ 客户端与任何支持相同协议版本的 Broker 一起使用,但我们目前不测试任何其他 Broker。
本概述假定您已经熟悉 AMQP 规范的基础知识。 如果没有,请查看其他资源中列出的资源
Message
0-9-1 AMQP 规范未定义Message类或接口。
相反,当执行basicPublish(),内容作为字节数组参数传递,其他属性作为单独的参数传递。
Spring AMQP 定义了一个Message类作为更通用的 AMQP 域模型表示形式的一部分。
的目的Messageclass 是将主体和属性封装在单个实例中,以便 API 反过来可以更简单。
以下示例显示了Message类定义:
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;
    }
}
这MessagePropertiesinterface 定义了几个常见属性,例如 'messageId'、'timestamp'、'contentType' 等。
您还可以通过调用setHeader(String key, Object value)方法。
从版本开始1.5.7,1.6.11,1.7.4和2.0.0,如果消息正文是序列化的Serializablejava 对象,则在执行toString()作(例如在日志消息中)。
这是为了防止不安全的反序列化。
默认情况下,只有java.util和java.lang类被反序列化。
要恢复到以前的行为,您可以通过调用Message.addAllowedListPatterns(…).
例如,支持简单的通配符*com.something.*, *.MyClass.
无法反序列化的主体表示为byte[<size>]在日志消息中。 | 
交换
这Exchange接口表示 AMQP 交换,这是消息生产者发送到的交换。
代理虚拟主机中的每个 Exchange 都有一个唯一的名称以及一些其他属性。
以下示例显示了Exchange接口:
public interface Exchange {
    String getName();
    String getExchangeType();
    boolean isDurable();
    boolean isAutoDelete();
    Map<String, Object> getArguments();
}
如您所见,一个Exchange也有一个“类型”,由定义在ExchangeTypes.
基本类型包括:direct,topic,fanout和headers.
在核心包中,您可以找到Exchange接口。
这些行为各不相同Exchange类型如何处理与队列的绑定。
例如,一个DirectExchange 允许队列由固定路由键(通常是队列的名称)绑定。
一个TopicExchange 支持具有路由模式的绑定,这些模式可能分别包括“恰好一”和“零或更多”的“*”和“#”通配符。
这FanoutExchange 发布到绑定到它的所有队列,而不考虑任何路由密钥。
有关这些和其他 Exchange 类型的详细信息,请参阅 AMQP 交换。
从 3.2 版开始,ConsistentHashExchange为了在应用程序配置阶段引入类型。
它提供了以下选项:x-consistent-hash对于交换类型。
允许配置hash-header或hash-propertyexchange 定义参数。
相应的 RabbitMQrabbitmq_consistent_hash_exchange必须在代理上启用插件。
有关 Consistent Hash Exchange 的用途、逻辑和行为的更多信息,请参阅官方 RabbitMQ 文档。
AMQP 规范还要求任何代理提供没有名称的“默认”直接交换。
所有声明的队列都绑定到该默认值Exchange使用它们的名称作为路由键。
您可以在 Spring AMQP 中了解有关默认 Exchange 用法的更多信息,请访问AmqpTemplate. | 
队列
这Queueclass 表示消息使用者从中接收消息的组件。
像各种Exchangeclasses,我们的实现旨在作为此核心 AMQP 类型的抽象表示。
以下列表显示了Queue类:
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;
    /**
     * The queue is durable, non-exclusive and non auto-delete.
     *
     * @param name the name of the queue.
     */
    public Queue(String name) {
        this(name, true, false, false);
    }
    // Getters and Setters omitted for brevity
}
请注意,构造函数采用队列名称。 根据实现,管理模板可能会提供用于生成唯一命名队列的方法。 此类队列可用作“回复”地址或其他临时情况。 因此,自动生成队列的“exclusive”和“autoDelete”属性都将设置为“true”。
| 有关使用命名空间支持声明队列的信息,请参阅配置代理中有关队列的部分,包括队列参数。 | 
捆绑
鉴于生产者向交换发送,而使用者从队列接收,将队列连接到交换的绑定对于通过消息传递连接这些生产者和使用者至关重要。
在 Spring AMQP 中,我们定义了一个Binding类来表示这些连接。
本节回顾了将队列绑定到交换的基本选项。
您可以将队列绑定到DirectExchange使用固定路由键,如以下示例所示:
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.*");
为清楚起见,前面的示例显示了BindingBuilder类,但这种样式在对 'bind()' 方法使用静态导入时效果很好。 | 
就其本身而言,一个实例Bindingclass 仅保存有关连接的数据。
换句话说,它不是一个“主动”组件。
但是,正如您稍后将在配置代理中看到的那样,AmqpAdmin类可以使用Binding实例以实际触发代理上的绑定作。
此外,正如您在同一部分中看到的,您可以定义Binding实例,使用 Spring 的@Bean注释@Configuration类。
还有一个方便的基类,它进一步简化了生成与 AMQP 相关的 bean 定义的方法,并识别队列、交换和绑定,以便在应用程序启动时在 AMQP 代理上声明它们。
这AmqpTemplate也在核心包中定义。
作为实际 AMQP 消息传递中涉及的主要组件之一,它在自己的部分中进行了详细讨论(请参阅AmqpTemplate).