本文档基于 spring AMQP 2.2.1RELEASE REFERENCE 文档

基础组件

基础组件一共有四个Message、Exchange、Queue、Binding。

  • Message
    0-9-1 AMQP规范未定义Message类或接口。而是在执行诸如basicPublish()之类的操作时,将内容作为字节数组参数传递,并将其他属性作为单独的参数传递。 Spring AMQP将Message类定义为更通用的AMQP领域模型表示形式的一部分。 Message类的目的是将正文和属性封装在一个实例中,以便使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;
    }
}

MessageProperties接口定义了几个常用属性,例如“ messageId”,“ timestamp”,“ contentType”等。您还可以通过调用setHeader(String key,Object value)方法,使用用户定义的“header”扩展这些属性。

  • Exchange

Exchange接口表示一个AMQP Exchange,这是消息生产者发送消息的对象。代理的虚拟主机中的每个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类型在处理队列绑定方面的行为各不相同。例如,direct exchange可让队列由固定的路由键(通常是队列名称)绑定。topic exchange支持具有路由模式的绑定,路由模式可能分别包括“*”(表示一个词)和“#”(表示多个词)通配符。 Fanout交换发布到与其绑定的所有队列,而不考虑任何路由键。

  • Queue
    Queue类代表消息消费者从中接收消息的组件。以下展示了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

}

请注意,构造函数采用队列名称。管理模板(the admin template)可以提供用于生成唯一命名的队列的方法。这样的队列可以用作“答复”地址或在其他临时情况下使用。因此,自动生成的队列的“ exclusive”和“ autoDelete”属性都将设置为“ true”。

  • Binding
    假设生产者发送到exchange,而消费者从queue中接收,那么将queue连接到exchange的binding对这些生产者和消费者来说就至关重要。在Spring AMQP中,我们定义了一个Binding类来表示这些连接。
    你可以用一个指定的路由键绑定一个queue和一个DirectExchange ,如下。
new Binding(someQueue, someDirectExchange, "foo.bar");

你可以用一个指定的路由模式绑定一个queue和一个TopicExchange ,如下。

new Binding(someQueue, someTopicExchange, "foo.*");

你可以绑定一个queue和一个FanoutExchange ,而不指定路由键(因为这种是广播模式只要绑定就会转发),如下。

new Binding(someQueue, someFanoutExchange);

我们也提供了一个 BindingBuilder 以便于使用 “fluent API”(流式API) 风格,如下:

Binding b = BindingBuilder.bind(someQueue).to(someTopicExchange).with("foo.*");

就其本身而言,Binding类的实例仅保存有关连接的数据。换句话说,它不是“活动”组件。但是,如稍后在配置代理中所见,AmqpAdmin类可以使用Binding实例实际触发对代理的绑定操作。

就实际使用而言,其实应该基本上不会直接使用这几个类了,spring提供了更高级的API供我们使用,这里的说明旨在提供一个对Spring AMQP模型的抽象。