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

Манифест 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Флажок
choiceSelect (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).