Решение предлагает переиспользуемую инфраструктуру для реализации на ее основе процессов, где требуется обработка большого количества сущностей через объектную модель RX после миграций или для проведения массовой обработки.
Шаблон разработки для массовой обработки данных в Directum RX
Статья на Directum Club
Обеспечение стабильного, контролируемого и эффективного процесса обработки больших объемов данных (миллионы сущностей) с минимальными трудозатратами на разработку и защитой производительности системы.
- Абстрактный справочник-конфигуратор с настройками потоков, размера пачек, повторных попыток и лимитов потоков на рабочее и не рабочее время.
- Справочник элемента очереди для хранения списка обрабатываемых объектов и информации о результатах обработки.
- Фоновый процесс для создания очередей и запуска асинхронных обработчиков с учетом заданных лимитов.
- Асинхронный обработчик, устойчивый к ошибкам: ошибки изолируются, фиксируются и не приводят к неконтролируемому росту числа процессов.
- Набор клиентских методов, предназначенных для добавления действий на обложку модуля.
- Не содержит перекрытий «коробочных» сущностей.
Для работы требуется установленный Directum Development studio версии 4.10 и выше
- Склонировать репозиторий BulkProcessing в папку (например C:\WorkFolder).
- Указать в _ConfigSettings.xml DDS:
<block name="REPOSITORIES">
<repository folderName="Base" solutionType="Base" url="<адрес локального репозитория>" />
<repository folderName="Work" solutionType="Work" url="<адрес локального репозитория>" />
<repository folderName="<Папка из п.1>" solutionType="Work" url="https://github.com/STARKOV-Group/BulkProcessing.git" />
</block>Возможные варианты:
- Сделать fork репозитория BulkProcessing для своей учетной записи.
- Склонировать созданный в п. 1 репозиторий в папку.
- Указать в _ConfigSettings.xml DDS:
<block name="REPOSITORIES">
<repository folderName="Base" solutionType="Base" url="<адрес локального репозитория>" />
<repository folderName="Work" solutionType="Work" url="<адрес локального репозитория>" />
<repository folderName="<Папка из п.2>" solutionType="Work" url="<Адрес репозитория gitHub учетной записи пользователя из п. 1>" />
</block>Вариант не рекомендуется:
- так как при выходе новой версии шаблона разработки не гарантируется обратная совместимость;
- потеряется возможность изменения или доработки функционала под собственые требования;
- Склонировать репозиторий BulkProcessing в папку.
- Указать в config.yml DirectumLauncher:
- '@folderName': 'BulkProcessing'
'@solutionType': 'Work'
'@url': 'https://github.com/STARKOV-Group/BulkProcessing.git'Рекомендуемый вариант для проектов внедрения.
- В системе контроля версий с поддержкой git создать новый репозиторий.
- Склонировать репозиторий BulkProcessing в папку с ключом
--mirror. - Перейти в папку из п. 2.
- Импортировать клонированный репозиторий в систему контроля версий командой:
git push –mirror <Адрес репозитория из п. 1>
Для создания нового обработчика, на рабочем слое своего решения требуется создать справочник-наследник от абстрактного предка из шаблона ProcessSettingBase («Настройка процесса»). При необходимости можно расширить форму дополнительными свойствами. Далее потребуется переопределить несколько методов, необходимых для кастомизации логики:
/// <summary>
/// Получить все сущности.
/// </summary>
public override IQueryable<Sungero.Domain.Shared.IEntity> GetAllEntities()
{
// Вернуть результат метода GetAll() типа сущности, который будет в обработке.
} /// <summary>
/// Получить сущности для обработки.
/// </summary>
public override IQueryable<Sungero.Domain.Shared.IEntity> GetEntitiesForProcessing()
{
// Ваша логика получения объектов (наследников IEntity), которые требуется обработать
}Опционально, вместо метода GetEntitiesForProcessing можно перекрыть метод GetEntitiesIdsForProcessing, возвращающий IQueryable, если получение идентификаторов сущностей предполагается не из репозитория.
/// <summary>
/// Обработать сущность.
/// </summary>
/// <param name="entity">Сущность для обработки.</param>
/// <param name="_logger">Преднастроенный экземпляр логгера с контекстом (settingId, processId).</param>
public override void ProcessEntity(Sungero.Domain.Shared.IEntity entity, Sungero.Core.ILogger _logger)
{
// Ваша логика обработки, которая должна применятся к каждому объекту
}- Решение может работать только с сущностями – наследниками IEntity.
- В очереди хранятся идентификаторы объектов.
- Для разработки нового процесса требуется наследование от абстрактного справочника ProcessSettingsBase с обязательным переопределением группы методов (сгруппированы в отдельный регион на серверном слое).
Note
Замечания и пожелания по развитию шаблона разработки фиксируйте через Issues.
При оформлении ошибки, опишите сценарий для воспроизведения. Для пожеланий приведите обоснование для описываемых изменений - частоту использования, бизнес-ценность, риски и/или эффект от реализации.
Внимание! Изменения будут вноситься только в новые версии.