public override async Task InvokeAsync(IPipeContext context, CancellationToken token) { if (token != default(CancellationToken)) { await Next.InvokeAsync(context, token); return; } var timeout = GetTimeoutTimeSpan(context); var ctc = new CancellationTokenSource(timeout); var timeoutTsc = new TaskCompletionSource <bool>(); ctc.Token.Register(() => { var correlationId = context?.GetBasicProperties()?.CorrelationId; var cfg = context?.GetRequestConfiguration(); timeoutTsc.TrySetException(new TimeoutException($"The request '{correlationId}' with routing key '{cfg?.Request.RoutingKey}' timed out after {timeout:g}.")); }); var pipeTask = Next .InvokeAsync(context, ctc.Token) .ContinueWith(t => { if (!ctc.IsCancellationRequested) { timeoutTsc.TrySetResult(true); } return(t); }, token) .Unwrap(); await timeoutTsc.Task; await pipeTask; ctc.Dispose(); }
public static ConsumerConfiguration GetResponseConfiguration(this IPipeContext context) { return(context.GetRequestConfiguration()?.Response); }
public static ExchangeDeclaration GetResponseExchange(this IPipeContext context) { return(context.GetRequestConfiguration()?.Response.Exchange); }
public static QueueDeclaration GetResponseQueue(this IPipeContext context) { return(context.GetRequestConfiguration()?.Response.Queue); }