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



Друзья, подскажите пожалуйста, можно ли включить кластерный режим планировщика в версии 7.2.2.707. У нас настроено горизонтальное масштабирование, но не работают веб сокеты если больше одной ноды. Есть документация по новым версиям: https://academy.terrasoft.ua/docs/user/razvertyvanie_onsite/nastroika_d…

Есть ли что-то подобное для нашей версии?

 

Нравится

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

Олег, здравствуйте.

В этой версии ещё нет полноценной поддержки веб-сокетов в ферме. Реализация этого функционала доступна в версии 7.12.1 и выше.

 

Что касается кластеризации планировщика, по умолчанию он и так должен быть включён, за это отвечает параметр \web.config:

 

<add key="quartz.jobStore.clustered" value="true" />

 

Но, чтобы это работало, нужно ещё исправить ключ:

<add key="quartz.scheduler.instanceId" value="auto" />

 

(написать в верхнем регистре)

<add key="quartz.scheduler.instanceId" value="AUTO" />

Спасибо, Олег.

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

В системе есть процессы, которые запускаются планировщиком и при этом не журналируются. + мы сами добавили таких процессов.

Понять работу процессов можно только через таблицы в БД или же через логи.

 Идея сделать user friendly интерфейс для таких заданий, чтоб можно было посмотреть, что в системе работает, когда последний запускалось. И будет вообще шикарно, если будет возможность настройки этих заданий.

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

Алексей, уже зарегистрирована идея с предложением по улучшению продукта: интерфейс для управления заданиями планировщика и возможность принудительно запустить процесс, запланированный планировщиком.

Также, в будущих версиях планируется смена планировщика с QUARTZ на другой механизм.

Добрый день, Игорь!

 

Данная задача в работе у ответственной команды.

 

 

С уважением,

Кучер Виталина

Оператор

Группа компаний Terrasoft

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

Всем доброго времени суток!

Использую библиотеку Quartz для запуска БП по расписанию:

 

public virtual void CreateJob(string jobName, string jobGroup, string triggerName, string process, DateTime start, Dictionary<string,object> parameters)
        {
            var workspace = UserConnection.Workspace.Name;
            var userName = UserConnection.CurrentUser.Name;
            IJobDetail job = AppScheduler.CreateProcessJob(jobName, jobGroup, process, workspace, userName, parameters);
 
            var trigger = TriggerBuilder.Create().WithIdentity(triggerName, jobGroup).StartAt(start)
                .WithSimpleSchedule(i => i.WithIntervalInHours(24).RepeatForever()).Build();
            var task = AppScheduler.Instance.ScheduleJob(job, trigger);
        }

В таблице триггеров записи создаются, но процесс почему то не запускается:

http://prntscr.com/mgde38

 

Подскажите в чем может быть проблема.

Сайт развернут локально. 

Нравится

3 комментария
Лучший ответ

Очевидно где то ошибся может некоректно указал расписание, название процесса и тд.

Так же посмотрите рекомендации по разрешению проблем с шедулером тут

А чем тебе стандартный элемент БП запуск по таймеру не устраивает? Там же можно выбрать расписание запуска БП, если конечно ты работаешь с более менее новой версией bpmonline!

Очевидно где то ошибся может некоректно указал расписание, название процесса и тд.

Так же посмотрите рекомендации по разрешению проблем с шедулером тут

А чем тебе стандартный элемент БП запуск по таймеру не устраивает? Там же можно выбрать расписание запуска БП, если конечно ты работаешь с более менее новой версией bpmonline!

Григорий Чех,

Стандартный элемент не решает поставленной задачи

Причину неработоспособности нужно ещё смотреть по другим таблицам, названия которых начинаются на QRTZ, а также в текстовом файле Scheduler.log за нужную дату на сервере IIS. По ссылке, которую дал Григорий, есть различные советы по устранению.

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

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

Разработали процессы, которые запускаются по таймеру каждый день в определенное время.

Эти процессы спокойно перенеслись через SVN на другие дев стенды и на QAS - и там начали работать по расписанию.

