Как настроить фильтр с определенным типом сообщения?

#masstransit

#masstransit

Вопрос:

Я хочу использовать сообщения только с определенным типом и набором свойств. Своего рода фильтр содержимого сообщения перед созданием любого экземпляра потребителя.

Я пытаюсь создать фильтр для определенного ConsumeContext:

 public class OrderFilter : IFilter<ConsumeContext<CreateOrderMessage>>
{
    public Task Send(ConsumeContext<CreateOrderMessage> context, IPipe<ConsumeContext<CreateOrderMessage>> next)
    {
        if (context.Message.IsTrustedUser)
        {
            return next.Send(context); // continue processing
        }
        return Task.CompletedTask; // stop message processing
    }

    public void Probe(ProbeContext context) { }
}
  

Как я могу зарегистрировать такой фильтр?

Я пытался зарегистрировать его в конечной точке, но безуспешно. У меня есть

 cfg.ReceiveEndpoint("OrderQueue", ep =>
{
    ep.UseFilter(new OrderFilter());
    ep.Consumer<CreateOrderConsumer>();
});
  

У меня следующая ошибка: не удается преобразовать тип аргумента экземпляра ‘{MassTransit .IReceiveEndpointConfigurator,MassTransit.RabbitMqTransport.IRabbitMqReceiveEndpointConfigurator}’ to ‘GreenPipes.IPipeConfiguratorConsumeContextCreateOrderMessage>>’

Комментарии:

1. К вашему сведению: возникла проблема .

Ответ №1:

Итак, раньше для этой цели существовал метод расширения, но я не могу его найти. Вы можете добавить фильтр до создания потребителя, создав спецификацию фильтра и добавив ее, как показано ниже.

 var filter = new OrderFilter();
var specification = new FilterPipeSpecification<ConsumeContext< CreateOrderMessage >>(filter);
ep.AddPipeSpecification(specification);
  

Если вы хотите выполнить фильтр после создания потребителя (например, если вы используете область контейнера для обмена информацией), вы можете использовать фильтр потребления области (который описан в нескольких ответах, а также в документации) или вы можете добавить свой фильтр во время настройки потребителя.

 ep.Consumer<CreateOrderConsumer>(cc =>
{
    cc.Message<CreateOrderMessage>(mc => mc.UseFilter(new OrderFilter()));
}