版本:2.2.4.RELEASE
地址:官方文档
4.1 使用Spring AMQP
本章主要探索那些使用AMQP进行开发时必不可少的接口和类。
4.1.1 AMQP抽象
Spring AMQP包含了两个模块:spring-amqp
和spring-rabbit
。spring-amqp
模块包含了org.springframework.amqp.core
包。在这个包中,你可以找到代表AMQP核心模型的类。我们打算提供通用的抽象使我们可以不在依赖任何特定的AMQP broker实现或者client lib。用户代码可以更方便的更换具体的实现,因为它依赖于抽象层进行开发。这些抽象然后由特定的broker模块来实现,类如spring-rabbit
。…(省略几句没用的)
Message
0-9-1 AMQP 协议并没有定义Message
类或者接口,当进行例如basicPublish()
操作时,内容作为字节数组参数传递,额外的属性作为单独参数传递。Spring AMQP将消息类定义为更通用的AMQP域模型表示的一部分。Message
类的目的是将body和properties封装在一个实体中,从而是API更加简单。下面例子展示了定义:
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
接口定义了几个通用的properties,例如messageId
,timestamp
,contentType
。您还可以通过调用setHeader(String key,Object obj)
方法,使用用户定义的headers
扩展这些属性。
Exchange
这个Exchange接口代表AMQP中的Exchange(消息生产者发送消息到此)。每一个broker中的virtual host的exchange都有唯一的名字和一些属性。
public interface Exchange {
String getName();
String getExchangeType();
boolean isDurable();
boolean isAutoDelete();
Map<String, Object> getArguments();
}
如你所见,Exchange还有一个由ExchangeTypes中常量定义的类型。基本的类型包括:direct、topic、fanout和headers。在核心包中,你可以找到每种类型的exchange的具体实现类。这些Exchange类型的行为因其处理队列绑定的方式而异。…(省略具体行为,请看rabbitmq官网)
AMQP规范还要求任何代理都要提供一个“默认”的没有名字的direct exchange。所有被声明的队列都会被绑定到这个默认的exchange并且已他们的名字作为routing key。你可以了解更多关于默认exchange的用法在AmqpTemplate中。
Queue
Queue代表消息消费者从中接收消息的组件。与各种Exchange类一样,我们的实现旨在成为这种核心AMQP类型的抽象表示。
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
}
注意,构造方法提供了名称。根据实现的不同,admin template可以提供用于生成唯一命名队列的方法。此类队列可用作“回复”地址或其他临时情况。因此,自动生成队列的“exclusive”和“autoDelete”属性都将设置为“true”。
Binding
binding用于连接queue和exchange,它对于通过消息传递连接消费者和生产者十分重要。
new Binding(someQueue, someDirectExchange, "foo.bar");//direct exchange
new Binding(someQueue, someTopicExchange, "foo.*");//topic exchange
new Binding(someQueue, someTopicExchange, "foo.*");//fluent API
Binding类的实例本身只保存有关连接的数据,换言之,她不是一个活动的组件。但是,在后面的Configuring the Broker章节中你将会看到AmqpAdmin类可以使用Binding实例实际触发broker上的绑定动作。此外,正如您在同一节中所看到的,您可以通过在@Configuration类中使用Spring的@Bean注释来定义Binding实例。还有一个方便的基类,它进一步简化了生成AMQP相关bean定义的方法,并识别队列、交换和绑定,以便在应用程序启动时在AMQP代理上声明它们。
AmqpTemplate同样core包内,作为AMQP传递消息最重要的组件之一,更多的细节将会在它独有的章节介绍。