Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье описывается, как работать с триггерами таймера в службе "Функции Azure". Триггер таймера позволяет выполнять функцию по расписанию.
Это справочные сведения для разработчиков функций Azure. Если вы новичок в функциях Azure, начните со следующих ресурсов:
Ссылки для разработчиков C#:
Сведения о том, как вручную запустить функцию, активируемую с помощью таймера, см. в статье о ручном запуске функции, неактивируемой HTTP-запросом.
Поддержка этой привязки автоматически предоставляется во всех средах разработки. Не нужно вручную устанавливать пакет или регистрировать расширение.
Source code for the timer extension package is in the azure-webjobs-sdk-extensions GitHub repository.
Important
В этой статье используются вкладки для поддержки нескольких версий модели программирования Node.js. Модель версии 4 общедоступна и предназначена для более гибкого и интуитивно понятного интерфейса для разработчиков JavaScript и TypeScript. Дополнительные сведения о том, как работает модель версии 4, см. в руководстве разработчика по Функции Azure Node.js. To learn more about the differences between v3 and v4, refer to the migration guide.
Функции Azure поддерживает две модели программирования для Python. Способ определения привязок зависит от выбранной модели программирования.
Модель программирования Python версии 2 позволяет определять привязки с помощью декораторов непосредственно в коде функции Python. Дополнительные сведения см. в руководстве разработчика Python.
Эта статья поддерживает обе модели программирования.
Example
В этом примере показана функция C#, которая выполняется каждый раз, когда значение минут кратное пяти. Например, если функция запускается в 18:55:00, следующее выполнение будет в 19:00:00. Объект TimerInfo
передается в функцию.
Функцию C# можно создать с помощью одного из следующих режимов C#:
-
Изолированная рабочая модель: скомпилированная функция C#, которая выполняется в рабочем процессе, изолированном от среды выполнения. Изолированный рабочий процесс необходим для поддержки функций C#, работающих в LTS и не LTS-версиях .NET и платформа .NET Framework. Расширения для изолированных рабочих процессов используют
Microsoft.Azure.Functions.Worker.Extensions.*
пространства имен. -
In-process model: Compiled C# function that runs in the same process as the Functions runtime. In a variation of this model, Functions can be run using C# scripting, which is supported primarily for C# portal editing. Расширения для функций в процессе используют
Microsoft.Azure.WebJobs.Extensions.*
пространства имен.
Important
Поддержка будет завершена для модели в процессе 10 ноября 2026 г. Настоятельно рекомендуется перенести приложения в изолированную рабочую модель для полной поддержки.
[Function(nameof(TimerFunction))]
[FixedDelayRetry(5, "00:00:10")]
public static void Run([TimerTrigger("0 */5 * * * *")] TimerInfo timerInfo,
FunctionContext context)
{
var logger = context.GetLogger(nameof(TimerFunction));
logger.LogInformation($"Function Ran. Next timer schedule = {timerInfo.ScheduleStatus?.Next}");
}
Следующий пример функции активируется и выполняется каждые пять минут. The @TimerTrigger
annotation on the function defines the schedule using the same string format as CRON expressions.
@FunctionName("keepAlive")
public void keepAlive(
@TimerTrigger(name = "keepAliveTrigger", schedule = "0 */5 * * * *") String timerInfo,
ExecutionContext context
) {
// timeInfo is a JSON string, you can deserialize it to an object using your favorite JSON library
context.getLogger().info("Timer is triggered: " + timerInfo);
}
В следующем примере показана привязка триггера таймера и код функции, использующий привязку, где экземпляр, представляющий таймер, передается функции. Эта функция выполняет запись в журнал, указывая, когда ее вызов выполняется из-за пропущенного запуска по расписанию. Пример зависит от того, используется ли модель программирования Python версии 1 или версии 2.
import datetime
import logging
import azure.functions as func
app = func.FunctionApp()
@app.function_name(name="mytimer")
@app.timer_trigger(schedule="0 */5 * * * *",
arg_name="mytimer",
run_on_startup=False)
def test_function(mytimer: func.TimerRequest) -> None:
utc_timestamp = datetime.datetime.utcnow().replace(
tzinfo=datetime.timezone.utc).isoformat()
if mytimer.past_due:
logging.info('The timer is past due!')
logging.info('Python timer trigger function ran at %s', utc_timestamp)
The following example shows a timer trigger TypeScript function.
import { app, InvocationContext, Timer } from '@azure/functions';
export async function timerTrigger1(myTimer: Timer, context: InvocationContext): Promise<void> {
context.log('Timer function processed request.');
}
app.timer('timerTrigger1', {
schedule: '0 */5 * * * *',
handler: timerTrigger1,
});
The following example shows a timer trigger JavaScript function.
Here's the binding data in the function.json file:
{
"schedule": "0 */5 * * * *",
"name": "myTimer",
"type": "timerTrigger",
"direction": "in"
}
Далее приведен код функции таймера в файле run.ps1:
# Input bindings are passed in via param block.
param($myTimer)
# Get the current universal time in the default string format.
$currentUTCtime = (Get-Date).ToUniversalTime()
# The 'IsPastDue' property is 'true' when the current function invocation is later than scheduled.
if ($myTimer.IsPastDue) {
Write-Host "PowerShell timer is running late!"
}
# Write an information log with the current time.
Write-Host "PowerShell timer trigger function ran! TIME: $currentUTCtime"
Attributes
In-process C# library uses TimerTriggerAttribute from Microsoft.Azure.WebJobs.Extensions whereas isolated worker process C# library uses TimerTriggerAttribute from Microsoft.Azure.Functions.Worker.Extensions.Timer to define the function. Вместо этого в скрипте C# используется файл конфигурации function.json.
Attribute property | Description |
---|---|
Schedule | A CRON expression or a TimeSpan value.
TimeSpan можно использовать только для приложения-функции, которая работает в плане службы приложений. Вы можете поместить выражение расписания в параметр приложения и присвоить этому свойству имя параметра приложения, заключенное в знаки %, следующим образом: %ScheduleAppSetting% . |
RunOnStartup | Если настроено значение true , функция вызывается при запуске среды выполнения. Например, среда выполнения запускается, когда приложение-функция выходит из спящего режима (в который она перешла из-за отсутствия активности), При перезапуске приложения-функции из-за изменений функций и при горизонтальном масштабировании приложения-функции. Используйте с осторожностью.RunOnStartup редко должен быть установлен true , особенно в рабочей среде. |
UseMonitor | Установите значение true илиfalse , чтобы указать, следует ли отслеживать расписание. При мониторинге расписания его экземпляры сохраняются, чтобы обеспечить его корректную обработку даже при перезапуске экземпляров приложения-функции. Если значение явно не задано, для расписаний с интервалом повторения более чем 1 минута или равным 1 минуте по умолчанию используется true . Для расписаний, выполняющихся чаще одного раза в минуту, значением по умолчанию является false . |
Decorators
Применяется только к модели программирования Python версии 2.
Для функций Python версии 2, определенных с помощью декоратора, в следующих свойствах schedule
:
Property | Description |
---|---|
arg_name |
Имя переменной, представляющей объект таймера в коде функции. |
schedule |
A NCRONTAB expression or a TimeSpan value.
TimeSpan можно использовать только для приложения-функции, которая работает в плане службы приложений. Вы можете поместить выражение расписания в параметр приложения и присвоить этому свойству имя параметра приложения, заключенное в знаки %, например: "%ScheduleAppSetting%". |
run_on_startup |
Если настроено значение true , функция вызывается при запуске среды выполнения. Например, среда выполнения запускается, когда приложение-функция выходит из спящего режима (в который она перешла из-за отсутствия активности), При перезапуске приложения-функции из-за изменений функций и при горизонтальном масштабировании приложения-функции. Используйте с осторожностью.runOnStartup редко должен быть установлен true , особенно в рабочей среде. |
use_monitor |
Установите значение true илиfalse , чтобы указать, следует ли отслеживать расписание. При мониторинге расписания его экземпляры сохраняются, чтобы обеспечить его корректную обработку даже при перезапуске экземпляров приложения-функции. Если значение явно не задано, для расписаний с интервалом повторения более чем 1 минута или равным 1 минуте по умолчанию используется true . Для расписаний, выполняющихся чаще одного раза в минуту, значением по умолчанию является false . |
For Python functions defined by using function.json, see the Configuration section.
Annotations
The @TimerTrigger
annotation on the function defines the schedule
using the same string format as CRON expressions. Эта заметка поддерживает следующие параметры:
Configuration
Применяется только к модели программирования Python версии 1.
В следующей таблице описываются свойства, которые можно задать для options
объекта, переданного методу app.timer()
.
Property | Description |
---|---|
schedule | A NCRONTAB expression or a TimeSpan value.
TimeSpan можно использовать только для приложения-функции, которая работает в плане службы приложений. Вы можете поместить выражение расписания в параметр приложения и присвоить этому свойству имя параметра приложения, заключенное в знаки %, например: "%ScheduleAppSetting%". |
runOnStartup | Если настроено значение true , функция вызывается при запуске среды выполнения. Например, среда выполнения запускается, когда приложение-функция выходит из спящего режима (в который она перешла из-за отсутствия активности), При перезапуске приложения-функции из-за изменений функций и при горизонтальном масштабировании приложения-функции. Используйте с осторожностью.runOnStartup редко должен быть установлен true , особенно в рабочей среде. |
useMonitor | Установите значение true илиfalse , чтобы указать, следует ли отслеживать расписание. При мониторинге расписания его экземпляры сохраняются, чтобы обеспечить его корректную обработку даже при перезапуске экземпляров приложения-функции. Если значение явно не задано, для расписаний с интервалом повторения более чем 1 минута или равным 1 минуте по умолчанию используется true . Для расписаний, выполняющихся чаще одного раза в минуту, значением по умолчанию является false . |
The following table explains the binding configuration properties that you set in the function.json file.
function.json property | Description |
---|---|
type | Этому свойству необходимо присвоить значение "timerTrigger". Это свойство задается автоматически при создании триггера на портале Azure. |
direction | Для этого свойства необходимо задать значение "in". Это свойство задается автоматически при создании триггера на портале Azure. |
name | Имя переменной, представляющей объект таймера в коде функции. |
schedule | A NCRONTAB expression or a TimeSpan value.
TimeSpan можно использовать только для приложения-функции, которая работает в плане службы приложений. Вы можете поместить выражение расписания в параметр приложения и присвоить этому свойству имя параметра приложения, заключенное в знаки %, например: "%ScheduleAppSetting%". |
runOnStartup | Если настроено значение true , функция вызывается при запуске среды выполнения. Например, среда выполнения запускается, когда приложение-функция выходит из спящего режима (в который она перешла из-за отсутствия активности), При перезапуске приложения-функции из-за изменений функций и при горизонтальном масштабировании приложения-функции. Используйте с осторожностью.runOnStartup редко должен быть установлен true , особенно в рабочей среде. |
useMonitor | Установите значение true илиfalse , чтобы указать, следует ли отслеживать расписание. При мониторинге расписания его экземпляры сохраняются, чтобы обеспечить его корректную обработку даже при перезапуске экземпляров приложения-функции. Если значение явно не задано, для расписаний с интервалом повторения более чем 1 минута или равным 1 минуте по умолчанию используется true . Для расписаний, выполняющихся чаще одного раза в минуту, значением по умолчанию является false . |
When you're developing locally, add your application settings in the local.settings.json file in the Values
collection.
Caution
Don't set runOnStartup to true
in production. Использование этого параметра заставляет код выполняться в очень непредсказуемое время. В определенных рабочих ситуациях эти дополнительные выполнения могут привести значительно более высоким затратам для приложений, размещенных в планах потребления. For example, with runOnStartup enabled the trigger is invoked whenever your function app is scaled. Make sure you fully understand the production behavior of your functions before enabling runOnStartup in production.
See the Example section for complete examples.
Usage
При вызове функции триггера с таймером объект таймера передается в функцию. Далее представлен JSON в качестве примера объекта таймера.
{
"Schedule":{
"AdjustForDST": true
},
"ScheduleStatus": {
"Last":"2016-10-04T10:15:00+00:00",
"LastUpdated":"2016-10-04T10:16:00+00:00",
"Next":"2016-10-04T10:20:00+00:00"
},
"IsPastDue":false
}
{
"schedule":{
"adjustForDST": true
},
"scheduleStatus": {
"last":"2016-10-04T10:15:00+00:00",
"lastUpdated":"2016-10-04T10:16:00+00:00",
"next":"2016-10-04T10:20:00+00:00"
},
"isPastDue":false
}
Значение свойства isPastDue
— true
, когда текущая функция вызывается позже запланированного. Например перезапуск приложения-функции может привести к тому, что вызов будет пропущен.
NCRONTAB expressions
Azure Functions uses the NCronTab library to interpret NCRONTAB expressions. Выражение NCRONTAB аналогично выражению CRON, за исключением того, что оно включает дополнительное шестое поле в начале для обеспечения точности времени в секундах:
{second} {minute} {hour} {day} {month} {day-of-week}
Каждое поле может принимать значение одного из следующих типов:
Type | Example | When triggered |
---|---|---|
Определенное значение | 0 5 * * * * |
Один раз каждый час дня на пятой минуте каждого часа |
Все значения (* ) |
0 * 5 * * * |
В каждую минуту в час, в течение часа 5 |
Диапазон (оператор - ) |
5-7 * * * * * |
Три раза в минуту — с 5-й по 7-ю секунды каждую минуту каждого часа каждого дня |
Набор значений (оператор , ) |
5,8,10 * * * * * |
Три раза в минуту — на 5-й, 8-й и 10-й секундах каждую минуту каждого часа каждого дня |
Значение интервала (оператор / ) |
0 */5 * * * * |
12 раз в час — в 0 секунд каждой 5-й минуты каждого часа каждого дня |
Чтобы указать дни или месяцы, можно использовать числовые значения, имена или сокращения:
- В течение нескольких дней числовые значения — от 0 до 6, где 0 начинается с воскресенья.
- Имена указываются на английском языке. Например:
Monday
,January
. - Регистр в именах не учитывается.
- Допускается сокращение имен. Мы рекомендуем использовать три буквы для аббревиаций. Например:
Mon
,Jan
.
NCRONTAB examples
Ниже приведены примеры выражений NCRONTAB, которые можно использовать для триггера таймера в службе "Функции Azure".
Example | When triggered |
---|---|
0 */5 * * * * |
через каждые пять минут |
0 0 * * * * |
через каждый час |
0 0 */2 * * * |
через каждые 2 часа |
0 0 9-17 * * * |
один раз в час с 9:00 до 17:00 |
0 30 9 * * * |
каждый день в 9:30 |
0 30 9 * * 1-5 |
каждый рабочий день в 9:30 |
0 30 9 * Jan Mon |
в 9:30 каждый понедельник в январе |
Note
NCRONTAB expression supports both five field and six field format. Позиция шестого поля — это значение секунд, которое расположено в начале выражения. Если выражение CRON является недопустимым, тест функции портала Azure отобразит ошибку 404, если Application Insights подключена к ней дополнительные сведения.
Часовые пояса NCRONTAB
Числа в выражении NCRONTAB ссылаются на время и дату, а не интервал времени. Например, значение 5 в поле hour
означает 5:00, а не каждые 5 часов.
Часовой пояс по умолчанию, используемый с выражениями CRON — время в формате UTC. Если нужно использовать другой часовой пояс в выражении CRON, создайте параметр приложения с именем WEBSITE_TIME_ZONE
для приложения-функции.
Значение этого параметра зависит от операционной системы и плана, в рамках которого выполняется приложение-функция.
Operating system | Plan | Value |
---|---|---|
Windows | All | Задайте в качестве значения имя нужного часового пояса, которое задается второй строкой каждой пары параметров, определяемых командой Windows tzutil.exe /L |
Linux | Premium Dedicated |
Set the value to the name of the desired time zone as shown in the tz database |
Note
WEBSITE_TIME_ZONE
и TZ
в настоящее время не поддерживаются при работе в Linux в плане потребления или потребления Flex. В этом случае параметр WEBSITE_TIME_ZONE
или TZ
может создавать проблемы, связанные с SSL, и привести к остановке работы метрик для приложения.
Например, для Восточного времени США (представленного параметром Eastern Standard Time
(в Windows) или America/New_York
(в Linux)) сейчас используется время со значением UTC-05:00 в зимний период и со значением UTC-04:00 в летний период. Чтобы триггер таймера срабатывал каждый день в 10:00 по восточному времени, создайте для приложения-функции параметр с именем WEBSITE_TIME_ZONE
, задайте ему значение Eastern Standard Time
(в Windows) или America/New_York
(в Linux), а затем используйте следующее выражение NCRONTAB:
"0 0 10 * * *"
При использовании WEBSITE_TIME_ZONE
время корректируется для изменения времени в определенном часовом поясе, включая летнее время и изменения в стандартном времени.
TimeSpan
TimeSpan
можно использовать только для приложения-функции, которая работает в плане службы приложений.
В отличие от выражения NCRONTAB, TimeSpan
значение указывает интервал времени между вызовом каждой функции. Если функция будет выполняться дольше заданного временного интервала, она немедленно будет активирована таймером.
Когда значения выражения TimeSpan
в виде стоки меньше 24, hh:mm:ss
будет использовать формат hh
. Когда первые две цифры больше или равны 24, будет использован следующий формат dd:hh:mm
. Далее приводятся некоторые примеры.
Example | When triggered |
---|---|
"01:00:00" | every hour |
"00:01:00" | every minute |
"25:00:00:00" | каждые 25 дней |
"1.00:00:00" | every day |
Scale-out
Если приложение-функция будет развернуто на несколько экземпляров, то только один из экземпляров активируемой по таймеру функции выполняется для всех экземпляров. Он не будет запускаться снова, если выдающийся вызов по-прежнему запущен.
Совместное использование хранилища приложениями-функциями
При совместном использовании учетных записей хранения в приложениях-функциях, которые не развернуты в службе приложений, может потребоваться явно назначить идентификатор узла каждому приложению.
Functions version | Setting |
---|---|
2.x (и более поздние версии) | Переменная среды AzureFunctionsWebHost__hostid . |
1.x |
id in host.json |
Вы можете пропустить идентифицирующее значение или вручную задать другое значение для каждой идентифицирующей конфигурации приложения-функции.
Для триггера таймера используется блокировка хранилища. Она гарантирует наличие только одного экземпляра таймера, когда приложение-функция масштабируется до нескольких экземпляров. Если у двух приложений-функций одна идентифицирующая конфигурация и для каждого используется триггер таймера, запустится только один таймер.
Retry behavior
В отличие от триггера очереди триггер таймера не осуществляет повторную попытку после того, как произошла ошибка выполнения функции. Когда функция возвращает ошибку, следующий раз она будет вызвана только по расписанию.
Вызов триггера таймера вручную
Триггер таймера для Функций Azure предоставляет веб-перехватчик HTTP, который можно вызвать для запуска функции вручную. Это может быть полезным в указанных ниже случаях.
- Integration testing
- Переключение слотов в рамках теста состояния или действия прогрева.
- Начальное развертывание функции для немедленного заполнения кэша или таблицы подстановки в базе данных.
Подробную информацию о том, как вручную вызвать функцию, активируемую по таймеру, см. в статье о ручном запуске функции, не активируемой HTTP-запросом.
Troubleshooting
Дополнительные сведения о том, что делать, когда триггер таймера неисправен, см. в разделе Расследование проблем, когда функции, вызываемые таймером, не срабатывают.
Connections
Триггеры таймера имеют неявную зависимость от хранилища BLOB-объектов, за исключением локального запуска с помощью Функции Azure основных средств. Система использует хранилище BLOB-объектов для координации между несколькими экземплярами при горизонтальном масштабировании приложения. Он обращается к хранилищу BLOB-объектов с помощью подключения к хранилищу узлов .AzureWebJobsStorage
If you configure the host storage to use an identity-based connection, the identity should have the Storage Blob Data Owner role, which is the default requirement for host storage.