Администрирование и диагностика

Содержание

Администрирование и диагностика#

Страница предназначена для администраторов, которые настраивают, контролируют и восстанавливают работу менеджера заданий. Работа в интерфейсе описана на странице «Интерфейс менеджера заданий», программные контракты и модель данных — на странице «Техническое устройство».

Предварительные требования#

Для выполнения заданий должны быть доступны:

  • PostgreSQL с конфигурацией менеджера заданий и таблицами Quartz btk_qrtz_*;

  • внешний процесс планировщика jobscheduler;

  • ApplicationServer с доступными SOAP- и REST-точками;

  • настройки аутентификации планировщика;

  • пользователь выполнения с полномочиями на вызываемые заданием операции.

Менеджер заданий использует Quartz 2.3.1 и отдельный процесс jobscheduler. Точная версия планировщика определяется эксплуатационной поставкой. Способ установки, имя службы и команда запуска jobscheduler также зависят от поставки. Старые инструкции для jobscheduler 1.2 применять нельзя.

Последствия недоступности компонентов#

Недоступный компонент

Последствие

PostgreSQL

Менеджер заданий недоступен: конфигурация и Quartz JobStore хранятся в этой базе данных

jobscheduler

Задания не передаются на выполнение в ApplicationServer

ApplicationServer или его SOAP-точка

Триггер может сработать, но прикладной код задания не выполняется

Аутентификация планировщика

ApplicationServer отклоняет SOAP-запрос до выполнения задания

Защищенное хранилище

При устаревшей авторизации по паролю планировщик не может получить зашифрованный пароль

Btk_RestartJobEvent

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

После восстановления компонента учитывайте тип запуска: одноразовый триггер выполняется при первой возможности, а пропущенный периодический запуск не выполняется задним числом.

Настройки планировщика#

Настройки Quartz находятся по пути: Приложение «Настройка системы» > Настройки и сервисы > Настройка модулей системы > Общие настройки модулей > btk > Планировщик задач > Настройки для Quartz. Системное имя объекта настройки — cQuartzProps.

Параметры cQuartzProps#

Параметр

Назначение

soapHost

Узел ApplicationServer, принимающий SOAP-запросы планировщика

soapPort

Порт SOAP/HTTP ApplicationServer, а не отдельный порт Quartz

soapReqStr

Путь SOAP-точки ApplicationServer

database

Идентификатор базы данных, передаваемый при выполнении задания

login

Учетная запись подключения планировщика

pass

Пароль подключения, получаемый из защищенного хранилища

publicKey

Публичный ключ для проверки токена планировщика

isHttpsEnabled

Признак использования HTTPS

restAcquireJobReqStr

Путь REST-точки получения активных заданий

restAcquireThreadPoolSizeReqStr

Путь REST-точки получения размеров пулов потоков

restLockServerOnSchedulerReqStr

Путь REST-точки регистрации активного экземпляра планировщика

restSchedulerLockFrequency

Интервал повторной регистрации активного планировщика

Адреса узлов, порты, логины, ключи и интервалы определяются для каждого контура. Значения soapReqStr, restAcquireJobReqStr, restAcquireThreadPoolSizeReqStr и restLockServerOnSchedulerReqStr обычно одинаковы для всех баз. Изменяйте эти пути только для проектной модификации планировщика.

Изменение cQuartzProps автоматически запускает принудительную синхронизацию заданий с Quartz. Перед сохранением убедитесь, что новые параметры обеспечивают доступ планировщика к ApplicationServer.

Конфигурация процесса jobscheduler#

Процесс jobscheduler запускается отдельно от ApplicationServer. Для подключения к Quartz JobStore ему нужен файл quartz.properties. В поставочном шаблоне конфигурации используются следующие параметры:

org.quartz.scheduler.instanceName = PostgresScheduler
org.quartz.scheduler.instanceId = AUTO

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 500

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
org.quartz.jobStore.dataSource = quartzDS
org.quartz.jobStore.dontSetAutoCommitFalse = false

org.quartz.dataSource.quartzDS.driver = org.postgresql.Driver
org.quartz.dataSource.quartzDS.URL = jdbc:postgresql://<host>:<port>/<database>
org.quartz.dataSource.quartzDS.user = <user>
org.quartz.dataSource.quartzDS.password = <password>

org.quartz.jobStore.tablePrefix = btk_qrtz_
org.terracotta.quartz.skipUpdateCheck = true

Параметр org.quartz.threadPool.threadCount задает размер пула из конфигурации Quartz. Лимиты конкурентных запусков конкретного задания настраиваются отдельно параметрами задания и не заменяются этим значением.

В рабочей конфигурации замените URL, имя пользователя и пароль на значения целевого контура. Не храните эти значения в документации или в скриптах общего доступа.

Расположение quartz.properties, logback.xml, исполняемого файла и служебных скриптов определяется поставкой. При развертывании планировщика в его каталог передаются оба файла конфигурации, а служба запускается отдельными скриптами globalscheduler.sh и globalschedulerStop.sh. Имя службы, unit-файл и конкретная команда запуска могут отличаться в разных окружениях.

