สิ่งที่แก้ไข:
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:
parent
4e2113eef2
commit
fb3cb2aa94
1 changed files with 23 additions and 6 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue