git clone https://github.com/vlados1kin/xml-parsercd xml-parserdocker-compose up --build -dПосле успешного развертывания RabbitMQ будет доступен в браузере по этому адресу. Если у вас нет Docker Desktop, то его нужно будет установить себе на локальную машину.
Выполните в терминале последовательно следующие команды.
cd .\src\Services\DataProcessorService\
dotnet run
cd .\..\..\..\
cd .\src\Services\FileParserService\
dotnet runПосле того как микросервисы и RabbitMQ запущены, можно приступать к работе.
appsettings.json файл микросервиса FileParserService выглядит следующим образом:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"FileMonitoring": {
"InputDirectory": "D:\\test"
},
"RabbitMq": {
"Host": "localhost",
"Username": "guest",
"Password": "guest"
}
}InputDirectory - путь к директории, откуда начинается сканирование файлов с расширением .xml.
У меня было две идеи для реализации данного микросервиса:
- Полное сканирование директории с периодом 1 секунда (polling). Полное сканирование имеет много недостатков: постоянная нагрузка на CPU и диск; повторное сканирование того же файла, даже если он не был изменен.
- Использовать событийно-ориентированный подход (FileSystemWatcher). При событийно-ориентированном подходе ОС сама оповещает нас об изменениях, связанных с этой папкой (добавление, изменение, удаление файла), нам остается лишь подписаться на событие. Минус этого подхода в том, что если у нас в папке уже есть файлы, то сервис никак на них не отреагирует.
В ТЗ не было сказано про условия, в которых работает сервис, то я предположил, что изначально папка будет пуста. Тогда такой подход более чем оправдан. Если папка InputDirectory отсутствует, то она будет создана - в логах вы увидите предупреждение об этом.
Начинайте размещать *.xml файлы в данной папке - FileParserService начнет их сканировать.
Разберем appsettings.json файл для микросервиса DataProcessorService:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ConnectionStrings": {
"DefaultConnection": "Data Source=Persistence/ModuleStatus.db"
},
"RabbitMq": {
"Host": "localhost",
"Username": "guest",
"Password": "guest"
}
}DefaultConnection - относительный путь, где будет создан файл с БД. В историю Git я занес db файл, но вы можете удалить этот файл - микросервис сам применит миграцию и создаст БД, если её нет.
В моей реализации ModuleState - это enum, поэтому в БД они сохранены в виде чисел.

Если появятся вопросы, то можете мне написать в Telegram или создать issue с проблемой. Буду очень ждать обратной связи!