From d6f1752465fcd67100b300e97b4eb31c7f8d9111 Mon Sep 17 00:00:00 2001 From: Mikhail Kuznetsov Date: Fri, 1 Sep 2023 11:47:39 +1000 Subject: [PATCH] =?UTF-8?q?worker=20=D1=87=D1=82=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20ESPPTemplates=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BD=D0=B0=20=D0=BE=D1=87=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D1=8C=20MQ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PARR.EsppTemplateSync.csproj | 4 + PARR.EsppTemplateSync/Services/Manager.cs | 20 ++++- .../Services/ParserService.cs | 14 +++- .../Settings/GlobalSettings.cs | 8 +- PARR.EsppTemplateSync/TemplateFileSyncer.cs | 1 - PARR.EsppTemplateSync/TemplateMQSyncer.cs | 79 +++++++++++++++++-- PARR.EsppTemplateSyncWorker/Worker.cs | 2 + PARR.EsppTemplateSyncWorker/appsettings.json | 5 ++ PARR.MockData/Program.cs | 2 +- README.md | 1 + 10 files changed, 122 insertions(+), 14 deletions(-) diff --git a/PARR.EsppTemplateSync/PARR.EsppTemplateSync.csproj b/PARR.EsppTemplateSync/PARR.EsppTemplateSync.csproj index 21190861..8a701341 100644 --- a/PARR.EsppTemplateSync/PARR.EsppTemplateSync.csproj +++ b/PARR.EsppTemplateSync/PARR.EsppTemplateSync.csproj @@ -6,6 +6,10 @@ enable + + + + diff --git a/PARR.EsppTemplateSync/Services/Manager.cs b/PARR.EsppTemplateSync/Services/Manager.cs index 8070e9f1..3514749e 100644 --- a/PARR.EsppTemplateSync/Services/Manager.cs +++ b/PARR.EsppTemplateSync/Services/Manager.cs @@ -1,15 +1,29 @@ -namespace PARR.EsppTemplateSync.Services +using Microsoft.Extensions.Logging; + +namespace PARR.EsppTemplateSync.Services { internal class Manager : IManager { + private readonly ILogger logger; + private readonly IParserService parserService; + + public Manager(ILogger logger, IParserService parserService) + { + this.logger = logger; + this.parserService = parserService; + } public Task ManageFileAsync(string path) { throw new NotImplementedException(); } - public Task ManageStringAsync(string str) + public async Task ManageStringAsync(string str) { - throw new NotImplementedException(); + bool isSuccess = true; + //TOD if (str == null || str.Length <= 2) + //var await parserService.ParseStringAsync(str); + + return isSuccess; } } } diff --git a/PARR.EsppTemplateSync/Services/ParserService.cs b/PARR.EsppTemplateSync/Services/ParserService.cs index c1857dac..83b7f968 100644 --- a/PARR.EsppTemplateSync/Services/ParserService.cs +++ b/PARR.EsppTemplateSync/Services/ParserService.cs @@ -1,7 +1,15 @@ -namespace PARR.EsppTemplateSync.Services +using Microsoft.Extensions.Logging; + +namespace PARR.EsppTemplateSync.Services { internal class ParserService : IParserService { + private readonly ILogger logger; + + public ParserService(ILogger logger) + { + this.logger = logger; + } public async Task ParseFileAsync(string path) { //TODO: @@ -15,6 +23,10 @@ public async Task 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; diff --git a/PARR.EsppTemplateSync/Settings/GlobalSettings.cs b/PARR.EsppTemplateSync/Settings/GlobalSettings.cs index 079c41c4..2b014cae 100644 --- a/PARR.EsppTemplateSync/Settings/GlobalSettings.cs +++ b/PARR.EsppTemplateSync/Settings/GlobalSettings.cs @@ -2,14 +2,18 @@ { internal class GlobalSettings { - public MqSettings? MqSettings { get; set; } + public MqSettings? MqSettings { get; set; } public StorageSettings? StorageSettings { get; set; } } 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 diff --git a/PARR.EsppTemplateSync/TemplateFileSyncer.cs b/PARR.EsppTemplateSync/TemplateFileSyncer.cs index 235f3574..b3a3b8e2 100644 --- a/PARR.EsppTemplateSync/TemplateFileSyncer.cs +++ b/PARR.EsppTemplateSync/TemplateFileSyncer.cs @@ -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; diff --git a/PARR.EsppTemplateSync/TemplateMQSyncer.cs b/PARR.EsppTemplateSync/TemplateMQSyncer.cs index e5c04087..a0627741 100644 --- a/PARR.EsppTemplateSync/TemplateMQSyncer.cs +++ b/PARR.EsppTemplateSync/TemplateMQSyncer.cs @@ -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 logger; + private readonly IManager manager; + private readonly GlobalSettings globalSettings; + private IConnection connection; + private RabbitMQ.Client.IModel channel; + + public TemplateMQSyncer( + ILogger 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 args = new Dictionary(); + 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} закрыто === === ==="); } + } } diff --git a/PARR.EsppTemplateSyncWorker/Worker.cs b/PARR.EsppTemplateSyncWorker/Worker.cs index f1478de5..ee94aaee 100644 --- a/PARR.EsppTemplateSyncWorker/Worker.cs +++ b/PARR.EsppTemplateSyncWorker/Worker.cs @@ -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); diff --git a/PARR.EsppTemplateSyncWorker/appsettings.json b/PARR.EsppTemplateSyncWorker/appsettings.json index 3b90af05..f67d5dad 100644 --- a/PARR.EsppTemplateSyncWorker/appsettings.json +++ b/PARR.EsppTemplateSyncWorker/appsettings.json @@ -33,6 +33,11 @@ }, "GlobalSettings": { "MqSettings": { + "HostName": "10.99.253.216", + "QueueName": "parr-espp-templates", + "UserName": "rmuser", + "Password": "rmpassword", + "CheckIntervalSeconds": 30 }, "StorageSettings": { diff --git a/PARR.MockData/Program.cs b/PARR.MockData/Program.cs index 8cb5795c..16ba1116 100644 --- a/PARR.MockData/Program.cs +++ b/PARR.MockData/Program.cs @@ -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",//совпадает с именем очереди иначе не принимает diff --git a/README.md b/README.md index 753444c9..c249ac4c 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ - PARR.EsppTemplateSyncWorker - worker для PARR.EsppTemplateSync - PARR.Mail - сервис по работе с почтой - PARR.Worker - worker для PARR.AIHIT +- PARR.MockData - загрузка тестовых данных ## CICD