如何为MassTransit配置基于约定的Service Bus SessionId
在MassTransit中为继承BaseEvent的消息自动配置SessionId
不需要覆盖现有约定,直接新增自定义约定就能实现需求。MassTransit支持通过发送拓扑约定,批量为符合条件的消息类型配置SessionId规则。
具体实现步骤:
- 先定义一个针对
BaseEvent的SessionId约定,提取消息自身的SessionId属性作为消息的SessionId头部:
public class BaseEventSessionIdConvention : IMessageSendTopologyConvention<BaseEvent> { public void Apply(IMessageSendTopologyConfigurator<BaseEvent> configurator) { configurator.UseSessionIdFormatter(context => context.Message.SessionId); } }
- 在MassTransit的Bus配置中注册这个约定,让所有
BaseEvent的派生类自动应用该规则:
services.AddMassTransit(x => { // 注册你的消费者、消息类型等业务代码... x.UsingAzureServiceBus((context, cfg) => { // 其他Service Bus基础配置... // 方式一:简洁写法,自动覆盖所有BaseEvent派生类 cfg.Send<BaseEvent>(s => s.UseSessionIdFormatter(context => context.Message.SessionId)); // 方式二:通过添加约定的形式注册(和方式一效果一致,选其一即可) cfg.ConfigureSendTopology(s => { s.AddConvention(new BaseEventSessionIdConvention()); }); }); });
补充说明:
- 两种配置方式任选其一即可,
cfg.Send<BaseEvent>(...)是更轻量化的写法,会自动让所有派生类继承这个SessionId配置。 - 配置生效后,所有继承
BaseEvent的消息在发送/发布时,都会自动把自身的SessionId属性值赋值给消息的SessionId头部,完全匹配你的需求。 - 无需修改
CorrelatedBy<T>相关代码,SessionId和CorrelationId是独立的消息头部字段,这里仅针对SessionId的发送拓扑做配置。
内容的提问来源于stack exchange,提问作者deadwards
相关产品推荐
相关产品推荐

