c# - MassTransit 中是否有对命名空间消费者的开箱即用支持?
问题描述
我正在使用 MassTransit 并且有这样的项目结构:
Api1 (Publisher)
- (Instance 1) Publishes PersonCreatedEvent
Worker1 (Consumer)
- (Instance 1) Consumes PersonCreatedEvent via PersonCreatedEventConsumer
- (Instance 2) Consumes PersonCreatedEvent via PersonCreatedEventConsumer
Worker2 (Consumer)
- (Instance 1) Consumes PersonCreatedEvent via PersonCreatedEventConsumer
- (Instance 2) Consumes PersonCreatedEvent via PersonCreatedEventConsumer
我的目标是Api1
发布PersonCreatedEvent
两者Worker1
并Worker2
接收消息并根据正在运行的实例数量循环处理它。
Worker1
在使用 .NET Core DI 容器和Worker2
.NET Core DI 容器中注册我的消费者时,我看到在 RabbitMQbusConfigurator.AddConsumer<PersonCreatedEventConsumer>
中只创建了一个名为的队列。PersonCreatedEvent
考虑到消息与 MassTransit 中的命名空间一起使用,我希望创建以下队列名称:
Worker1.PersonCreatedEvent
Worker2.PersonCreatedEvent
包括命名空间似乎也是一个明智的默认设置。根据我所看到的行为,任何命名的类PersonCreatedEventConsumer
(甚至跨项目)都将开始使用相同的队列。
我可以通过手动指定每个端点来解决这个问题,Worker
如下所示:
busConfigurator
.AddConsumer<PersonCreatedEventConsumer>()
.Endpoint(e => e.Name = typeof(PersonCreatedEventConsumer).FullName);
注意:虽然指定端点有效,但似乎在 RabbitMQ 中也为我的消费者创建了 Exchange。为什么是这样?这些端点不应该只是队列,因为它们是消费者吗?
是否有针对命名空间消费者的开箱即用解决方案,还是我应该继续遵循我一直遵循的模式来指定我的端点?
解决方案
默认端点名称格式化程序在格式化端点名称时不包括命名空间,它仅使用名称类型。您可以指定自己的端点名称格式化程序,而不是为每个使用者指定一个端点,方法是将其添加到容器中,或者在调用时显式指定ConfigureEndpoints
。
DefaultEndpointNameFormatter的源代码应该会给您一个良好的开端。
至于您的注释,请参阅文档的代理拓扑部分以了解 MassTransit 如何配置 RabbitMQ。
推荐阅读
- java - 如何获取其中包含多个 JSONObject 的数据
- c++ - GFG上金矿问题的记忆方法
- react-native-ios - 错误:main.jsbundle 不存在。反应原生版本 0.58.5
- c++ - 将剪贴板内容粘贴到窗口
- python-3.x - 使用天文学家图像安装 Docker 气流的 g++ 错误
- ios - Swift Widget:带有完成处理程序的 getTimeline
- python - 如何使用 python3 通过 GET 请求获取特定资源?
- tensorflow - 使用 Keras 或 TF 模型进行异步预测/推断?
- azure - Azure DevOps 管道失败:序列不是预期的
- jenkins - 带有文件参数的参数化调度程序 - Jenkins