Но, когда перенесли наш пакет с помощью WorkspacecConsole, то на целевой среде они не запускаются по расписанию. Стартовые сигналы в таблице SysStartTimerInProcess появились, но триггеров в QRTZ_TRIGGERS нет.  Запускал вручную - они отлично отрабатывают, но далее по расписнию все равно не работают (триггеров по-прежнему нет).

В процессе установлена галка Повторять при пропуске.

Еще такой момент: на целевой среде, куда переносим пакет с помощью WsC - SalsesEnterprise, а на девах и QAS какая-то более сложна сборка с маркетингом и  сервисом. Версия везде 7.11.3.1175

 

Прикладываю файлы логов планировщика на целевой среде. Ошибок, по крайней мере, в них нет, а также файлы с командами для WorkspaceConsole, которые используем для переноса.

Прикрепленные файлы

Нравится

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

Добрый день, Андрей!

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

В других механизмах установки пакетов эти изменения прописаны и выполняются автоматически. 

Tsopa,

Добрый день. Что сделал:

  1. Выключил пул приложений
  2. Установил пакет с помощью WorkspaceConsole
  3. Почистил redis
  4. Включил пул 
  5. Убедился, что в QRTZ_TRIGGERS триггеров нет
  6. Залогинился и сделал Генерировать исходные коды для всех
  7. Сделал компилировать все
  8. После этого в QRTZ_TRIGGERS появились нужные трриггеры
Показать все комментарии

Коллеги, требуется помощь!

Программирую регулярное выполнение бизнес-процесса через планировщик таким образом:

первый элемент бизнес-процесса проверяет наличие триггера, и в случае отсутствия - создаёт триггер в БД. Т.е. при первом ручном запуске БП - он формирует себе "расписание" последующих запусков.

Пробовал использовать несколько способов, но все они не работают, в Библиотеке БП процесс присутствует, триггеры в БД заводятся. Но последующих запусков не происходит.

В чём может быть причина?

Доп. инфоормация:

Версия 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);

 

При использовании всех вариантов - триггеры создаются в БД, но повторно не срабатывают. Куда копать?

Нравится

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

сайт пингуется периодически? (там вроде как пул приложений засыпает периодически, если пользователи долго не работают, и триггеры отваливаются)

Сайт пингуется. Так же есть уже заведённые (не мной, до меня) 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 (при создании джоба).

Если не поможет напишите в тех. поддержку.

Олег, спасибо)

Вроде перепроверил заголовки. Уже !!! параллельно написал в поддержку платную. Давайте вместе найдём в чём затык!

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

Добрый день. Возникла необходимость запускать единоразово БП в указанное время. Задание для планировщика добавляется (появляется в бд), но не срабатывает в указанное время. В бд можно увидеть, что задание остаётся по-прежнему в режиме ожидания (устанавливал запуск через 5 минут при тесте). Ниже код, добавляющий задание для планировщика. В чём может быть проблема?

 

            
startDateTime = startDateTime.AddHours(-3);
string jobName = string.Format(jobNameTemplate, id);
 
var parameters = new Dictionary<string, object>();
parameters.Add("Id", id.ToString());
AppScheduler.RemoveJob(jobName, jobGroupName);
var job = AppScheduler.CreateProcessJob(
     jobName, 
     jobGroupName, 
     processName, 
     userConnection.Workspace.Name, 
     userConnection.CurrentUser.Name,
     parameters);
 
string cronExpresson = string.Format("{0} {1} {2} {3} {4} ? {5} ", 
    dt.Second, dt.Minute, dt.Hour, 
    dt.Day, dt.Month, dt.Year);
 
var trigger = new CronTriggerImpl(
     jobName + "Trigger", 
     jobGroupName, 
     cronExpresson);
 
trigger.MisfireInstruction = MisfireInstruction.CronTrigger.DoNothing;
trigger.TimeZone = TimeZoneInfo.Utc;
 
AppScheduler.Instance.ScheduleJob(job, trigger);



 

 

Нравится

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

У меня была такого рода проблема, ниже привожу ответ с поддержки:

 

Описанное поведение может возникать из-за некорректных настроек пула приложения в IIS. Как следствие процесс не запускается по расписанию, так как планировщик на прямую связан с пулом.

