【问题标题】:How can I attach a header to all published messages?如何将标头附加到所有已发布的消息?
【发布时间】:2014-04-03 21:15:13
【问题描述】:

我有一个特定的标题,我想将它附加到我发布的所有消息中。我可以通过在 Publish 调用中指定它来逐个附加此标头:

_bus.Publish(myMessage, context => context.SetHeader("my key", "my value"));

这很好用,但每次发布都维护这个SetHeader 调用变得很麻烦。在总线配置期间或其他任何地方,有没有办法指定将附加到所有消息的标头?也就是说,有没有办法执行以下操作?

ServiceBusFactory.New(sbc =>
{        
    sbc.UseRabbitMq();
    sbc.ReceiveFrom(hdoQueue);

    // This is what I'd like to be able to do:
    sbc.BeforePublish(context => context.SetHeader("my key", "my value"));
});

我相信有一个解决方案涉及实现IOutboundMessageInterceptor,但我找不到附加拦截器的方法。有ServiceBusConfigurator.AddInboundInterceptor 方法,但没有ServiceBusConfigurator.AddOutboundInterceptor 方法。

【问题讨论】:

    标签: masstransit


    【解决方案1】:

    我的直觉是正确的,通过实现IOutboundMessageInterceptor,我能够做我想做的事:

    public class AttachHeadersOutboundInterceptor : IOutboundMessageInterceptor
    {
        public void PreDispatch(ISendContext context)
        {
            context.SetHeader("my key", "my value");
        }
    
        public void PostDispatch(ISendContext context)
        {
        }
    }
    

    奇怪的是没有ServiceBusConfigurator.AddOutboundInterceptor方法,所以我只创建了一个(通过从github复制the code for AddInboundInterceptor):

    public static class MassTransitExtensions
    {
        public static void AddOutboundInterceptor(this ServiceBusConfigurator configurator,
            IOutboundMessageInterceptor interceptor)
        {
            var builderConfigurator = new PostCreateBusBuilderConfigurator(bus =>
            {
                var interceptorConfigurator = new OutboundMessageInterceptorConfigurator(bus.OutboundPipeline);
    
                interceptorConfigurator.Create(interceptor);
            });
    
            configurator.AddBusConfigurator(builderConfigurator);
        }
    }
    

    然后我在总线配置期间附加它:

    ServiceBusFactory.New(sbc =>
    {        
        sbc.UseRabbitMq();
        sbc.ReceiveFrom(hdoQueue);
    
        sbc.AddOutboundInterceptor(new AttachHeadersOutboundInterceptor());
    });
    

    问题解决了。

    【讨论】:

    • 你有没有机会为此做公关?
    • @SonicTheLichen 我懒惰的背面没有为此发送补丁。道歉。
    • 不用担心,只是好奇。不管怎样,我很感激这些信息!
    • 此解决方案是否也适用于 MT3? (我似乎无法找到如何运行以下内容:_bus.Publish(myMessage, context => context.SetHeader("my key", "my value"));)
    • 如果有人读到:MT3 中有middleware
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    相关资源
    最近更新 更多