MassTransit如何避免创建端点Exchange并绑定现有Exchange?
问题1:避免自动创建接收端点同名Exchange
可以实现,MassTransit默认会为每个接收端点创建同名fanout Exchange并绑定到队列,关闭默认消费拓扑后手动绑定目标Exchange即可,配置如下:
cfg.Message<Notification>(x => { x.SetEntityName("NOTIFICATION_REQUEST"); }); g.ReceiveEndpoint("notification-workerQ", e => { // 关闭默认消费拓扑,禁止自动创建端点同名Exchange e.ConfigureConsumeTopology = false; // 手动绑定消息对应的目标Exchange e.Bind<Notification>(); e.Consumer<NotificationConsumer>(); });
上述配置运行后只会创建NOTIFICATION_REQUEST Exchange和notification-workerQ队列,不会生成多余的端点同名Exchange。
附加问题:绑定已存在的Topic Exchange并指定Routing Key
正确配置不需要写在Consumer的配置块内,直接在接收端点配置中手动调用Bind方法指定已有Exchange的参数即可,代码如下:
g.ReceiveEndpoint("notification-workerQ", e => { // 关闭默认消费拓扑,禁止生成多余Exchange e.ConfigureConsumeTopology = false; // 可选:关闭故障消息自动发布,避免生成fault相关的Exchange e.PublishFaults = false; // 手动绑定已有的GENERIC_DROP Exchange e.Bind("GENERIC_DROP", x => { // 指定Exchange类型为Topic x.ExchangeType = "topic"; // 配置绑定用的Routing Key x.RoutingKey = "componentX.something.notification"; // 完全禁止MassTransit创建/修改该Exchange,适配已有资源要求 x.Declare = false; // 以下参数需要和已有GENERIC_DROP的实际配置保持一致 x.Durable = true; x.AutoDelete = false; }); e.Consumer<NotificationConsumer>(); });
如果是RabbitMQ场景,也可以引用MassTransit.RabbitMqTransport命名空间,使用ExchangeType.Topic常量代替字符串"topic"。
内容的提问来源于stack exchange,提问作者Virgo17
相关产品推荐
相关产品推荐

