using Microsoft.Extensions.Configuration; using RabbitMQ.Client; using RabbitMQ.Client.Events; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; var basePath = Directory.GetCurrentDirectory(); var configuration = new ConfigurationBuilder() .SetBasePath(basePath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); WriteToConsole("Consumer Start!"); var host = configuration["Rabbit:Host"] ?? ""; var user = configuration["Rabbit:User"] ?? ""; var pass = configuration["Rabbit:Password"] ?? ""; var queue = configuration["Rabbit:Queue"] ?? "basic-queue"; // create connection var factory = new ConnectionFactory() { HostName = host, UserName = user, Password = pass, DispatchConsumersAsync = true }; using var connection = factory.CreateConnection(); using var channel = connection.CreateModel(); channel.QueueDeclare(queue: queue, durable: true, exclusive: false, autoDelete: false, arguments: null); // Create a SINGLE static HttpClient instance to prevent socket exhaustion using var httpClient = new HttpClient(); httpClient.Timeout = TimeSpan.FromSeconds(300); // 5 นาที var consumer = new EventingBasicConsumer(channel); consumer.Received += async (model, ea) => { try { var body = ea.Body.ToArray(); var message = Encoding.UTF8.GetString(body); //WriteToConsole($"ได้รับคำขอจาก Queue: {message}"); await CallRestApi(message, httpClient, configuration); } catch (Exception ex) { WriteToConsole($"Error processing message: {ex.Message}"); } }; channel.BasicConsume(queue: queue, autoAck: true, consumer: consumer); WriteToConsole("Consumer started. Waiting for messages..."); // Keep the application running await Task.Delay(-1); static void WriteToConsole(string message) { Console.WriteLine($"{DateTime.Now:yyyy-MM-dd HH:mm:ss} : {message}"); } static async Task CallRestApi(string requestData, HttpClient client, IConfiguration configuration) { try { var apiPath = $"{configuration["API"]}/leave/process-check-in"; var content = new StringContent(requestData, Encoding.UTF8, "application/json"); var response = await client.PostAsync(apiPath, content); if (response.IsSuccessStatusCode) { var responseContent = await response.Content.ReadAsStringAsync(); //WriteToConsole($"Success: {responseContent}"); } else { var errorMessage = await response.Content.ReadAsStringAsync(); var res = JsonSerializer.Deserialize(errorMessage); WriteToConsole($"API Error: {res?.Message ?? "Unknown error"}"); } } catch (HttpRequestException ex) { WriteToConsole($"HTTP Error: {ex.Message}"); } catch (TaskCanceledException ex) { WriteToConsole($"Timeout: {ex.Message}"); } catch (Exception ex) { WriteToConsole($"Unexpected Error: {ex.Message}"); } } public class ResponseObject { [JsonPropertyName("status")] public int Status { get; set; } [JsonPropertyName("message")] public string? Message { get; set; } [JsonPropertyName("result")] public object? Result { get; set; } } public class CheckTimeDtoRB { public Guid? CheckInId { get; set; } public double Lat { get; set; } = 0; public double Lon { get; set; } = 0; public string POI { get; set; } = string.Empty; public bool IsLocation { get; set; } = true; public string? LocationName { get; set; } = string.Empty; public string? Remark { get; set; } = string.Empty; public Guid? UserId { get; set; } public DateTime? CurrentDate { get; set; } public string? CheckInFileName { get; set; } public byte[]? CheckInFileBytes { get; set; } }