前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RabbitMQ扩展之交换器间的绑定

RabbitMQ扩展之交换器间的绑定

作者头像
Throwable
发布2020-06-23 15:27:41
9140
发布2020-06-23 15:27:41
举报
文章被收录于专栏:Throwable's Blog

概要

AMQP-0-9-1中提供了queue.bind方法用于绑定一个队列到一个交换器,然后发送消息的时候,数据流总是先通过交换器(source)最终到达目标队列中(destination)。RabbitMQ实现了扩展,为交换器提供了一个exchange.bind方法用于绑定一个交换器到另一个交换器。交换器之间的绑定和队列与交换器的绑定在语义上是相同的:单向的、使用路由键和多种交换器类型。这一点允许使用者创建更丰富的路由拓扑。exchange.bind方法中的source和destination反映了消息的流向:从源(source)交换器到目标(destination)交换器。

queue.bind方法一样,可以在相同的绑定端点上创建多个不同的交换器绑定,例如:

  • exchange-source -> exchange-destination-1 -> queue-1
  • exchange-source -> exchange-destination-2 -> queue-2
  • exchange-source -> exchange-destination-3 -> queue-3

RabbitMQ在消息传递期间检测并消除循环,并确保在任何路由拓扑上传递给定路由的每个队列,每个队列将只接收该消息的一个副本。

使用了auto-delete参数声明的交换器只有它关联的所有绑定关系都移除(不管是交换器之间的绑定还是交换器和队列的绑定),它自身才会被删除。举个例子:

  • exchange-source -> exchange-destination -> queue-1

如果exchange-source被删除或者解除与exchange-destination的绑定关系同时exchange-destinationqueue-1解除绑定,而exchange-destination使用了auto-delete参数声明,那么exchange-destination就会被删除。

RabbitMQ中还提供了一个exchange.unbind方法进行交换器之间绑定关系的解除。

编码实现

代码语言:javascript
复制
public class ExchangeBindingMain extends BaseChannelFactory {

	public static void main(String[] args) throws Exception {
		provideChannel(channel -> {
			channel.exchangeDeclare("exchange.source", BuiltinExchangeType.DIRECT, true, false, null);
			channel.exchangeDeclare("exchange.destination", BuiltinExchangeType.DIRECT, true, true, null);
			channel.queueDeclare("exchange.binding.queue", true, false, false, null);
			channel.exchangeBind("exchange.destination", "exchange.source", "exchange.routingKey");
			channel.queueBind("exchange.binding.queue", "exchange.destination", "exchange.routingKey");
			channel.basicPublish("exchange.source", "exchange.routingKey", MessageProperties.BASIC, "message".getBytes(StandardCharsets.UTF_8));
			channel.exchangeUnbind("exchange.destination", "exchange.source", "exchange.routingKey");
//			channel.exchangeDelete("exchange.source");
			channel.queueUnbind("exchange.binding.queue", "exchange.destination", "exchange.routingKey");
		});
	}
}

在解除exchange.sourceexchange.destinationexchange.binding.queueexchange.destination之间的绑定后,exchange.destination会自动删除。

(本文完 e-a-20181218 c-1-d)

本文是Throwable的原创文章,转载请提前告知作者并且标明出处。 博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议 本文永久链接是:https://cloud.tencent.com/developer/article/1649925

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年12月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概要
  • 编码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档