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