private async Task MessageHandler(ProcessMessageEventArgs args) { try { _logger.LogInformation($"client '{_systemInfo.ClientId}' received message '{args.Message.MessageId}'. Processing..."); var message = _messageParser.Resolve <TM>(args.Message.Body); await _messageProcessor.ProcessAsync((dynamic)message, args.CancellationToken); await args.CompleteMessageAsync(args.Message).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, $"an error has occurred while processing message '{args.Message.MessageId}': {ex.Message}"); if (args.Message.DeliveryCount > 3) { await args.DeadLetterMessageAsync(args.Message).ConfigureAwait(false); } else { await args.AbandonMessageAsync(args.Message).ConfigureAwait(false); } } }
private async Task OnMessageReceivedAsync(object sender, BasicDeliverEventArgs eventArgs) { var consumer = sender as IBasicConsumer; var channel = consumer?.Model ?? _channel; IMessage message; try { message = _messageParser.Resolve(eventArgs.BasicProperties, eventArgs.Body); } catch (Exception ex) { _logger.LogError(ex, "an exception has occured while decoding queue message from Exchange '{ExchangeName}', message cannot be processed. Error: {ExceptionMessage}", eventArgs.Exchange, ex.Message); channel.BasicReject(eventArgs.DeliveryTag, requeue: false); return; } _logger.LogDebug("received message '{MessageId}' from Exchange '{ExchangeName}', Queue '{QueueName}'. Processing...", message.Id, _queueReferences.ExchangeName, _queueReferences.QueueName); try { //TODO: provide valid cancellation token await _messageProcessor.ProcessAsync((dynamic)message, CancellationToken.None); channel.BasicAck(eventArgs.DeliveryTag, multiple: false); } catch (Exception ex) { var errorMsg = eventArgs.Redelivered ? "a fatal error has occurred while processing Message '{MessageId}' from Exchange '{ExchangeName}' : {ExceptionMessage} . Rejecting..." : "an error has occurred while processing Message '{MessageId}' from Exchange '{ExchangeName}' : {ExceptionMessage} . Nacking..."; _logger.LogWarning(ex, errorMsg, message.Id, _queueReferences.ExchangeName, ex.Message); if (eventArgs.Redelivered) { channel.BasicReject(eventArgs.DeliveryTag, requeue: false); } else { channel.BasicNack(eventArgs.DeliveryTag, multiple: false, requeue: true); } } }