Некорректная работа БП с таймером

Добрый день.

Подскажите почему может быть такая ситуация:
В БП используется Таймер. Если в таймер идет один поток и из него один поток, то он работает корректно.
Но если добавить из таймера два исходящих потока или исключающее ИЛИ после таймера с двумя исходящими потоками, то БП работает некорректно.
Сделала тестовый БП:
1. В сценарии пишется лог в файл + уменьшается параметр, отвечающий за кол-во повторений БП
2. Чтение данных только для определения по какому маршруту идет процесс
3. В условном потоке идет проверка: завершить процесс (параметр Бп = 0)
Причем после первого выполнения сценария, он повторно не выполняется (то, что не выполняется знаю точно, потому что веду логирование в данном сценарии). Диаграмма БП на картинке 3.
Версия продукта 7.3.0.1910.

Нравится

6 комментариев

Александра, судя по скриншотам журнала процессов, элемент «Задание-сценарий» не логируется. Пожалуйста, установите в дизайнере процессов признак «Журналировать» этому элементу.

Также, у процесса есть свойство «Максимальное количество повторений» - это количество повторений после которых процесс завершается вне зависимости от результата.

1. Устанавливала признак Журналировать. При этом в Диаграмме отмечается, что блок обрабатывался, но изменений в параметре и логах при этом нет. Такая ситуация наблюдается только со сценариями, при повторном запуске вычисления в них не срабатывают.
2. Так же пробовала другую ситуацию. Сделала два Бп:
первый состоит из таймера и подпроцесса (запуск второго БП)
второй содержит всю обработку.
При такой реализации все работает корректно. Получается каждый день будет появляться новый БП (2), созданный из БП (1). У таймера старт раз в сутки. Единственное Бп 2 содержит только один скрипт, это немного странно. Удобней было бы все реализовать в одном..
Насколько корректным будет такой вариант? Может есть какие-то "подводные камни"?
3. Так же есть вариант делать без сценария, а с использованием других элементов БП, но это сильно усложнит логику и в БП будет цикл с несколькими элементами процесса.

Максимальное число повторений при подходе 2. не сработало. Ставила 3 повторения, отработал 4, после чего пришлось выключить руками.

Александра, добрый день!

Для решения задачи предлагаем использовать планировщик, вместо цикличности процесса. Необходимо добавить в планировщик job, который будет запускать процесс с необходимой периодичностью. Для этого следует:

1. В БП добавить элемент “Задание сценарий”.
2. В сценарии прописать следующий код :
string schedulerJobGroupName = "ScheduleTest"; // произвольное название
string jobProcessName = "UsrScheduleTest"; // название бизнес-процесса
string schedulerJobName = "ScheduleTestJob"; // произвольное название
int startOffset = 60; // периодичность запуска (в секундах)
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
return true;
3. Сохранить сценарий.

4. В пространство имен (Usings) процесса добавить:
- Quartz.Impl
- Quartz
- Quartz.Impl.Triggers
- Terrasoft.Core.Scheduler

5. Опубликовать процесс.

В результате процесс, который записывает лог в файл, будет запускаться каждый раз в новом экземпляре с указанной периодичностью. При включенном журналировании, ПБ будет логироваться в журнале процессов, легче отследить некорректное поведение на каждом из этапов.

Спасибо за предоставленные комментарии.
Сделала еще один процесс с таймером и сценарием и сценарий стал отрабатывать. В чем была причина проблемы отработки сценария в предыдущем ТМ так и не выяснила.

По поводу решения через Quartz, я верно понимаю, что необходимо предварительно настроить планировщик?

Здравствуйте, Александра! Планировщик в системе уже существует и настроен. Процесс создает Job, который запускается в указанное время. Запускаемые Job можно найти в таблице dbo.qrtz_triggers

Показать все комментарии