Добрый день.
Задача следующая:
Необходимо запускать БП каждую неделю в определённое время.
Реализовал:
В качестве первого элемента БП использую скрипт, в котором запускаю следующий код:

//delete previous job
Scheduler.AppScheduler.RemoveJob(
        "StartSxScheduledMeetingJob",
        "SxScheduledMeetingGroup"
);

//set new job
int minutelyInterval = 10080; //7 days (minutes)
Scheduler.AppScheduler.ScheduleMinutelyProcessJob(
        "StartSxScheduledMeetingJob",
        "SxScheduledMeetingGroup",
        "SxScheduledMeeting",
    "Default",
        "Supervisor",
        minutelyInterval);

После чего выполняются остальные элементы БП.
Проблема в том, что БП начал запускаться не через 7 дней (эквивалент 10080 минут), а каждую секунду.
При анализе содержимого Таблиц с префиксом QRTZ выявлено, что запись была добавлена в следующие таблицы
QRTZ_FIRED_TRIGGERS
QRTZ_JOB_DETAILS
QRTZ_TRIGGERS
QRTZ_SIMPROP_TRIGGERS
Чем вызвано подобное поведение планировщика?
И как корректно реализовать такую задачу?

Нравится

22 комментария

Здравствуйте!

Попробуйте сделать следующим образом:

string schedulerJobGroupName = "StartSxScheduledMeetingJob"
string jobProcessName = "SxScheduledMeeting";
string schedulerJobName = "StartSxScheduledMeetingGroup";
int startOffset = 648000;
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;

"Демьяник Алексей Олегович" написал:int startOffset = 648000;

Вы здесь укаываете интервал в секундах?
Если да то там ошибка
7 дней = 604800 сек.

Прошу прощения за опечатку.

Верно,
Если необходимо установить интервал в 7 дней - следует указать значение 604800.

А из-за чего происходит указанная мной ошибка при использовании ScheduleMinutelyProcessJob , когда БП перезапускается каждую секунду вместо раза в 7 дней?

Добрый день!

Вероятно, проблема связана с тем, что в коде не указано return true;

Указан. Я его не указал в обращении, т.к. он не относится к вопросу. Могу предоставить md-файл на анализ

Добрый день!

Предоставьте, пожалуйста. Укажите также версию приложения.

Версия:
7.5.0.1422_SalesOmnichannel_Marketing_CustomerEngagementCenter_Softkey_MSSQL_RUS

Игорь, скажите, пожалуйста, мое решение подошло для решения Вашей задачи?

Странно, но указанная ошибка не повторяется на другом экземпляре этой базы.

Просьба указать наиболее корректный вариант решения данной задачи, предложенный выше Демьяник Алексеем (Комментарий #1) или мой.

Добрый день!

Оба варианта корректные, Алексей предложил практический вариант применения планировщика.

"Демьяник Алексей Олегович" написал:

Игорь, скажите, пожалуйста, мое решение подошло для решения Вашей задачи?

Ругается на класс SimpleTriggerImpl.
Какое пространство имён мне нужно добавить в Using?
И не лучше ли в моём случае использовать CronTriggerImpl (только вот в каком пространстве имёт тоже не нашёл)
Также не нашёл описания указанных классов

Так же интересует логика работы при выполнении указанных методов, а именно при выполнении методов .ScheduleMinutelyProcessJob() или .ScheduleJob() происходит ли первичный запуск нужного БП или только добавляется в расписание?

Добрый день!

1. В простанство имен Usings следует добавить:
- Quartz.Impl
- Quartz
- Quartz.Impl.Triggers
- Terrasoft.Core.Scheduler
2. При выполнении методов БП добавляется в расписание.

Здравствуйте.
Т.е. немедленного запуска перед добавлением в расписание не происходит?

При каких условиях при выполнении метода ScheduleMinutelyProcessJob() задача добавляется в таблицу QRTZ_FIRED_TRIGGERS? т.е. происходит немедленный запуск(описание проблемы в топике)?

Добрый день!

Необходимо запустить Ваш процесс (может быть запущен вручную или по событию). БП доходит до элемента “Задание сценарий”. Добавляется job в планировщик. В результате процесс будет запущен в следующий раз согласно указанного времени в параметре startOffset.

Здравствуйте. А что делать если выдает такую ошибку?

Добрый день. Добавляю назначенное задание по аналогии с примером выше:

UserConnection userConnection =  Get<UserConnection>("UserConnection");
//:запуск через 24 часа
//Добавляем в назначенное задание
 
string processName = "ProcessName";
string jobName = processName + "Job";
string jobGroupName = jobName + "Group";
 
int startOffset = 86400; //  (одни сутки)
AppScheduler.RemoveJob(jobName, jobGroupName);
var job = AppScheduler.CreateProcessJob(jobName, jobGroupName, processName, userConnection.Workspace.Name, "Supervisor");
var trigger = new SimpleTriggerImpl(jobName + "Trigger", jobGroupName, DateTime.UtcNow.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
 
return true;

Job появляется в [QRTZ_TRIGGERS], но поле TRIGGER_STATE = BLOCKED.
и в указанное время БП не запускается.
Идентичный код в другом БП добавляет job с TRIGGER_STATE = WAITING и БП прекрасно запускается.

Чем вызвана установка TRIGGER_STATE = BLOCKED?

Выявлено, что назначенное задание не отрабатывает только, когда пользователь авторизован в системе. Но как только он выходит, назначенное задание сразу отрабатывает.
А когда пользователь не авторизован, то невозможно использовать UserConnection, что необходимо для получения значения системных настроек и выполнения ESQ-запросов.
С чем связано такое поведение? и как решить проблему с UserConnection?

Версия 7.8.1681

"Коновалов Игорь" написал:

Выявлено, что назначенное задание не отрабатывает только, когда пользователь авторизован в системе. Но как только он выходит, назначенное задание сразу отрабатывает.

А когда пользователь не авторизован, то невозможно использовать UserConnection, что необходимо для получения значения системных настроек и выполнения ESQ-запросов.

С чем связано такое поведение? и как решить проблему с UserConnection?

Версия 7.8.1681


На дворе май 2017-го, но обозначенная Игорем проблема актуальна и для версии 7.10, т.е. процесс запускается планировщиком только после выхода пользователя из системы. Есть ли workaround?

"Давыдов Андрей Дмитриевич" написал:
Коновалов Игорь пишет:

Выявлено, что назначенное задание не отрабатывает только, когда пользователь авторизован в системе. Но как только он выходит, назначенное задание сразу отрабатывает.

А когда пользователь не авторизован, то невозможно использовать UserConnection, что необходимо для получения значения системных настроек и выполнения ESQ-запросов.

С чем связано такое поведение? и как решить проблему с UserConnection?

Версия 7.8.1681

На дворе май 2017-го, но обозначенная Игорем проблема актуальна и для версии 7.10, т.е. процесс запускается планировщиком только после выхода пользователя из системы. Есть ли workaround?


Опытным путем выяснил, что планировщик сбоит при отладке процесса w3wp в VisualStudio. Если отладчик не подключать, то планировщик работает нормально.

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