.NET 8 + MassTransit/RabbitMQ:基于路由键的消息路由配置问题
正确配置方案
1. 生产者端(ImageService)
显式声明目标交换器,避免RabbitMQ自动创建不符合要求的交换器:
cfg.AddBus(context => Bus.Factory.CreateUsingRabbitMq(cfg => { var host = cfg.Host(new Uri("rabbitmq://localhost"), h => { h.Username("guest"); h.Password("guest"); }); // 显式声明direct类型的exc-image交换器 cfg.ExchangeDeclare("exc-image", ExchangeType.Direct); }));
发布消息的代码可保留,确保路由键正确对应PRODUCT/USER即可。
2. 消费者端(以ProductService为例)
问题根源是ConfigureConsumeTopology = false后,未明确绑定逻辑导致MassTransit自动创建了队列同名的fanout交换器。正确配置:
cfg.ReceiveEndpoint("product-queue", e => { // 关闭自动默认拓扑 e.ConfigureConsumeTopology = false; // 绑定消费者 e.ConfigureConsumer<ImageSavedConsumer>(ctx); // 显式绑定到exc-image交换器,指定路由键和类型 e.Bind("exc-image", b => { b.RoutingKey = "PRODUCT"; b.ExchangeType = ExchangeType.Direct; // 确保交换器不存在时自动创建(可选,建议和生产者端统一显式声明) b.Declare = true; }); // 配置队列持久化,避免自动删除 e.Durable = true; e.AutoDelete = false; });
3. UserService消费者配置(同理)
仅修改路由键为USER即可:
cfg.ReceiveEndpoint("user-queue", e => { e.ConfigureConsumeTopology = false; e.ConfigureConsumer<UserImageSavedConsumer>(ctx); e.Bind("exc-image", b => { b.RoutingKey = "USER"; b.ExchangeType = ExchangeType.Direct; }); e.Durable = true; e.AutoDelete = false; });
内容的提问来源于stack exchange,提问作者Max Bertoli
相关产品推荐
相关产品推荐

