MassTransit - 如何创建具有通用类型和 2 个不同消费者的交换主题

Posted

技术标签:

【中文标题】MassTransit - 如何创建具有通用类型和 2 个不同消费者的交换主题【英文标题】:MassTransit - How to create an exchange topic with a generic type and 2 different consumers 【发布时间】:2022-01-18 03:22:48 【问题描述】:

我正在创建一个具有通用事件类型和 2 个不同消费者的主题交换,我想知道是否有更好的方法使用泛型来做到这一点?

我过得怎么样

通用事件:

public interface IOrchestratorTopicType<T> where T : class
    
        public Guid? TraceId  get; set; 
        public string Event  get; set; 
        public string Source  get; set; 
        public string Destination  get; set; 
        public T Data  get; set; 
    

配置:

services.AddMassTransit(bus =>
            
                bus.SetKebabCaseEndpointNameFormatter();

                bus.UsingRabbitMq((ctx, busConfigurator) =>
                
                    busConfigurator.Host(configuration.GetConnectionString("RabbitMq"));

                    busConfigurator.Publish<IOrchestratorTopicType<object>>(a => a.ExchangeType = ExchangeType.Topic);

                    busConfigurator.ReceiveEndpoint("create-order", e =>
                    
                        e.ConfigureConsumeTopology = false;
                        e.Consumer<CreateOrderConsumer>();
                        e.Bind<IOrchestratorTopicType<object>>(s =>
                        
                            s.RoutingKey = "create.order";
                            s.ExchangeType = ExchangeType.Topic;
                        );
                    );

                    busConfigurator.ReceiveEndpoint("valid-order", e =>
                    
                        e.ConfigureConsumeTopology = false;
                        e.Consumer<ValidOrderConsumer>();
                        e.Bind<IOrchestratorTopicType<object>>(s =>
                        
                            s.RoutingKey = "valid.order";
                            s.ExchangeType = ExchangeType.Topic;
                        );
                    );
                );
            );
            services.AddMassTransitHostedService();

制作人:

await _publisher.Publish<IOrchestratorTopicType<object>>(new
                
                    TraceId = new Guid(),
                    Event = "create.order",
                    Source = "SourceTestSource",
                    Destination = "DestinationTest",
                    Data = createOrderModel
                , e => e.TrySetRoutingKey("create.order"));

消费者:

public class ValidOrderConsumer : IConsumer<IOrchestratorTopicType<object>>
    
        public Task Consume(ConsumeContext<IOrchestratorTopicType<object>> context)
        
            throw new NotImplementedException();
        
    

public class CreateOrderConsumer : IConsumer<IOrchestratorTopicType<object>>
    
        public Task Consume(ConsumeContext<IOrchestratorTopicType<object>> context)
        
            throw new NotImplementedException();
        
    

我希望生产者发送对象的确切类型,消费者使用对象的确切类型而不是通用对象

【问题讨论】:

【参考方案1】:

我建议观看this video MassTransit 如何使用 RabbitMQ。 MassTransit 使用主题交换的需求为零,因为它默认使用基于类型的路由。

我不推荐上面的代码,因为 MassTransit 已经默认使用 RabbitMQ 进行基于多态类型的路由。

【讨论】:

不错!非常感谢!

以上是关于MassTransit - 如何创建具有通用类型和 2 个不同消费者的交换主题的主要内容,如果未能解决你的问题,请参考以下文章

如何托管MassTransit和RabbitMq

如何创建通用数据类型以访问 Json 响应的内部边界

MassTransit 确保在发布消息之前创建队列

MassTransit一个优秀的.NET消息(事件)总线框架

MassTransit一个优秀的.NET消息(事件)总线框架

MassTransit.QuartzIntegration.ScheduledMessageJob:无法实例化没有空构造函数的类型(参数'ScheduledMessageJob')'