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