熟したバナナ :
私はRabbitMQのでMassTransitを使用しています。上exmaple以下の公式ドキュメントのページのカスタムミドルウェアのため、私はフィルタアウトされますいくつかのメッセージを特定の条件に基づいてメッセージの消費パイプラインにフィルタを作成しようとしています。私のフィルタは、次のようになります。
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);
}
}
}
問題は、メッセージがパイプライン受け継がれていない場合(つまり、ということであるawait next.Send(context)
と呼ばれていない)、_skipped消費者のRabbitMQのキュー内のメッセージが終了します。そのキューに行くからのメッセージを防止するための方法はありますか?
アレクセイZimarev:
skipped
(デッドレター)キューでメッセージを取得しDeadLetterFilter
、呼び出し。ここでは、コードは次のようになります。
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);
}
だから、あなたは、コンテキストが持っている場合は、その想像できるIsDelivered
かIsFaulted
に設定しtrue
、あなたのメッセージはデッドレターキューに終わることはありません。
あなたがフィルターに投げる場合は、あなたのメッセージは毒(で終わるerror
、私はそれはオプションではありませんだと思うので、代わりに)キュー。
あなたのフィルタでフィルタリングメッセージのためにこのような何かを行うことによって配信されるあなたのメッセージをシミュレートすることができます。
public Task Send(T context, IPipe<T> next)
=> condition
? next.Send(context)
: context.NotifyConsumed(context as ConsumeContext<MyMessage>, TimeSpan.Zero, "Filtered");