private Task ContinueTaskQueue(Task task, BasicMessage message, TKey key, TValue item) { return(task.ContinueWith(async t => { if (!t.IsCompletedSuccessfully) { message.Nack(); throw new Exception($"Processing chain aborted for {key}"); } try { await ProcessAsync(item); message.Ack(); } catch (Exception e) { _logger.LogError(e, $"Couldn't process: {e.Message} key: {key} tag: ({message.DeliveryTag})"); if (e is AggregateException agg) { foreach (var ex in agg.InnerExceptions) { _logger.LogError(ex, ex.Message); } } message.ErrorAction(); throw; } }).Unwrap()); }
private void ReceiveEvent(object sender, BasicDeliverEventArgs args) { var channel = (sender as EventingBasicConsumer)?.Model; if (channel == null) { throw new ArgumentNullException(nameof(sender), "Model null in received consumer event."); } var message = new BasicMessage(args, channel, _queueServiceParams.QueueName, () => OnError(sender, args)); try { if (_handler.Process(message)) { message.Ack(); } _retryCount = 0; } catch (Exception ex) { // error processing message _logger.LogError(ex, $"{ex.Message} -> {args.DeliveryTag}: {args.BasicProperties.MessageId}"); message?.ErrorAction?.Invoke(); } }