Манифест Timer Job
Манифест Timer Job
Файл manifest.json в корне пакета .portaltimer:
{ "id": "contoso.heartbeat", "title": "Contoso Heartbeat", "version": "1.0.0", "description": "Пример Timer Job — пишет сообщение в лог worker", "entry": "dist/Contoso.Heartbeat.dll", "entryType": "Contoso.HeartbeatTimerJob", "serviceKey": "timer-extensions", "configSchema": { "message": { "type": "text", "label": "Сообщение в лог" } }}Поля манифеста
| Поле | Обязательно | Описание |
|---|---|---|
id | да | Уникальный ключ vendor.name (латиница, точки). Становится job_type в очереди |
title | да | Название в каталоге админки |
version | да | Semver (1.0.0). При обновлении пакета увеличивайте версию |
description | нет | Описание для администратора |
entry | да | Путь к .dll внутри ZIP (например dist/Contoso.Heartbeat.dll) |
entryType | да | Полное имя C#-класса, реализующего ITimerJob |
serviceKey | нет | Служба-исполнитель в portal_jobs (по умолчанию timer-extensions) |
configSchema | нет | Схема параметров экземпляра задания (форма в админке) |
Правила id
- Формат:
vendor.name— строчные латинские буквы, цифры, дефисы, точки - Примеры:
contoso.heartbeat,acme.nightly-sync idдолжен совпадать сjob_typeпри постановке в очередь
serviceKey
По умолчанию timer-extensions. Служба создаётся автоматически при первой установке пакета.
Меняйте serviceKey только если обработчик должен выполняться в контексте другой зарегистрированной службы (редкий случай).
configSchema
Описывает поля формы параметров экземпляра (timer_jobs.config). Админка строит форму при создании задания.
| type | Описание |
|---|---|
text | Строка |
multiline | Текстовая область |
number | Число |
boolean | Флажок |
choice | Select (choices: [{value, label}]) |
Пример с несколькими полями:
{ "configSchema": { "listId": { "type": "text", "label": "UUID списка для обработки" }, "dryRun": { "type": "boolean", "label": "Только проверка, без записи" }, "mode": { "type": "choice", "label": "Режим", "choices": [ { "value": "full", "label": "Полная синхронизация" }, { "value": "delta", "label": "Только изменения" } ] } }}Значения попадают в context.Config при выполнении:
var dryRun = context.Config.TryGetProperty("dryRun", out var el) && el.ValueKind == JsonValueKind.True;var listId = context.Config.TryGetProperty("listId", out var idEl) ? idEl.GetString() : null;Структура пакета
heartbeat.portaltimer (ZIP)├── manifest.json└── dist/ └── Contoso.Heartbeat.dllМаксимальный размер пакета — 5 МБ.
При повторной загрузке пакета с тем же id старый пакет заменяется (см. cli.md).