Binding在Spring-AMQP下core中,生产者创建消息发送至exchange,消费者从队列中消费消息,队列与交换器的绑定关系便是由Binding来表示的,类中的说明原文:
Simple container collecting information to describe a binding. Takes String destination and exchange names as arguments to facilitate wiring using code based configuration.
一、使用Binding构造函数实例化
Binding中包含一个DestinationType,指定了destination QUEUE or EXCHANGE两种类型
public enum DestinationType {
/**
* Queue destination.
*/
QUEUE,
/**
* Exchange destination.
*/
EXCHANGE;
}
查看其构造函数
public Binding(String destination, DestinationType destinationType, String exchange, String routingKey,
Map<String, Object> arguments) {
this.destination = destination;
this.destinationType = destinationType;
this.exchange = exchange;
this.routingKey = routingKey;
this.arguments = arguments;
}
实例化一个Binding即声明了一个队列与交换器的绑定关系
二、使用BindingBuilder实例化一个Binding
类的原文声明是:
Basic builder class to create bindings for a more fluent API style in code based configuration.
其主要的意思是:在配置时更加快速的创建绑定关系。实例化Binding语法:
Binding binding = BindingBuilder.bind(queue).to(exchange).with(routing_key);
将一个queue绑定到exchange并用routing_key作为绑定键
bind()返回的是一个DestinationConfigurer,根据参数类型是Queue还是Exchange选择方法
public static DestinationConfigurer bind(Queue queue) {
return new DestinationConfigurer(queue.getName(), DestinationType.QUEUE);
}
public static DestinationConfigurer bind(Exchange exchange) {
return new DestinationConfigurer(exchange.getName(), DestinationType.EXCHANGE);
}
DestinationConfigurer类实现了不同Exchange的绑定,用to(Exchange_Type)用参数exchange类型来创建对应的DirectExchangeRoutingKeyConfigurer
public static final class DestinationConfigurer {
protected final String name;
protected final DestinationType type;
DestinationConfigurer(String name, DestinationType type) {
this.name = name;
this.type = type;
}
public Binding to(FanoutExchange exchange) {
return new Binding(this.name, this.type, exchange.getName(), "", new HashMap<String, Object>());
}
public HeadersExchangeMapConfigurer to(HeadersExchange exchange) {
return new HeadersExchangeMapConfigurer(this, exchange);
}
public DirectExchangeRoutingKeyConfigurer to(DirectExchange exchange) {
return new DirectExchangeRoutingKeyConfigurer(this, exchange);
}
public TopicExchangeRoutingKeyConfigurer to(TopicExchange exchange) {
return new TopicExchangeRoutingKeyConfigurer(this, exchange);
}
public GenericExchangeRoutingKeyConfigurer to(Exchange exchange) {
return new GenericExchangeRoutingKeyConfigurer(this, exchange);
}
}
最后使用with绑定routing_key,返回一个Binding实例,以DirectExchange为例
public static final class DirectExchangeRoutingKeyConfigurer extends AbstractRoutingKeyConfigurer<DirectExchange> {
DirectExchangeRoutingKeyConfigurer(DestinationConfigurer destination, DirectExchange exchange) {
super(destination, exchange.getName());
}
public Binding with(String routingKey) {
return new Binding(destination.name, destination.type, exchange, routingKey,
Collections.<String, Object>emptyMap());
}
public Binding with(Enum<?> routingKeyEnum) {
return new Binding(destination.name, destination.type, exchange, routingKeyEnum.toString(),
Collections.<String, Object>emptyMap());
}
public Binding withQueueName() {
return new Binding(destination.name, destination.type, exchange, destination.name,
Collections.<String, Object>emptyMap());
}
}