在MassTransit.RabbitMq中向标头添加值

时间:2016-01-27 22:49:31

标签: rabbitmq masstransit

我正在使用MassTransit 3.0.0.0,我很难理解如何在出路时截取请求 - 响应方案中的消息,并将一些信息添加到我可以在接收方端读取的headers字段中。

我正在按照MassTransit文档中的建议查看Middleware - 请参阅Observers警告 - 但您在Send上获得的上下文只是一个无法访问标题字段所以我无法改变它。我使用了Middleware页面中提供的示例。

然后,我看了一下IPublishInterceptor

public class X<T> : IPublishInterceptor<T> where T : class, PipeContext
{
    public Task PostPublish(PublishContext<T> context)
    {
        return new Task(() => { });
    }

    public Task PostSend(PublishContext<T> context, SendContext<T> sendContext)
    {
        return new Task(() => { });
    }

    public Task PrePublish(PublishContext<T> context)
    {
        context.Headers.Set("ID", Guid.NewGuid().ToString());
        return new Task(() => { });
    }

    public Task PreSend(PublishContext<T> context, SendContext<T> sendContext)
    {
        context.Headers.Set("ID", Guid.NewGuid().ToString());
        return new Task(() => { });
    }
}

这是非常简洁明了的。但是,我不知道它的使用位置以及如何将其链接到其他基础架构。就目前而言,这只是一个与任何东西都没有真正联系的界面。

3 个答案:

答案 0 :(得分:4)

如果您需要在发送邮件时添加标头,则可以将中间件组件添加到“发送”或“发布”管道,如下所示。请注意,发送过滤器将应用于所有邮件,而发布过滤器仅适用于已发布的邮件。

// execute a synchronous delegate on send
cfg.ConfigureSend(x => x.Execute(context => {}));

// execute a synchronous delegate on publish
cfg.ConfigurePublish(x => x.Execute(context => {}));

可以在总线或单个接收端点上配置中间件,这些配置在其配置的位置是本地的。

答案 1 :(得分:4)

您还可以在使用者类中添加标题:

public async Task Consume(ConsumeContext<MyMessage> context)
{
    ....
    await context.Publish<MyEvent>(new { Data = data }, c => AddHeaders(c));
}

public static void AddHeaders(PublishContext context)
{
    context.Headers.Set("CausationId", context.MessageId);
}

答案 2 :(得分:1)

http://masstransit-project.com/MassTransit/advanced/middleware/custom.html

显示添加扩展程序以明确您要设置的内容。如果它是一个将被大量使用的拦截器,这将是一个很大的帮助,所以它明确了这个目的。如果需要,可以跳过该步骤。

基本上,只是......

cfg.AddPipeSpecification(new X<MyMessage>());

配置传输时。