สิ่งที่แก้ไข:

autoAck: false - ไม่ ack อัตโนมัติ ต้องรอ process เสร็จก่อน
Manual Ack/Nack:
BasicAck เมื่อ API return success
BasicNack (reject) เมื่อ API return error (401, 500, etc.) หรือ exception
CallRestApi return bool - บอกว่าสำเร็จหรือล้มเหลว
Better logging - แสดง status code และ error message ชัดเจนขึ้น
ตอนนี้เมื่อ API return 401 หรือ error อื่น:

จะ log error พร้อม status code
Message จะถูก reject (ไม่ requeue)
Consumer จะทำงานต่อรับ message ถัดไปเลย (ไม่ค้าง)
This commit is contained in:
Suphonchai Phoonsawat 2026-04-30 22:02:59 +07:00
parent 4e2113eef2
commit fb3cb2aa94

View file

@ -45,17 +45,29 @@ consumer.Received += async (model, ea) =>
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
//WriteToConsole($"ได้รับคำขอจาก Queue: {message}");
WriteToConsole($"Received message: {message}");
await CallRestApi(message, httpClient, configuration);
var success = await CallRestApi(message, httpClient, configuration);
if (success)
{
channel.BasicAck(ea.DeliveryTag, multiple: false);
WriteToConsole("Message processed successfully");
}
else
{
channel.BasicNack(ea.DeliveryTag, multiple: false, requeue: false);
WriteToConsole("Message processing failed - message rejected");
}
}
catch (Exception ex)
{
WriteToConsole($"Error processing message: {ex.Message}");
channel.BasicNack(ea.DeliveryTag, multiple: false, requeue: false);
}
};
channel.BasicConsume(queue: queue, autoAck: true, consumer: consumer);
channel.BasicConsume(queue: queue, autoAck: false, consumer: consumer);
WriteToConsole("Consumer started. Waiting for messages...");
@ -67,7 +79,7 @@ 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)
static async Task<bool> CallRestApi(string requestData, HttpClient client, IConfiguration configuration)
{
try
{
@ -79,26 +91,31 @@ static async Task CallRestApi(string requestData, HttpClient client, IConfigurat
if (response.IsSuccessStatusCode)
{
var responseContent = await response.Content.ReadAsStringAsync();
//WriteToConsole($"Success: {responseContent}");
WriteToConsole($"API Success: {responseContent}");
return true;
}
else
{
var errorMessage = await response.Content.ReadAsStringAsync();
var res = JsonSerializer.Deserialize<ResponseObject>(errorMessage);
WriteToConsole($"API Error: {res?.Message ?? "Unknown error"}");
WriteToConsole($"API Error ({response.StatusCode}): {res?.Message ?? errorMessage}");
return false;
}
}
catch (HttpRequestException ex)
{
WriteToConsole($"HTTP Error: {ex.Message}");
return false;
}
catch (TaskCanceledException ex)
{
WriteToConsole($"Timeout: {ex.Message}");
return false;
}
catch (Exception ex)
{
WriteToConsole($"Unexpected Error: {ex.Message}");
return false;
}
}