feat(aihitLoader): добавлено зона "ОБЩЕЕ", данные отправляются сразу в очередь после получения от хп, чтобы не копить в памяти данные.
This commit is contained in:
@@ -55,37 +55,9 @@ namespace PARR.AIHITMainLoader
|
||||
using (var scope = serviceProvider.CreateScope())
|
||||
{
|
||||
var aihitService = scope.ServiceProvider.GetRequiredService<IAihitService>();
|
||||
|
||||
var services = GetServices(aihitService);
|
||||
|
||||
var listToMq = new List<AihitMainDataMq>();
|
||||
|
||||
|
||||
foreach (var service in services)
|
||||
{
|
||||
foreach (var responseArea in loaderSettings.ResponseAreas)
|
||||
{
|
||||
logger.LogDebug($"responseArea = {responseArea}");
|
||||
var EKs = service.Invoke(responseArea);
|
||||
|
||||
if (EKs?.Any() == true)
|
||||
{
|
||||
foreach (var item in EKs)
|
||||
{
|
||||
if (item != null)
|
||||
{
|
||||
var mainData = item.ToMainData();
|
||||
if (mainData != null)
|
||||
listToMq.Add(mainData);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var preparedDataList = listToMq.Select(d => JsonSerializer.Serialize(d)).ToList();
|
||||
|
||||
int count = preparedDataList.Count;
|
||||
var currentBatch = new List<string>();
|
||||
int packageSize = loaderSettings.PackageSize;
|
||||
|
||||
if (packageSize <= 0)
|
||||
@@ -94,21 +66,39 @@ namespace PARR.AIHITMainLoader
|
||||
return;
|
||||
}
|
||||
|
||||
var parts = count == 0 ? 0 : (count + packageSize - 1) / packageSize;
|
||||
|
||||
for (var i = 0; i < parts; i++)
|
||||
foreach (var service in services)
|
||||
{
|
||||
int start = i * packageSize;
|
||||
int length = Math.Min(packageSize, count - start);
|
||||
var batch = preparedDataList.GetRange(start, length).ToArray();
|
||||
var sendResult = await mqService.SendAsync(mqSettings, batch);
|
||||
if (sendResult.IsSuccess)
|
||||
foreach (var responseArea in loaderSettings.ResponseAreas)
|
||||
{
|
||||
logger.LogInformation($"Данные переданы в RabbitMQ: {batch.Count()}");
|
||||
logger.LogDebug($"Отправлено сообщений: {batch.Count()}, пример первого: {batch.FirstOrDefault()?.Substring(0, Math.Min(200, batch.FirstOrDefault()?.Length ?? 0))}...");
|
||||
logger.LogDebug($"responseArea = {responseArea}");
|
||||
var EKs = service.Invoke(responseArea);
|
||||
|
||||
if (EKs?.Any() != true) continue;
|
||||
|
||||
foreach (var item in EKs)
|
||||
{
|
||||
if (item == null) continue;
|
||||
|
||||
var mainData = item.ToMainData();
|
||||
if (mainData == null) continue;
|
||||
|
||||
var json = JsonSerializer.Serialize(mainData);
|
||||
currentBatch.Add(json);
|
||||
|
||||
// Отправка, если набрали полный пакет
|
||||
if (currentBatch.Count >= packageSize)
|
||||
{
|
||||
await SendBatchAsync(currentBatch);
|
||||
currentBatch.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
logger.LogError($"Ошибка при передаче данных в Rabbit, не переданные сообщения: {string.Join(", ", sendResult.NotSendMessages!)}");
|
||||
}
|
||||
|
||||
// Отправка остатка
|
||||
if (currentBatch.Count > 0)
|
||||
{
|
||||
await SendBatchAsync(currentBatch);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -118,6 +108,20 @@ namespace PARR.AIHITMainLoader
|
||||
}
|
||||
}
|
||||
|
||||
private async Task SendBatchAsync(List<string> batch)
|
||||
{
|
||||
var sendResult = await mqService.SendAsync(mqSettings, batch.ToArray());
|
||||
if (sendResult.IsSuccess)
|
||||
{
|
||||
logger.LogInformation($"Данные переданы в RabbitMQ: {batch.Count}");
|
||||
logger.LogDebug($"Отправлено сообщений: {batch.Count}, пример первого: {batch.FirstOrDefault()?.Substring(0, Math.Min(200, batch.FirstOrDefault()?.Length ?? 0))}...");
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.LogError($"Ошибка при передаче данных в RabbitMQ. Не переданные сообщения: {string.Join(", ", sendResult.NotSendMessages!)}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private List<Func<string, IEnumerable<IMainData>?>> GetServices(IAihitService service)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user