Ejemplo n.º 1
0
 public DmsEventProjection(IConnection connection, IDocumentService documentService, IDispatchCommits dispatcher, ILog logger, ITranslationService translationService)
 {
     _documentService    = documentService;
     _dispatcher         = dispatcher;
     _translationService = translationService;
     _logger             = logger;
     _consumer           = new RabbitMqSubscription(connection, "Cev-Exchange", logger);
     _consumer
     .WithAppName("dms-projection")
     .WithEvent <CreateDocumentPartEvent>(Handle);
 }
        private async Task ExecuteAsync(RabbitMqSubscription subscription, CancellationToken cancellationToken)
        {
            using (var connection = await _connectionFactory.CreateConnectionAsync(cancellationToken))
            {
                var underlyingConnection = connection.UnderlyingConnection;
                var channel  = underlyingConnection.CreateModel();
                var consumer = new AsyncEventingBasicConsumer(channel);
                channel.BasicConsume(consumer: consumer, queue: subscription.Name, autoAck: false);

                while (!cancellationToken.IsCancellationRequested)
                {
                    try
                    {
                        var message = await ReceiveAsync(consumer);

                        try
                        {
                            await OnReceiveAsync(message, cancellationToken).ConfigureAwait(false);

                            channel.BasicAck(message.DeliveryTag, multiple: false);
                        }
                        catch (Exception ex)
                        {
                            _logger.LogError(ex, $"Error: RabbitMQ Message Receiver error, could not consume message '{message.DeliveryTag}'");

                            channel.BasicNack(message.DeliveryTag, multiple: false, requeue: true);

                            await OnErrorAsync(message, ex).ConfigureAwait(false);
                        }
                    }
                    catch (Exception ex)
                    {
                        _logger.LogError(ex, $"Unexpected receiver error: {ex.Message}");
                        throw;
                    }
                }
                foreach (var tag in consumer.ConsumerTags)
                {
                    channel.BasicCancel(tag);
                }
            }
        }