worker чтение ESPPTemplates переведено на очередь MQ

This commit is contained in:
Mikhail Kuznetsov
2023-09-01 11:47:39 +10:00
parent 7ec51c7c98
commit d6f1752465
10 changed files with 122 additions and 14 deletions

View File

@@ -6,6 +6,10 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="RabbitMQ.Client" Version="6.5.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\PARR.BLL\PARR.BLL.csproj" />
<ProjectReference Include="..\PARR.DAL\PARR.DAL.csproj" />

View File

@@ -1,15 +1,29 @@
namespace PARR.EsppTemplateSync.Services
using Microsoft.Extensions.Logging;
namespace PARR.EsppTemplateSync.Services
{
internal class Manager : IManager
{
private readonly ILogger<Manager> logger;
private readonly IParserService parserService;
public Manager(ILogger<Manager> logger, IParserService parserService)
{
this.logger = logger;
this.parserService = parserService;
}
public Task<bool> ManageFileAsync(string path)
{
throw new NotImplementedException();
}
public Task<bool> ManageStringAsync(string str)
public async Task<bool> ManageStringAsync(string str)
{
throw new NotImplementedException();
bool isSuccess = true;
//TOD if (str == null || str.Length <= 2)
//var await parserService.ParseStringAsync(str);
return isSuccess;
}
}
}

View File

@@ -1,7 +1,15 @@
namespace PARR.EsppTemplateSync.Services
using Microsoft.Extensions.Logging;
namespace PARR.EsppTemplateSync.Services
{
internal class ParserService : IParserService
{
private readonly ILogger<ParserService> logger;
public ParserService(ILogger<ParserService> logger)
{
this.logger = logger;
}
public async Task<bool> ParseFileAsync(string path)
{
//TODO:
@@ -15,6 +23,10 @@
public async Task<bool> ParseStringAsync(string str)
{
//TODO:
var splittedContent = str.Split(";");
var ek = splittedContent[0].Trim().Substring(1, splittedContent[0].Length - 2);
var isActive = splittedContent[1].Trim().Substring(1, splittedContent[1].Length - 2);
logger.LogInformation($"Получено сообщение: {ek}");
bool isSuccess = true;

View File

@@ -9,7 +9,11 @@
internal class MqSettings
{
public string? HostName { get; set; }
public string? QueueName { get; set; }
public string? UserName { get; set; }
public string? Password { get; set; }
public int CheckIntervalSeconds { get; set; } = 30;
}
internal class StorageSettings

View File

@@ -1,6 +1,5 @@
using Microsoft.Extensions.Logging;
using PARR.BLL.Services.Interfaces;
using PARR.BLL.Settings;
using PARR.EsppTemplateSync.Services;
using PARR.EsppTemplateSync.Settings;

View File

@@ -1,21 +1,88 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Logging;
using PARR.EsppTemplateSync.Services;
using PARR.EsppTemplateSync.Settings;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;
using System.Threading.Tasks;
namespace PARR.EsppTemplateSync
{
internal class TemplateMQSyncer : ITemplateSyncer
{
private readonly ILogger<TemplateMQSyncer> logger;
private readonly IManager manager;
private readonly GlobalSettings globalSettings;
private IConnection connection;
private RabbitMQ.Client.IModel channel;
public TemplateMQSyncer(
ILogger<TemplateMQSyncer> logger,
IManager manager,
GlobalSettings globalSettings
)
{
this.logger = logger;
this.manager = manager;
this.globalSettings = globalSettings;
if (globalSettings.MqSettings == null)
{
logger.LogError("Нет секции настроек хранилища. MqSettings, EsppTemplates");
throw new Exception("Нет секции настроек хранилища. MqSettings, EsppTemplates");
}
var factory = new ConnectionFactory { HostName = globalSettings.MqSettings.HostName };
factory.UserName = globalSettings.MqSettings.UserName;
factory.Password = globalSettings.MqSettings.Password;
factory.AutomaticRecoveryEnabled = true;
factory.DispatchConsumersAsync = true;
connection = factory.CreateConnection();
channel = connection.CreateModel();
Dictionary<String, Object> args = new Dictionary<String, Object>();
args.Add("x-queue-mode", "lazy");
channel.QueueDeclare(queue: globalSettings.MqSettings.QueueName,
durable: true,
exclusive: false,
autoDelete: false,
arguments: args);
}
public async Task StartAsync()
{
// throw new NotImplementedException();
logger.LogInformation($"Запущена проверка очереди {globalSettings.MqSettings!.QueueName}. Интервал: {globalSettings.MqSettings!.CheckIntervalSeconds} секунд.");
CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
CancellationToken token = cancelTokenSource.Token;
Task task = new Task(() => { GetMessages(); }, token);
task.Start();
await task.WaitAsync(token);
}
private void GetMessages()
{
var consumer = new AsyncEventingBasicConsumer(channel);
consumer.Received += async (ch, ea) =>
{
var content = Encoding.UTF8.GetString(ea.Body.ToArray());
// Обрабатываем полученное сообщение
await manager.ManageStringAsync(content);
channel.BasicAck(ea.DeliveryTag, false);
await Task.Yield();
};
channel.BasicConsume(globalSettings.MqSettings!.QueueName, false, consumer);
}
public void Stop()
{
//throw new NotImplementedException();
}
channel.Close();
connection.Close();
logger.LogInformation($"=== === === Соединение с очередью {globalSettings.MqSettings!.QueueName} закрыто === === ===");
}
}
}

View File

@@ -15,8 +15,10 @@ namespace PARR.EsppTemplateSyncWorker
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await templateSyncer.StartAsync();
//while (!stoppingToken.IsCancellationRequested)
//{
// _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);

View File

@@ -33,6 +33,11 @@
},
"GlobalSettings": {
"MqSettings": {
"HostName": "10.99.253.216",
"QueueName": "parr-espp-templates",
"UserName": "rmuser",
"Password": "rmpassword",
"CheckIntervalSeconds": 30
},
"StorageSettings": {

View File

@@ -31,7 +31,7 @@ using (var channel = connection.CreateModel())
//Говорим менеджеру RabbitMq при получении хранить сообщения на диске
props.DeliveryMode = 2;
//время жизни в мс. на этапе отладки сделаем коротким чтобы не устраивать помойку
props.Expiration = "6000";
props.Expiration = "60000";
channel.BasicPublish(exchange: "",
routingKey: "parr-espp-templates",//совпадает с именем очереди иначе не принимает

View File

@@ -12,6 +12,7 @@
- PARR.EsppTemplateSyncWorker - worker для PARR.EsppTemplateSync
- PARR.Mail - сервис по работе с почтой
- PARR.Worker - worker для PARR.AIHIT
- PARR.MockData - загрузка тестовых данных
## CICD