Я использую две идентичные фоновые службы, их единственная задача — извлекать данные из подсистемы Azure и отправлять их в API. Я вставляю один ниже для другого, меняется только имя и значения для apiUrl, _topicName и _subscriptionName.
public class WhatsAppService : BackgroundService
{
private string _apiUrl = "";
private readonly AzureServiceBusConnection _azureServiceBusConnection;
private readonly WhatsAppSettings _whatsappsettings;
private ServiceBusClient _client;
private string _topicName = "";
private string _subscriptionName = "";
private readonly SemaphoreSlim _throttle;
public WhatsAppService(IOptions azureServiceBusConnection, IOptions whatsappsettings)
{
_throttle = new SemaphoreSlim(10); // Allows up to 10 concurrent requests
_azureServiceBusConnection = azureServiceBusConnection.Value;
_whatsappsettings = whatsappsettings.Value;
_apiUrl = _whatsappsettings.ApiUrl;
_topicName = _whatsappsettings.TopicName;
_subscriptionName = _whatsappsettings.SubscriptionName;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_client = new ServiceBusClient(_azureServiceBusConnection.ConnectionString);
var sessionTasks = new List(); // List to track session processing tasks
while (!stoppingToken.IsCancellationRequested)
{
try
{
ServiceBusSessionReceiver sessionReceiver = null;
try
{
sessionReceiver = await _client.AcceptNextSessionAsync(_topicName, _subscriptionName);
}
catch (Exception ex)
{
Console.WriteLine($"Error accepting session: {ex.Message}");
await Task.Delay(5000, stoppingToken); // Wait before retrying
continue; // Retry accepting the next session
}
if (sessionReceiver != null)
{
// Start processing messages for this session in a new task
var task = Task.Run(async () =>
{
Console.WriteLine($"Processing messages for session: {sessionReceiver.SessionId}");
while (true)
{
ServiceBusReceivedMessage message = await sessionReceiver.ReceiveMessageAsync(TimeSpan.FromSeconds(10));
if (message == null)
{
Console.WriteLine("No more messages in this session.");
break; // Exit the inner loop if no more messages are available
}
var messageBody = Encoding.UTF8.GetString(message.Body);
Console.WriteLine($"Received message: {messageBody}");
var success = await SendDataToApiAsync(messageBody);
if (!success)
{
await sessionReceiver.AbandonMessageAsync(message);
}
else
{
await sessionReceiver.CompleteMessageAsync(message);
}
}
await sessionReceiver.CloseAsync();
});
sessionTasks.Add(task); // Track the task for this session
}
else
{
Console.WriteLine("No sessions available to process.");
}
// Clean up completed tasks to avoid memory leaks
sessionTasks.RemoveAll(t => t.IsCompleted);
await Task.Delay(1000, stoppingToken); // Wait before checking for the next session
}
catch (Exception ex)
{
Console.WriteLine($"Error occurred: {ex.Message}");
}
}
}
private async Task SendDataToApiAsync(string message)
{
await _throttle.WaitAsync(); // Wait to enter the semaphore
try
{
using var httpClient = new HttpClient();
var content = new StringContent(message, Encoding.UTF8, "application/json");
try
{
var response = await httpClient.PostAsync(_apiUrl, content);
return response.IsSuccessStatusCode;
}
catch (HttpRequestException e)
{
Console.WriteLine($"HTTP Request failed: {e.Message}");
return false; // Log and handle HTTP request errors appropriately
}
}
finally
{
_throttle.Release(); // Ensure semaphore is always released
}
}
}
Какая может быть возможная причина этого? Я знаю, что могу объединить их оба в один, но опять же хочу знать, что-то не так с текущим потоком или с его просто ресурсами?
Спасибо
Я использую две идентичные фоновые службы, их единственная задача — извлекать данные из подсистемы Azure и отправлять их в API. Я вставляю один ниже для другого, меняется только имя и значения для apiUrl, _topicName и _subscriptionName. [code]Startup.cs[/code] [code]services.AddHostedService(); services.AddHostedService(); // As soon as added the site starts throwing timeout even though nothing is on azure sub. [/code] Класс обслуживания: [code]public class WhatsAppService : BackgroundService { private string _apiUrl = ""; private readonly AzureServiceBusConnection _azureServiceBusConnection; private readonly WhatsAppSettings _whatsappsettings; private ServiceBusClient _client; private string _topicName = ""; private string _subscriptionName = ""; private readonly SemaphoreSlim _throttle;
public WhatsAppService(IOptions azureServiceBusConnection, IOptions whatsappsettings) { _throttle = new SemaphoreSlim(10); // Allows up to 10 concurrent requests
protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _client = new ServiceBusClient(_azureServiceBusConnection.ConnectionString); var sessionTasks = new List(); // List to track session processing tasks
while (!stoppingToken.IsCancellationRequested) { try { ServiceBusSessionReceiver sessionReceiver = null;
if (sessionReceiver != null) { // Start processing messages for this session in a new task var task = Task.Run(async () => { Console.WriteLine($"Processing messages for session: {sessionReceiver.SessionId}");
while (true) { ServiceBusReceivedMessage message = await sessionReceiver.ReceiveMessageAsync(TimeSpan.FromSeconds(10));
if (message == null) { Console.WriteLine("No more messages in this session."); break; // Exit the inner loop if no more messages are available }
var messageBody = Encoding.UTF8.GetString(message.Body); Console.WriteLine($"Received message: {messageBody}");
var success = await SendDataToApiAsync(messageBody); if (!success) { await sessionReceiver.AbandonMessageAsync(message); } else { await sessionReceiver.CompleteMessageAsync(message); } }
await sessionReceiver.CloseAsync(); });
sessionTasks.Add(task); // Track the task for this session } else { Console.WriteLine("No sessions available to process."); }
// Clean up completed tasks to avoid memory leaks sessionTasks.RemoveAll(t => t.IsCompleted);
await Task.Delay(1000, stoppingToken); // Wait before checking for the next session } catch (Exception ex) { Console.WriteLine($"Error occurred: {ex.Message}"); } } }
private async Task SendDataToApiAsync(string message) { await _throttle.WaitAsync(); // Wait to enter the semaphore try { using var httpClient = new HttpClient(); var content = new StringContent(message, Encoding.UTF8, "application/json");
try { var response = await httpClient.PostAsync(_apiUrl, content); return response.IsSuccessStatusCode; } catch (HttpRequestException e) { Console.WriteLine($"HTTP Request failed: {e.Message}"); return false; // Log and handle HTTP request errors appropriately } } finally { _throttle.Release(); // Ensure semaphore is always released } } } [/code] Какая может быть возможная причина этого? Я знаю, что могу объединить их оба в один, но опять же хочу знать, что-то не так с текущим потоком или с его просто ресурсами? Спасибо
Я использую две идентичные фоновые службы, их единственная задача — извлекать данные из подсистемы Azure и отправлять их в API. Я вставляю один ниже для другого, меняется только имя и значения для apiUrl, _topicName и _subscriptionName.
Startup.cs...
Мы столкнулись с проблемой при попытке добавить новую службу из каталога служб. Появляется следующая ошибка:
ОШИБКА {org.wso2.micro.integrator.initializer.utils.ServiceCatalogUtils} — произошла ошибка при извлечении сервисов из каталога сервисов....
У меня есть код, который выполняет отчет каждую ночь в полночь. У меня есть еще один отчет, который мне также нужно составлять в начале каждого месяца. Можно ли совместно использовать эту фоновую службу для одновременного запуска обеих? Мой код на...
У меня есть код, который выполняет отчет каждую ночь в полночь. У меня есть еще один отчет, который мне также нужно составлять в начале каждого месяца. Можно ли совместно использовать эту фоновую службу для одновременного запуска обеих? Мой код на...