using Birdmap.BLL.Interfaces; using Birdmap.BLL.Options; using Birdmap.BLL.Services.CommunicationServices.Hubs; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Logging; using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Text; using System.Threading.Tasks; namespace Birdmap.BLL.Services.CommunationServices.RabbitMq { internal class RabbitMqClientService : CommunicationServiceBase, IDisposable { private readonly IConnection _connection; private readonly IModel _channel; public override bool IsConnected => throw new NotImplementedException(); public RabbitMqClientService(RabbitMqClientOptions options, ILogger logger, IInputService inputService, IHubContext hubContext) : base(logger, inputService, hubContext) { var factory = new ConnectionFactory() { HostName = options.Hostname, Port = options.Port, UserName = options.Username, Password = options.Password, 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) { var props = eventArgs.BasicProperties; var body = Encoding.UTF8.GetString(eventArgs.Body.ToArray()); _logger.LogDebug($"Recieved [{props.UserId}] " + $"ConsumerTag: {eventArgs.ConsumerTag} | DeliveryTag: {eventArgs.DeliveryTag} | Payload: {body} | Priority: {props.Priority}"); return ProcessJsonMessageAsync(body); } public void Dispose() { StopMessageTimer(); _channel.Close(); _connection.Close(); } } }