Перейти к содержимому

Timer Jobs

Timer Jobs Portal

Система заданий по расписанию (аналог SharePoint Timer Jobs): разработчик пишет C#-обработчик, упаковывает в .portaltimer, администратор настраивает расписание в админке.

Обзор

  • Пакеты.portaltimer (ZIP с manifest.json + C# DLL)
  • SDKPortal.TimerJob.Sdk (ITimerJob)
  • Шаблонdotnet new portal-timerjob (см. backend/templates/portal-timerjob/)
  • Worker — планировщик cron + очередь portal_jobs

Документация:

Архитектура

Админка → timer_jobs (расписание + config)
CronSchedulerService (каждую минуту) → portal_jobs (pending)
JobQueueWorker → JobProcessor → TimerJobPackageLoader
ITimerJob.ExecuteAsync(context, api)
СущностьТаблица / ключОписание
Пакетtimer_job_packagesZIP в объектном хранилище (S3)
Определениеtimer_job_definitionsОбработчик из manifest (job_type = manifest.id)
Экземплярtimer_jobsКонкретное задание: расписание + config
Выполнениеportal_jobsЗапись в очереди Worker

Один пакет → одно определение → много экземпляров с разным расписанием и config (например, два heartbeat с разными сообщениями).

Часовой пояс планировщика — локальный сервера Worker (TimeZoneInfo.Local).

Быстрый старт (разработчик)

Окно терминала
cd packages/timer-job-examples/heartbeat
./build.sh

Результат: dist/heartbeat.portaltimerАдминка → Timer Jobs → загрузить пакет.

  1. Создайте экземпляр задания (например, «Каждую минуту») с config: { "message": "hello" }
  2. Нажмите Запуск или дождитесь cron
  3. В логах Worker: [timer-job] Contoso heartbeat: hello ...

Пример: packages/timer-job-examples/heartbeat/.

Быстрый старт (администратор)

  1. Админка → Timer Jobs — установить пакет .portaltimer
  2. Убедиться, что служба timer-extensions включена и Worker запущен (docker compose up -d worker)
  3. + Timer Job — выбрать обработчик, расписание, параметры config
  4. Запуск — ручной запуск без ожидания cron
  5. Админка → Задания — статус выполнения (pendingcompleted / failed)

При установке или удалении пакета API уведомляет Worker через Valkey — перезапуск контейнера не нужен.

Timer Job vs Event Receiver

Timer JobEvent Receiver
ТриггерРасписание (cron)Событие домена (listItem.updated)
Пакет.portaltimer.portalevent
КонтрактITimerJobIEventReceiver
API в обработчикеЛог + постановка jobsСписки, узлы, jobs
Типичный сценарийНочная синхронизация, отчётыРеакция на изменение элемента

Для реакции на события используйте Event Receivers. Для периодических задач — Timer Jobs.