Не запускайте независимый локальный экземпляр планировщика одновременно со штатным экземпляром для того же Quartz JobStore. Несколько экземпляров допустимы только при общей настройке REST-lock или PostgreSQL advisory lock, описанной в разделе «Блокировка планировщиков».

Путь к журналам Quartz#

Настройка Путь до логов планировщика задает каталог, из которого интерфейс читает текстовые журналы для вкладки «Журнал Quartz». Ее системное имя shedulerLogPath содержит историческую опечатку и должно использоваться без исправления.

Если вкладка не показывает журнал, проверьте значение настройки, наличие файлов и права ApplicationServer на чтение каталога.

Формат и политика ротации журнала задаются конфигурацией Logback конкретной поставки. Старые примеры с фиксированными Windows-путями не являются универсальной настройкой и не должны копироваться в рабочий контур.

Безопасность и полномочия#

Основной способ аутентификации использует пару ключей. Приватный ключ хранится только в конфигурации jobscheduler, а публичный ключ — в настройках ApplicationServer. Планировщик формирует JWT типа scheduler, и сервер проверяет токен по публичному ключу.

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

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

Конкретные роли для просмотра менеджера и выполнения административных операций не зафиксированы в коде: доступ назначается стандартными полномочиями платформы в конфигурации конкретной базы данных.

Блокировка планировщиков#

Экземпляры jobscheduler, работающие с одним Quartz JobStore, должны использовать общий механизм блокировки. Поддерживаются REST-lock через ApplicationServer и PostgreSQL advisory lock через базу данных.

При REST-lock экземпляр периодически передает свой идентификатор и версию через REST-точку регистрации. Сервер сохраняет их вместе со временем последней регистрации в btk_qrtz_scheduler. Блокировка предоставляется, если она:

  • уже принадлежит этому экземпляру;

  • свободна;

  • не обновлялась дольше двух интервалов регистрации.

При PostgreSQL advisory lock координация выполняется в базе данных без регистрации REST-блокировки. Все экземпляры, обслуживающие один JobStore, должны использовать один выбранный механизм.

При использовании REST-lock проверяйте идентификатор, версию и время последней регистрации в btk_qrtz_scheduler, а также значение restSchedulerLockFrequency. Для PostgreSQL advisory lock проверяйте доступность базы данных и единообразие конфигурации экземпляров.

Синхронизация с Quartz#

Записи Btk_Job и Btk_JobSchedule содержат конфигурацию менеджера заданий. Таблицы btk_qrtz_* — производное представление, которое использует планировщик.

При изменении задания или расписания система устанавливает bSync = 0 и после сохранения изменений обновляет Quartz:

  • создает или заменяет включенное задание и его активные расписания;

  • удаляет выключенные или удаленные расписания;

  • удаляет из Quartz выключенное задание;

  • устанавливает bSync = 1 после обработки конфигурации.

Значение bSync = 0 непосредственно после изменения допустимо. Если оно сохраняется, проверьте журнал ApplicationServer и доступность таблиц Quartz: синхронизация могла завершиться ошибкой.

Принудительная синхронизация#

Операция Синхронизировать все очищает рабочие таблицы заданий и триггеров Quartz, сбрасывает признаки синхронизации и формирует записи заново из Btk_Job и Btk_JobSchedule. Конфигурация заданий, расписания и журнал событий менеджера при этом не удаляются. Запланированные одноразовые события восстанавливаются при повторном формировании записей Quartz.

Внимание

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

Операция оправдана после подтвержденного рассогласования, изменения cQuartzProps или восстановления таблиц Quartz. Сохранение cQuartzProps вызывает ее автоматически.

Состояния выполнения#

Состояние события менеджера и состояние триггера Quartz описывают разные этапы и не должны сравниваться как одно поле.

Состояния события#

Состояние

Значение

Запланировано

Событие создано и ожидает передачи на выполнение

Выполняется

Серверная сессия выполняет задание

Выполнено

Выполнение завершилось успешно

Ошибка

Выполнение завершилось с ошибкой

Остановлено

Пользователь остановил выполнение или отменил ожидающий запуск

Состояния триггера Quartz#

Состояние

Значение для диагностики

WAITING

Триггер ожидает расчетного времени запуска

ACQUIRED

Планировщик получил триггер для выполнения

BLOCKED

Триггер ожидает завершения неконкурентного запуска того же задания

COMPLETE

Одноразовый триггер завершен

ERROR

Quartz не может корректно обработать триггер

Активное выполнение отражается отдельной записью Quartz о сработавшем триггере и состоянием EXECUTING. Это не постоянное состояние записи в btk_qrtz_triggers.

Пропущенное время запуска#

Для периодического Cron-расписания действует политика DoNothing: если расчетное время пропущено, этот запуск не выполняется задним числом, а триггер ожидает следующее подходящее время.

Для одноразового события действует политика FireNow: после восстановления работы планировщик запускает его при первой возможности.

Наблюдение за работой#

Для штатного контроля используйте список заданий, журнал событий, вкладку «Журнал Quartz» и операцию Открыть отчет по задачам в интерфейсе менеджера.

