Moved Dockerfile, fixed RabbitMq connection fail in constructor
This commit is contained in:
		@@ -6,6 +6,7 @@ using Newtonsoft.Json;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Timer = System.Timers.Timer;
 | 
			
		||||
 | 
			
		||||
@@ -83,5 +84,9 @@ namespace Birdmap.BLL.Services.CommunationServices
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public abstract Task StartAsync(CancellationToken cancellationToken);
 | 
			
		||||
 | 
			
		||||
        public abstract Task StopAsync(CancellationToken cancellationToken);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -81,7 +81,7 @@ namespace Birdmap.BLL.Services.CommunicationServices.Mqtt
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task StartAsync(CancellationToken cancellationToken)
 | 
			
		||||
        public override async Task StartAsync(CancellationToken cancellationToken)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
@@ -97,7 +97,7 @@ namespace Birdmap.BLL.Services.CommunicationServices.Mqtt
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public async Task StopAsync(CancellationToken cancellationToken)
 | 
			
		||||
        public override async Task StopAsync(CancellationToken cancellationToken)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -7,21 +7,25 @@ using RabbitMQ.Client;
 | 
			
		||||
using RabbitMQ.Client.Events;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
 | 
			
		||||
namespace Birdmap.BLL.Services.CommunationServices.RabbitMq
 | 
			
		||||
{
 | 
			
		||||
    internal class RabbitMqClientService : CommunicationServiceBase, IDisposable
 | 
			
		||||
    internal class RabbitMqClientService : CommunicationServiceBase
 | 
			
		||||
    {
 | 
			
		||||
        private readonly IConnection _connection;
 | 
			
		||||
        private readonly IModel _channel;
 | 
			
		||||
        private IConnection _connection;
 | 
			
		||||
        private IModel _channel;
 | 
			
		||||
        private readonly IConnectionFactory _factory;
 | 
			
		||||
        private readonly string _topic;
 | 
			
		||||
 | 
			
		||||
        public override bool IsConnected => throw new NotImplementedException();
 | 
			
		||||
 | 
			
		||||
        public RabbitMqClientService(RabbitMqClientOptions options, ILogger<RabbitMqClientService> logger, IInputService inputService, IHubContext<DevicesHub, IDevicesHubClient> hubContext)
 | 
			
		||||
            : base(logger, inputService, hubContext)
 | 
			
		||||
        {
 | 
			
		||||
            var factory = new ConnectionFactory()
 | 
			
		||||
            _topic = options.Topic;
 | 
			
		||||
            _factory = new ConnectionFactory()
 | 
			
		||||
            {
 | 
			
		||||
                HostName = options.Hostname,
 | 
			
		||||
                Port = options.Port,
 | 
			
		||||
@@ -30,25 +34,6 @@ namespace Birdmap.BLL.Services.CommunationServices.RabbitMq
 | 
			
		||||
 | 
			
		||||
                AutomaticRecoveryEnabled = true,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            _connection = factory.CreateConnection();
 | 
			
		||||
            _channel = _connection.CreateModel();
 | 
			
		||||
 | 
			
		||||
            _channel.ExchangeDeclare(exchange: "topic_logs", type: "topic");
 | 
			
		||||
            var queueName = _channel.QueueDeclare().QueueName;
 | 
			
		||||
 | 
			
		||||
            _channel.QueueBind(queue: queueName,
 | 
			
		||||
                                  exchange: "topic_logs",
 | 
			
		||||
                                  routingKey: options.Topic);
 | 
			
		||||
 | 
			
		||||
            var consumer = new AsyncEventingBasicConsumer(_channel);
 | 
			
		||||
            consumer.Received += OnRecieved;
 | 
			
		||||
 | 
			
		||||
            _channel.BasicConsume(queue: queueName,
 | 
			
		||||
                                 autoAck: true,
 | 
			
		||||
                                 consumer: consumer);
 | 
			
		||||
 | 
			
		||||
            StartMessageTimer();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private Task OnRecieved(object sender, BasicDeliverEventArgs eventArgs)
 | 
			
		||||
@@ -62,11 +47,59 @@ namespace Birdmap.BLL.Services.CommunationServices.RabbitMq
 | 
			
		||||
            return ProcessJsonMessageAsync(body);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void Dispose()
 | 
			
		||||
        public override async Task StartAsync(CancellationToken cancellationToken)
 | 
			
		||||
        {
 | 
			
		||||
            StopMessageTimer();
 | 
			
		||||
            _channel.Close();
 | 
			
		||||
            _connection.Close();
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                Connect();
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                _logger.LogError(ex, $"Cannot connect. Reconnecting...");
 | 
			
		||||
                await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);
 | 
			
		||||
 | 
			
		||||
                cancellationToken.ThrowIfCancellationRequested();
 | 
			
		||||
                await StartAsync(cancellationToken);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override Task StopAsync(CancellationToken cancellationToken)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                StopMessageTimer();
 | 
			
		||||
                _channel?.Close();
 | 
			
		||||
                _connection?.Close();
 | 
			
		||||
                return Task.CompletedTask;
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                _logger.LogError(ex, $"Cannot disconnect...");
 | 
			
		||||
                return Task.FromException(ex);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void Connect()
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            _connection = _factory.CreateConnection();
 | 
			
		||||
            _channel = _connection.CreateModel();
 | 
			
		||||
 | 
			
		||||
            _channel.ExchangeDeclare(exchange: "topic_logs", type: "topic");
 | 
			
		||||
            var queueName = _channel.QueueDeclare().QueueName;
 | 
			
		||||
 | 
			
		||||
            _channel.QueueBind(queue: queueName,
 | 
			
		||||
                                  exchange: "topic_logs",
 | 
			
		||||
                                  routingKey: _topic);
 | 
			
		||||
 | 
			
		||||
            var consumer = new AsyncEventingBasicConsumer(_channel);
 | 
			
		||||
            consumer.Received += OnRecieved;
 | 
			
		||||
 | 
			
		||||
            _channel.BasicConsume(queue: queueName,
 | 
			
		||||
                                 autoAck: true,
 | 
			
		||||
                                 consumer: consumer);
 | 
			
		||||
 | 
			
		||||
            StartMessageTimer();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user