Binding与BindingBuilder源码解读

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 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());
		}

		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.emptyMap());
		}

		public Binding with(Enum routingKeyEnum) {
			return new Binding(destination.name, destination.type, exchange, routingKeyEnum.toString(),
					Collections.emptyMap());
		}

		public Binding withQueueName() {
			return new Binding(destination.name, destination.type, exchange, destination.name,
					Collections.emptyMap());
		}
	}

 

你可能感兴趣的:(中间件)