using Blueprint.Core.Interfaces.SPI; using RabbitMQ.Client; using RabbitMQ.Client.Exceptions; using System.Text; namespace Blueprint.Infra.Services { public class RabbitMqService : IRabbitMqService { private readonly IConfiguration _configuration; private IConnection? _connection; private IChannel? _channel; public RabbitMqService(IConfiguration configuration) { InitializeAsync().GetAwaiter().GetResult(); _configuration = configuration; } private async Task InitializeAsync() { try { var rabbitMqConfig = _configuration.GetSection("RabbitMQ"); var factory = new ConnectionFactory { HostName = rabbitMqConfig["HostName"]!, UserName = rabbitMqConfig["UserName"]!, Password = rabbitMqConfig["Password"]! }; // Use the asynchronous method to create the connection _connection = await factory.CreateConnectionAsync(); // Create a channel for communication _channel = await _connection.CreateChannelAsync(); } catch (BrokerUnreachableException ex) { Console.WriteLine($"Producer warning: {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"Unexpected error: {ex.Message}"); } } public void PublishMessage(string queueName, string message) { _channel?.QueueDeclareAsync(queue: queueName, durable: true, exclusive: false, autoDelete: false, arguments: null); var body = Encoding.UTF8.GetBytes(message); _channel?.BasicPublishAsync(exchange: "", routingKey: queueName, body: body); } } }