Служебные REST-точки задаются в cQuartzProps и используются планировщиком:

  • получение активных заданий возвращает имя задания, имя триггера, идентификатор серверной сессии и узел кластера, чтобы планировщик мог сопоставить Quartz-запуски с фактическими выполнениями в ApplicationServer;

  • получение размеров пулов возвращает текущие лимиты потоков, чтобы планировщик применял актуальные ограничения конкурентных заданий;

  • регистрация планировщика обновляет его идентификатор, версию и время последней регистрации, чтобы продлить REST-блокировку и подтвердить активный master-процесс.

Не вызывайте служебные REST-точки вручную без эксплуатационной необходимости и настроенной аутентификации.

Автоматическое восстановление#

Системное задание Btk_RestartJobEvent запускается каждые пять минут и проверяет события менеджера. Оно:

  • переводит событие «Выполняется» в состояние «Ошибка» с сообщением «Сессия прервана», если связанная рабочая сессия отсутствует;

  • восстанавливает триггер запланированного одноразового события, если запись Quartz пропала;

  • повторно переводит завершенное событие в состояние «Запланировано», если для него разрешен перезапуск и остались попытки, уменьшает число оставшихся попыток и создает триггер.

Задание восстановления само выполняется через планировщик. Если jobscheduler не работает, проверка и восстановление событий также не выполняются.

Ручной перезапуск повторно планирует выбранное событие, если задание включено. Для выполняющегося или уже запланированного события система сначала останавливает либо отменяет текущий запуск. При остановке выполняющегося события связанная серверная сессия ищется по идентификаторам задания, триггера и события во всем кластере и затем завершается.

Диагностика по симптомам#

Следующее время запуска не рассчитано#

  1. Проверьте, включены ли задание и расписание.

  2. Проверьте даты действия и параметры расписания.

  3. Проверьте bSync и наличие триггера в btk_qrtz_triggers.

  4. Изучите журнал ApplicationServer на наличие ошибки синхронизации.

  5. Выполняйте принудительную синхронизацию только после подтверждения рассогласования.

bSync остается равным нулю#

  1. Проверьте журнал ApplicationServer после последнего изменения задания.

  2. Проверьте доступность таблиц btk_qrtz_* и корректность конфигурации задания и расписания.

  3. Устраните исходную ошибку синхронизации.

  4. Повторно сохраните конфигурацию или выполните принудительную синхронизацию, если рассогласование подтверждено.

Расчетное время прошло без запуска#

  1. Проверьте, работал ли jobscheduler в расчетный момент.

  2. Проверьте состояние триггера и журнал Quartz.

  3. Проверьте доступность ApplicationServer и результат SOAP-вызова.

  4. Для периодического расписания учтите политику DoNothing: пропущенный запуск не восстанавливается.

  5. Для одноразового события проверьте наличие триггера и работу задания восстановления.

Триггер ожидает, но запуск не начинается#

  1. Проверьте время последней регистрации и версию активного планировщика.

  2. Проверьте доступность SOAP-точки ApplicationServer.

  3. Проверьте JWT, публичный ключ и учетные данные планировщика.

  4. Проверьте состояния ACQUIRED и BLOCKED, активные сессии и лимит потоков.

  5. Для конкурентного запуска проверьте группу очереди и совместимость версии планировщика.

Событие долго выполняется#

  1. Сравните текущую продолжительность с полем Среднее время выполнения и ожидаемой продолжительностью этого задания.

  2. Если выполнение укладывается в обычный интервал, продолжайте наблюдение.

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

  4. Проверьте журнал события, журнал Quartz и трассировку задания, если она включена.

  5. Если сессия существует, определите выполняемый метод или внешнее ожидание.

  6. Если сессии нет, проверьте выполнение Btk_RestartJobEvent.

  7. Останавливайте сессию только с учетом возможного отката ее транзакции.

Запланированное событие не имеет триггера#

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

Запуск завершился ошибкой доступного интервала#

Задание не выполняется, если момент запуска не входит в настроенные доступные интервалы. Проверьте вкладку «Доступные интервалы», дату и время события, затем запланируйте новый запуск при необходимости.

Журнал Quartz недоступен#

  1. Проверьте значение shedulerLogPath.

  2. Проверьте наличие файлов журнала в указанном каталоге.

  3. Проверьте права ApplicationServer на чтение каталога.

  4. Проверьте, пишет ли jobscheduler журнал в этот каталог согласно эксплуатационной конфигурации.

Операция запуска недоступна#

Одноразовый запуск выключенного задания запрещен. Включите задание и дождитесь его синхронизации с Quartz, затем повторите операцию.

SOAP возвращает ошибку авторизации#

  1. Проверьте настройку HTTPS и адрес SOAP-точки.

  2. Для аутентификации по ключам проверьте логин, наличие приватного ключа в jobscheduler и соответствие публичного ключа в ApplicationServer.

  3. Для устаревшей авторизации по паролю проверьте логин, пароль и защищенное хранилище, если пароль зашифрован.

Границы эксплуатационной документации#

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

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