public AdaptationResponseConsumer(IAdaptationResponseCollection collection, IArchiveManager archiveManager, IErrorReportGenerator errorReportGenerator, IFileManager fileManager, IArchiveProcessorConfig config, ILogger <AdaptationResponseConsumer> logger)
 {
     _collection           = collection ?? throw new ArgumentNullException(nameof(collection));
     _archiveManager       = archiveManager ?? throw new ArgumentNullException(nameof(archiveManager));
     _errorReportGenerator = errorReportGenerator ?? throw new ArgumentNullException(nameof(errorReportGenerator));
     _fileManager          = fileManager ?? throw new ArgumentNullException(nameof(fileManager));
     _config = config ?? throw new ArgumentNullException(nameof(config));
     _logger = logger ?? throw new ArgumentNullException(nameof(logger));
 }
        public AdaptationRequestSender(IResponseProcessor responseProcessor, IAdaptationResponseCollection collection, ILogger <AdaptationRequestSender> logger, IArchiveProcessorConfig config)
        {
            _responseProcessor = responseProcessor ?? throw new ArgumentNullException(nameof(responseProcessor));
            _collection        = collection ?? throw new ArgumentNullException(nameof(collection));
            _logger            = logger ?? throw new ArgumentNullException(nameof(logger));

            if (config == null)
            {
                throw new ArgumentNullException(nameof(config));
            }

            var connectionFactory = new ConnectionFactory()
            {
                HostName = config.AdaptationRequestQueueHostname,
                Port     = config.AdaptationRequestQueuePort,
                UserName = config.MessageBrokerUser,
                Password = config.MessageBrokerPassword
            };

            _connection = connectionFactory.CreateConnection();
            _channel    = _connection.CreateModel();
            _consumer   = new EventingBasicConsumer(_channel);

            _channel.BasicConsume(_consumer, "amq.rabbitmq.reply-to", autoAck: true);

            _consumer.Received += (model, ea) =>
            {
                try
                {
                    _receivedMessageCount++;
                    _logger.LogInformation($"Received message: Exchange Name: '{ea.Exchange}', Routing Key: '{ea.RoutingKey}'");
                    var headers = ea.BasicProperties.Headers;
                    var body    = ea.Body.ToArray();

                    var response = _responseProcessor.Process(headers);
                    _collection.Add(response);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, $"Error Processing 'input'");
                    _collection.Add(new KeyValuePair <Guid, AdaptationOutcome>(Guid.Empty, AdaptationOutcome.Error));
                }
            };

            _logger.LogInformation($"AdaptationRequestSender Connection established to {config.AdaptationRequestQueueHostname}");
        }