Beispiel #1
0
        public override Task HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey,
                                                IBasicProperties properties, byte[] body)
        {
            var @event = new BasicDeliverEventArgs(consumerTag, deliveryTag, redelivered, exchange, routingKey, properties, body);

            try
            {
                var task = new Task(() =>
                {
                    try
                    {
                        var message = Message <T> .Create(_channel, _options.Exchange, _options.Queue, RoutingKey.Create(routingKey), _options.Serializer, @event,
                                                          (OnDone, OnFail));
                        using var scope = _scopeFactory.CreateScope();
                        try
                        {
                            _options.OnNext(scope, message).GetAwaiter().GetResult();
                            if (_options.AutoAck)
                            {
                                message.Complete();
                            }
                        }
                        catch (Exception exception)
                        {
                            message.Fail(exception);
                        }
                    }
                    catch (Exception exception)
                    {
                        _logger?.WriteException(nameof(Consumer <T>), exception,
                                                new KeyValuePair <string, object>("Event", Encoding.UTF8.GetString(@event.Body)));
                        var failedQueue      = _options.Queue.CreateFailedQueue();
                        var failedRoutingKey = RoutingKey.Create(failedQueue.Name.Value);
                        _connection.Publish(Exchange.Default, failedQueue, failedRoutingKey,
                                            ErrorMessage.Create(@event.Body, @event.BasicProperties));
                        _channel.BasicNack(@event.DeliveryTag, false, false);
                    }
                });
                _tasks.Add(task);
            }
            catch (Exception ex)
            {
                _logger?.WriteException(typeof(T).Name, ex,
                                        new KeyValuePair <string, object>("args", @event));
                _channel.BasicNack(@event.DeliveryTag, false, true);
            }

            return(Task.CompletedTask);
        }