在MassTransit.RabbitMq中向标头添加值

Gra*_*zar 6 masstransit rabbitmq

我使用的是MassTransit 3.0.0.0,我很难理解如何在请求-响应方案中拦截消息,并在接收者端读取的标题字段中添加一些信息。

我正在按照MassTransit文档中的建议查看中间件 -请参阅“ 观察者”警告-但您在“发送”中获得的上下文只是一个Pipe上下文,无法访问Headers字段,因此我无法更改它。我使用了“ 中间件”页面中提供的示例。

然后,我看着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(() => { });
    }
}
Run Code Online (Sandbox Code Playgroud)

这是非常清楚和简洁的。但是,我不知道在哪里使用它以及如何将其链接到其余基础结构。就目前而言,这只是一个没有真正链接到任何东西的接口。

Chr*_*son 7

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

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

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

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

  • 现在是 `cfg.ConfigurePublish(x =&gt; x.UseSendExecute(async context =&gt; wait { ... }));` (2认同)

Ale*_*rev 5

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

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);
}
Run Code Online (Sandbox Code Playgroud)