如何将标题附加到所有已发布的消息?

时间:2014-04-03 21:15:14

标签: masstransit

我有一个特定的标题,我想附加到我发布的所有邮件中。我可以通过在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方法。

1 个答案:

答案 0 :(得分:11)

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

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

    public void PostDispatch(ISendContext context)
    {
    }
}

奇怪的是没有ServiceBusConfigurator.AddOutboundInterceptor方法,所以我只创建了一个(通过从github复制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());
});

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

{{1}}

问题解决了。