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一个优秀的.NET消息(事件)总线框架
MassTransit一个优秀的.NET消息(事件)总线框架
MassTransit.QuartzIntegration.ScheduledMessageJob:无法实例化没有空构造函数的类型(参数'ScheduledMessageJob')'