#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()));
}