Estoy usando MassTransit con RabbitMQ. Tras la exmaple en la página oficial de la documentación para el middleware de costumbre, estoy tratando de crear un filtro en la tubería de consumo mensaje que filtrará de salida algunos mensajes en función de una determinada condición. Mi filtro es el siguiente:
public class MyCustomFilter<T> : IFilter<T>
where T : class, ConsumeContext
{
public void Probe(ProbeContext context) { }
public async Task Send(T context, IPipe<T> next)
{
if (/* certain condition */)
{
await next.Send(context);
}
}
}
El problema es que cuando el mensaje no se pasa por la tubería (es decir, await next.Send(context)
no se llama), los extremos mensaje en la cola RabbitMQ consumidor _skipped. ¿Hay una manera de evitar que el mensaje va en esa cola?
El skipped
(la letra muerta) cola recibe el mensaje por la DeadLetterFilter
invocación. Aquí está el código:
async Task IFilter<ReceiveContext>.Send(ReceiveContext context, IPipe<ReceiveContext> next)
{
await next.Send(context).ConfigureAwait(false);
if (context.IsDelivered || context.IsFaulted)
return;
context.LogSkipped();
await _deadLetterPipe.Send(context).ConfigureAwait(false);
}
Por lo tanto, se puede imaginar que si el contexto tiene IsDelivered
o IsFaulted
conjunto a true
, los mensajes no va a terminar en la cola de mensajes no entregados.
Si se lanza en el filtro, los mensajes terminan en el veneno ( error
cola) en su lugar, así que supongo que no es una opción.
Se puede simular que sus mensajes sean entregados por hacer algo como esto para los mensajes filtrados en el filtro:
public Task Send(T context, IPipe<T> next)
=> condition
? next.Send(context)
: context.NotifyConsumed(context as ConsumeContext<MyMessage>, TimeSpan.Zero, "Filtered");