Для того, чтобы убедится в этом достаточно создать процесс с 1 элементом таймер. Указать в таймере 10 сек. Запустить процесс. Если по истечению времени (10 сек) экземпляр процесса (в журнале процессов) по прежнему находится в состоянии “Выполняется” (не “Завершен”) – необходимо настроить удостоверение в свойствах пула.

В расширенных настройках пула в параметре Удостоверение (identity) необходимо указать пользователя, от имени которого запущен IIS

Советы по конфигурированию выявленные опытным путем:

1) Использовать отдельный пул для каждого приложения в рамках отдельного IIS сервера.

2) В настройке пула Identity задать значение LocalSystem

в правах NTFS на каталог приложения - должна присутствовать роль SYSTEM (СИСТЕМА) и иметь полынье права, рекурсивно включая все вложенные каталоги.



3) В конфигурационном файле ConnectionStrings необходимо установить авторизацию по конкретному пользователю

 (желательно создать отдельного пользователя SQL (авторизация средствами SQL-сервера, т.е. не пользователь ОС) имеющего права владельца на БД используемую приложением)

режим "сквозной авторизации" через пользователя ОС (Integrated Security=SSPI (атрибут узла add name="db" в теге connectionStrings))

вызывает проблемы с планировщиком, лучше использовать прямую авторизацию пользователем SQL-сервера.

 

Методику проверки, Вам подсказывают верно:

необходимо создать БП в котором между точками старта и окончания необходимо разместить элемент "Таймер" (на одну или несколько секунд задержки).

после сохранения такого БП, принудительно вызвать его на исполнение, после чего в журнале БП убедиться что БП успешно выполнился, а не находится в состоянии "Выполняется" или "Ошибка"

Шарипов Ильмир Ирекович,

Проверил. Сегодня утром тестовый таймер работал. И начал срабатывать вызов моего процесса. Но спустя некоторое время всё вернулось к прежнему состоянию. Таймер тоже перестал работать. Видимо проблемы связаны с перегруженностью планировщика, хоть и задач у него немного. Пока что решилось изменением настроек Quartz в конфиге загрузчика. Первой строки изначально вообще не было, во второй значение было равным 5. 

&lt;add key="quartz.scheduler.batchTriggerAcquisitionMaxCount" value="5" /&gt;
&lt;add key="quartz.scheduler.threadCount" value="10" /&gt;

 

Чтобы запустить планировщик после перезапуска вэб-приложения, нужно зайти именно на страницу логина. То есть пока кто-нибудь не зайдет на страницу логина, планировщик не запустится. Планировщик живет в верхнем квадратике. Если пользователь аутентифицирован до перезапуска вэб-приложения, то можно сразу выйти на страницы .../0/..., но это не запустит планировщик.

 

 

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

Коллеги, добрый день!

Подскажите, в чем может быть проблема:
спроектирован бизнес-процесс, который корректно отрабатывает при запуске от пользователя.
Если данный процесс запланировать в QUARTZ, то он запускается, но выполняет только часть своей задачи. В журнале отображается ошибка:

System.Exception: Ошибка выполнения БП: BulkSmsId:95839e74-7d60-4220-8993-7a3995e0674b; Msg: Object reference not set to an instance of an object. BulkSmsId:5435b20b-55a9-4b5d-9844-20ee5e4b0459; Msg: Object reference not set to an instance of an object. at Terrasoft.Core.Process.NrbActualizeDailyBulkSms2MethodsWrapper.ScriptTask1Execute(ProcessExecutingContext context) at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

При этом, id, на которые ругается БП реально существуют и повторюсь, что при запуске от пользователя - все работает. Подскажите, как можно устранить такую проблему?

UPD: ввел в заблуждение, так как id не имеют значения. Необходимо понять почему система не может найти объект при запуске из QUARTZ, а при запуске от пользователя - находит.

Нравится

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

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

По описанному кейсу, можно предположить, что проблема возникает из-за отсутствия значения в одном из параметров процесса.

Пропишите по возможности логирование в выполнение элемента ScriptTask1Execute.

