Коллеги, требуется помощь!
Программирую регулярное выполнение бизнес-процесса через планировщик таким образом:
первый элемент бизнес-процесса проверяет наличие триггера, и в случае отсутствия - создаёт триггер в БД. Т.е. при первом ручном запуске БП - он формирует себе "расписание" последующих запусков.
Пробовал использовать несколько способов, но все они не работают, в Библиотеке БП процесс присутствует, триггеры в БД заводятся. Но последующих запусков не происходит.
В чём может быть причина?
Доп. инфоормация:
Версия BPM 7.7 Bank Customer Journey. БД Oracle.
Триггеры находятся в состоянии WAITNG.
Пользователь для выполнения системных операций (SystemUser) Supervisor.
IIS перезапускал. Application Pool находится в режиме Универсальный.
Способы, которые я пробовал использовать:
CronTriggerImpl:
var cronExp = "0 0/5 * ? * * *"; if (!AppScheduler.DoesJobExist(jobName, jobGroup)) { var job = AppScheduler.CreateProcessJob(jobName, jobGroup, procName, userConnection.Workspace.Name, userConnection.CurrentUser.Name); var trigger = new CronTriggerImpl(jobName + "Trigger", jobGroup, cronExp); AppScheduler.Instance.ScheduleJob(job, trigger); }
CronTriggerImpl:
var cronExp = "0 0/5 * ? * * *"; if (!AppScheduler.DoesJobExist(jobName, jobGroup)) { var job = AppScheduler.CreateProcessJob(jobName, jobGroup, procName, userConnection.Workspace.Name, userConnection.CurrentUser.Name); var trigger = new CronTriggerImpl(jobName + "Trigger", jobGroup, cronExp); trigger.MisfireInstruction = MisfireInstruction.CronTrigger.FireOnceNow; trigger.TimeZone = TimeZoneInfo.Utc; AppScheduler.Instance.ScheduleJob(job, trigger); }
ScheduleMinutelyProcessJob:
int periodInMinutes = 3; if (!AppScheduler.DoesJobExist(jobName, jobGroup)) { AppScheduler.ScheduleMinutelyProcessJob(jobName, jobGroup, procName, userConnection.Workspace.Name, userConnection.CurrentUser.Name, periodInMinutes); }
SimpleTriggerImpl:
int startOffset = 4; if (AppScheduler.DoesJobExist(jobName, jobGroup)) { AppScheduler.RemoveJob(jobName, jobGroup); } var job = AppScheduler.CreateProcessJob(jobName, jobGroup, procName, userConnection.Workspace.Name, userConnection.CurrentUser.Name); var trigger = new SimpleTriggerImpl(jobName + "Trigger", jobGroup, DateTime.UtcNow.AddMinutes(startOffset)); AppScheduler.Instance.ScheduleJob(job, trigger);
SimpleTriggerImpl от системного пользователя:
int startOffset = 4; if (AppScheduler.DoesJobExist(jobName, jobGroup)) { AppScheduler.RemoveJob(jobName, jobGroup); } var job = AppScheduler.CreateProcessJob(jobName, jobGroup, procName, userConnection.Workspace.Name, userConnection.CurrentUser.Name, null, true); var trigger = new SimpleTriggerImpl(jobName + "Trigger", jobGroup, DateTime.UtcNow.AddMinutes(startOffset)); AppScheduler.Instance.ScheduleJob(job, trigger);
При использовании всех вариантов - триггеры создаются в БД, но повторно не срабатывают. Куда копать?
Нравится
сайт пингуется периодически? (там вроде как пул приложений засыпает периодически, если пользователи долго не работают, и триггеры отваливаются)
Сайт пингуется. Так же есть уже заведённые (не мной, до меня) Job'ы c триггерами, которые регулярно запускаются с периодичностью в 2 минуты. Мои же триггеры не запускаются
Может, оно попыталось запуститься и свалилось. Иногда можно понять, глядя в базе на записи об этих триггерах в таблицах с названиями, начинающимися с QRTZ. Может, там найдутся подробности о произошедшем или видно разницу с нормально работающим.
Для контроля запускал такой скрипт (БД Oracle) -
SELECT sched_name,
trigger_group,
job_name,
job_group,
trigger_state,
TO_DATE ('03-jan-0001', 'dd-mon-yyyy')
+ next_fire_time / (10000000 * 60 * 60 * 24)
AS next_fire_time,
TO_DATE ('03-jan-0001', 'dd-mon-yyyy')
+ prev_fire_time / (10000000 * 60 * 60 * 24)
AS prev_fire_time
FROM qrtz_triggers
он показывает что у моих триггеров prev_fire_time - пустое, а next_fire_time, к примеру, "28.11.2017 8:41:49". У работающих же триггеров - оба значения заполнены, и примерно например, prev_fire_time: "28.11.2017 8:40:48"
Проверьте что бы название (не заголовок) целевых процессов совпадал со значением в переменной procName (при создании джоба).
Если не поможет напишите в тех. поддержку.
Олег, спасибо)
Вроде перепроверил заголовки. Уже !!! параллельно написал в поддержку платную. Давайте вместе найдём в чём затык!