"Терещук Павел" написал:

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

По описанному кейсу, можно предположить, что проблема возникает из-за отсутствия значения в одном из параметров процесса.

Пропишите по возможности логирование в выполнение элемента ScriptTask1Execute.


А как такое возможно, что при запуске от пользователя параметры все заполнены, а при запуске из планировщика, какой-то теряется?

"Сережкин Дмитрий Сергеевич" написал:А как такое возможно, что при запуске от пользователя параметры все заполнены, а при запуске из планировщика, какой-то теряется?

Может быть UserConnection?

Вполне может быть.

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

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

Подскажите, люди добрые!
Начинаем осваивать планировщик в 7.7. Пытаюсь запустить его сценарием из БП:

var userConnection = GetUserConnection>("UserConnection");
string schedulerJobGroupName = "GroupName";
string jobProcessName = "ISSendContacts";
string schedulerJobName = "JobISSendContacts";
int startOffset = 20;
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;

При условии, что подключил библиотеки в Usings:

Quartz.Impl
Quartz
Quartz.Impl.Triggers
Terrasoft.Core.Scheduler

А при компиляции он ругается на AppScheduler и SimpleTriggerImpl, типа, они не объявлены.
Пробовал перед ними добавлять альясы Usings, например "Terrasoft.Core.Scheduler.AppScheduler", но это тоже не помогло.
Связано ли это с тем, что БП, создающий Job находится в созданном мной отдельном пакете, в котором из зависимостей только базовые пакеты Base и UIv2?

Нравится

1 комментарий

Повторил этот бизнес процесс с нуля и он заработал без ошибок :)
Вообще странно, но в любом случае, получается, что я сам где-то ошибся.

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

никак не можем понять в каком формате Quartz хранит свои отметки времени. В документации по нему вроде бы используется long timestamp (1342049220104), но в базе хранится в непонятном виде (635923508479220853).

подскажите, плз, очень надо для отладки

7,5 Pharma

Нравится

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

Дмитрий,

Вроде бы это ticks, т.е. через new DateTime(635923508479220853)
или

http://tickstodatetime.com/

Дмитрий,

Преобразовать время планировщика в привычный DateTime можно с помощью скрипта:
SELECT [SCHED_NAME],
[TRIGGER_NAME]
,[TRIGGER_GROUP]
,[JOB_NAME]
,[JOB_GROUP]
--,[DESCRIPTION]
,CAST([NEXT_FIRE_TIME]/864000000000.0 -693595.0 AS DATETIME) [NEXT_FIRE_TIME]
,CAST([PREV_FIRE_TIME]/864000000000.0 -693595.0 AS DATETIME) [PREV_FIRE_TIME]
,[PRIORITY]
,[TRIGGER_STATE]
,[TRIGGER_TYPE]
,CAST([START_TIME]/864000000000.0 -693595.0 AS DATETIME) [START_TIME]
,CAST([END_TIME]/864000000000.0 -693595.0 AS DATETIME) [END_TIME]
,[CALENDAR_NAME]
,[MISFIRE_INSTR]
,[JOB_DATA]
FROM[QRTZ_TRIGGERS]

спасибо, Дмитрий

спасибо, Олег)

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

Вопросы:
1) Где и как можно конфигурировать планировщик задач (на уровне администрирования - подключение к БД и т.д.)
2) Поделитесь опытом - как исключить запросы Quartz'a из профайлера SQL

Нравится

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

Здравствуйте, Дмитрий.

1. Необходимые параметры находятся в файле ConnectionStrings.config (в корне папки с бинарными файлами)
2. Запросы исключаются следующим образом:
[IMG]http://s012.radikal.ru/i320/1512/51/7bccf3c13715.png[/IMG]
[IMG]http://s017.radikal.ru/i416/1512/d3/f1e118b7cadc.png[/IMG]

"Сергей Кy6риш" написал:Необходимые параметры находятся в файле ConnectionStrings.config (в корне папки с бинарными файлами)

т.е. Quartz подключается по тем же настройкам, что и все приложение? Ок

Совершенно верно!

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