Azure İşlevleri için zamanlayıcı tetikleyicisi

Bu makalede, Azure İşlevleri'da zamanlayıcı tetikleyicileriyle çalışma açıklanmaktadır. Zamanlayıcı tetikleyicisi, bir işlevi zamanlamaya göre çalıştırmanıza olanak tanır.

Bu, Azure İşlevleri geliştiricilerin başvuru bilgileridir. Azure İşlevleri kullanmaya yeni başladıysanız aşağıdaki kaynaklarla başlayın:

Zamanlayıcıyla tetiklenen bir işlevi el ile çalıştırma hakkında bilgi için bkz . HTTP ile tetiklenmeyen bir işlevi el ile çalıştırma.

Bu bağlama desteği tüm geliştirme ortamlarında otomatik olarak sağlanır. Paketi el ile yüklemeniz veya uzantıyı kaydetmeniz gerekmez.

Zamanlayıcı uzantısı paketinin kaynak kodu azure-webjobs-sdk-extensions GitHub deposundadır.

Önemli

Bu makalede, Node.js programlama modelinin birden çok sürümünü desteklemek için sekmeler kullanılır. Genel kullanıma sunulan v4 modeli, JavaScript ve TypeScript geliştiricileri için daha esnek ve sezgisel bir deneyime sahip olacak şekilde tasarlanmıştır. v4 modelinin nasıl çalıştığı hakkında daha fazla bilgi için Azure İşlevleri Node.js geliştirici kılavuzuna bakın. v3 ile v4 arasındaki farklar hakkında daha fazla bilgi edinmek için geçiş kılavuzuna bakın.

Azure İşlevleri, Python için iki programlama modelini destekler. Bağlamalarınızı tanımlama şekliniz seçtiğiniz programlama modeline bağlıdır.

Python v2 programlama modeli, doğrudan Python işlev kodunuzda dekoratörleri kullanarak bağlamaları tanımlamanıza olanak tanır. Daha fazla bilgi için bkz . Python geliştirici kılavuzu.

Bu makale her iki programlama modelini de destekler.

Örnek

Bu örnekte, dakikaların beşe bölünebilen bir değeri her seferinde yürütülen bir C# işlevi gösterilir. Örneğin, işlev 18:55:00'da başladığında, sonraki yürütme 19:00:00'da olur. TimerInfo İşleve bir nesne geçirilir.

C# işlevi aşağıdaki C# modlarından biri kullanılarak oluşturulabilir:

  • Yalıtılmış çalışan modeli: Çalışma zamanından yalıtılmış bir çalışan işleminde çalışan derlenmiş C# işlevi. LTS ve .NET ve .NET Framework dışındaki sürümlerde çalışan C# işlevlerini desteklemek için yalıtılmış çalışan işlemi gereklidir. Yalıtılmış çalışan işlemi işlevleri için uzantılar ad alanlarını kullanır Microsoft.Azure.Functions.Worker.Extensions.* .
  • İşlem içi model: İşlevler çalışma zamanıyla aynı işlemde çalışan derlenmiş C# işlevi. Bu modelin bir varyasyonunda, İşlevler öncelikle C# portalı düzenleme için desteklenen C# betiği kullanılarak çalıştırılabilir. İşlem içi işlevlerin uzantıları ad alanlarını kullanır Microsoft.Azure.WebJobs.Extensions.* .

Önemli

İşlem içi model desteği 10 Kasım 2026'da sona erecektir. Tam destek için uygulamalarınızı yalıtılmış çalışan modeline geçirmenizi kesinlikle öneririz.

//<docsnippet_fixed_delay_retry_example>
[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));

Aşağıdaki örnek işlev her beş dakikada bir tetikler ve yürütülür. @TimerTrigger İşlevdeki ek açıklama, CRON ifadeleriyle aynı dize biçimini kullanarak zamanlamayı tanımlar.

@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);
}

Aşağıdaki örnekte, zamanlayıcıyı temsil eden bir örneğin işleve geçirildiği bağlamayı kullanan bir zamanlayıcı tetikleyici bağlaması ve işlev kodu gösterilmektedir. İşlev, bu işlev çağrısının yanlış bir zamanlama oluşumundan kaynaklanıp kaynaklanmadığını belirten bir günlük yazar. Örnek, v1 veya v2 Python programlama modelini kullanıp kullanmadığınıza bağlıdır.

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=True) 
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)

Aşağıdaki örnekte bir zamanlayıcı tetikleyicisi TypeScript işlevi gösterilmektedir.

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,
});

Aşağıdaki örnekte bir zamanlayıcı tetikleyicisi JavaScript işlevi gösterilmektedir.

const { app } = require('@azure/functions');

app.timer('timerTrigger1', {
    schedule: '0 */5 * * * *',
    handler: (myTimer, context) => {
        context.log('Timer function processed request.');
    },
});

function.json dosyasındaki bağlama verileri aşağıdadır:

{
    "schedule": "0 */5 * * * *",
    "name": "myTimer",
    "type": "timerTrigger",
    "direction": "in"
}

Run.ps1 dosyasındaki zamanlayıcı işlev kodu aşağıdadır:

# 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"

Özellikler

İşlem içi C# kitaplığıNda Microsoft.Azure.WebJobs.Extensions'tanTimerTriggerAttribute kullanılırken, yalıtılmış çalışan işlemi C# kitaplığı işlevi tanımlamak için Microsoft.Azure.Functions.Worker.Extensions.Timer dosyasından TimerTriggerAttribute kullanır. C# betiği bunun yerine bir function.json yapılandırma dosyası kullanır.

Öznitelik özelliği Açıklama
Plan CRON ifadesi veya TimeSpan değeri. yalnızca TimeSpan App Service Planı üzerinde çalışan bir işlev uygulaması için kullanılabilir. Zamanlama ifadesini bir uygulama ayarına yerleştirebilir ve bu özelliği olarak işaretlerde % sarmalanmış uygulama ayarı adı olarak %ScheduleAppSetting%ayarlayabilirsiniz.
RunOnStartup ise true, çalışma zamanı başlatıldığında işlev çağrılır. Örneğin işlev uygulaması etkinlik dışı olması nedeniyle boşta kaldıktan sonra uyandırıldığında çalışma zamanı başlatılır. işlev değişiklikleri nedeniyle işlev uygulaması yeniden başlatıldığında ve işlev uygulamasının ölçeği genişletildiğinde. Dikkatli kullanın.RunOnStartup , özellikle üretimde olarak ayarlanmadıysa truenadiren ayarlanmalıdır.
UseMonitor Zamanlamanın izlenip izlenmeyeceğini göstermek üzere true veya false olarak ayarlayın. Zamanlama izleme, işlev uygulaması örnekleri yeniden başlatıldığında bile zamanlamanın doğru bir şekilde korunmasına yardımcı olmak için zamanlama yinelemelerinde kalıcı olur. Açıkça ayarlanmazsa, varsayılan değer true 1 dakikadan büyük veya buna eşit bir yineleme aralığına sahip zamanlamalar içindir. Dakikada bir kereden fazla tetikleyen zamanlamalar için varsayılan değerdir false.

Dekoratörler

Yalnızca Python v2 programlama modeli için geçerlidir.

Bir dekoratör kullanılarak tanımlanan Python v2 işlevleri için, üzerinde aşağıdaki özellikler:schedule

Özellik Açıklama
arg_name İşlev kodundaki zamanlayıcı nesnesini temsil eden değişkenin adı.
schedule CRON ifadesi veya TimeSpan değeri. yalnızca TimeSpan App Service Planı üzerinde çalışan bir işlev uygulaması için kullanılabilir. Zamanlama ifadesini bir uygulama ayarına ekleyebilir ve bu özelliği şu örnekte olduğu gibi işaretlerde % sarmalanmış uygulama ayarı adı olarak ayarlayabilirsiniz: "%ScheduleAppSetting%".
run_on_startup ise true, çalışma zamanı başlatıldığında işlev çağrılır. Örneğin işlev uygulaması etkinlik dışı olması nedeniyle boşta kaldıktan sonra uyandırıldığında çalışma zamanı başlatılır. işlev değişiklikleri nedeniyle işlev uygulaması yeniden başlatıldığında ve işlev uygulamasının ölçeği genişletildiğinde. Dikkatli kullanın.runOnStartup , özellikle üretimde olarak ayarlıysa truenadiren olmalıdır.
use_monitor Zamanlamanın izlenip izlenmeyeceğini göstermek üzere true veya false olarak ayarlayın. Zamanlama izleme, işlev uygulaması örnekleri yeniden başlatıldığında bile zamanlamanın doğru bir şekilde korunmasına yardımcı olmak için zamanlama yinelemelerinde kalıcı olur. Açıkça ayarlanmazsa, varsayılan değer true 1 dakikadan büyük veya buna eşit bir yineleme aralığına sahip zamanlamalar içindir. Dakikada bir kereden fazla tetikleyen zamanlamalar için varsayılan değerdir false.

function.json kullanılarak tanımlanan Python işlevleri için Yapılandırma bölümüne bakın.

Ek Açıklamalar

@TimerTrigger İşlevdeki ek açıklama, CRON ifadeleriyle aynı dize biçimini kullanarak öğesini tanımlarschedule. Ek açıklama aşağıdaki ayarları destekler:

Yapılandırma

Yalnızca Python v1 programlama modeli için geçerlidir.

Aşağıdaki tabloda, yöntemine geçirilen app.timer() nesnede options ayarlayabileceğiniz özellikler açıklanmaktadır.

Özellik Açıklama
schedule CRON ifadesi veya TimeSpan değeri. yalnızca TimeSpan App Service Planı üzerinde çalışan bir işlev uygulaması için kullanılabilir. Zamanlama ifadesini bir uygulama ayarına ekleyebilir ve bu özelliği şu örnekte olduğu gibi işaretlerde % sarmalanmış uygulama ayarı adı olarak ayarlayabilirsiniz: "%ScheduleAppSetting%".
runOnStartup ise true, çalışma zamanı başlatıldığında işlev çağrılır. Örneğin işlev uygulaması etkinlik dışı olması nedeniyle boşta kaldıktan sonra uyandırıldığında çalışma zamanı başlatılır. işlev değişiklikleri nedeniyle işlev uygulaması yeniden başlatıldığında ve işlev uygulamasının ölçeği genişletildiğinde. Dikkatli kullanın.runOnStartup , özellikle üretimde olarak ayarlıysa truenadiren olmalıdır.
useMonitor Zamanlamanın izlenip izlenmeyeceğini göstermek üzere true veya false olarak ayarlayın. Zamanlama izleme, işlev uygulaması örnekleri yeniden başlatıldığında bile zamanlamanın doğru bir şekilde korunmasına yardımcı olmak için zamanlama yinelemelerinde kalıcı olur. Açıkça ayarlanmazsa, varsayılan değer true 1 dakikadan büyük veya buna eşit bir yineleme aralığına sahip zamanlamalar içindir. Dakikada bir kereden fazla tetikleyen zamanlamalar için varsayılan değerdir false.

Aşağıdaki tabloda, function.json dosyasında ayarladığınız bağlama yapılandırma özellikleri açıklanmaktadır.

function.json özelliği Açıklama
type "timerTrigger" olarak ayarlanmalıdır. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
direction "in" olarak ayarlanmalıdır. Bu özellik, Tetikleyiciyi Azure portalında oluşturduğunuzda otomatik olarak ayarlanır.
Adı İşlev kodundaki zamanlayıcı nesnesini temsil eden değişkenin adı.
schedule CRON ifadesi veya TimeSpan değeri. yalnızca TimeSpan App Service Planı üzerinde çalışan bir işlev uygulaması için kullanılabilir. Zamanlama ifadesini bir uygulama ayarına ekleyebilir ve bu özelliği şu örnekte olduğu gibi işaretlerde % sarmalanmış uygulama ayarı adı olarak ayarlayabilirsiniz: "%ScheduleAppSetting%".
runOnStartup ise true, çalışma zamanı başlatıldığında işlev çağrılır. Örneğin işlev uygulaması etkinlik dışı olması nedeniyle boşta kaldıktan sonra uyandırıldığında çalışma zamanı başlatılır. işlev değişiklikleri nedeniyle işlev uygulaması yeniden başlatıldığında ve işlev uygulamasının ölçeği genişletildiğinde. Dikkatli kullanın.runOnStartup , özellikle üretimde olarak ayarlıysa truenadiren olmalıdır.
useMonitor Zamanlamanın izlenip izlenmeyeceğini göstermek üzere true veya false olarak ayarlayın. Zamanlama izleme, işlev uygulaması örnekleri yeniden başlatıldığında bile zamanlamanın doğru bir şekilde korunmasına yardımcı olmak için zamanlama yinelemelerinde kalıcı olur. Açıkça ayarlanmazsa, varsayılan değer true 1 dakikadan büyük veya buna eşit bir yineleme aralığına sahip zamanlamalar içindir. Dakikada bir kereden fazla tetikleyen zamanlamalar için varsayılan değerdir false.

Yerel olarak geliştirme yaparken uygulama ayarlarınızı koleksiyondaki local.settings.json dosyasınaValues ekleyin.

Dikkat

Üretimde runOnStartuptrue olarak ayarlamayın. Bu ayarın kullanılması, kodun tahmin edilemeyen zamanlarda yürütülmesini sağlar. Bazı üretim ayarlarında, bu ek yürütmeler tüketim planında barındırılan uygulamalar için önemli ölçüde daha yüksek maliyetlere neden olabilir. Örneğin runOnStartup etkinleştirildiğinde işlev uygulamanız her ölçeklendirilildiğinde tetikleyici çağrılır. Üretimde runOnStartup'ı etkinleştirmeden önce işlevlerinizin üretim davranışını tam olarak anladığınızdan emin olun.

Tam örnekler için Örnek bölümüne bakın.

Kullanım

Zamanlayıcı tetikleyici işlevi çağrıldığında, işleve bir zamanlayıcı nesnesi geçirilir. Aşağıdaki JSON, zamanlayıcı nesnesinin örnek bir gösterimidir.

{
    "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 özelliği, true geçerli işlev çağrısının zamanlanandan sonra olmasıdır. Örneğin, bir işlev uygulamasının yeniden başlatılması çağrının kaçırılmasına neden olabilir.

NCRONTAB ifadeleri

Azure İşlevleri,NCRONTAB ifadelerini yorumlamak için NCronTab kitaplığı. NCRONTAB ifadesi CRON ifadesine benzer, ancak başlangıçta saniye olarak zaman duyarlığı için kullanılacak ek bir altıncı alan içerir:

{second} {minute} {hour} {day} {month} {day-of-week}

Her alan aşağıdaki değer türlerinden birine sahip olabilir:

Tür Örnek Tetiklendiğinde
Belirli bir değer 0 5 * * * * Günün her saati saat 5'inde bir kez
Tüm değerler (*) 0 * 5 * * * Saatte bir dakikada, saatte 5
Aralık (- işleç) 5-7 * * * * * Dakikada üç kez - her günün her saatinin her dakikası boyunca saniye 5 ile 7 arasında
Bir değer kümesi (, işleç) 5,8,10 * * * * * Dakikada üç kez - her günün her saatinin her dakikası boyunca 5, 8 ve 10 saniye
Aralık değeri (/ işleç) 0 */5 * * * * Saatte 12 kez - her günün her saatinin her 5. dakikasının ikinci 0'ında

Ayları veya günleri belirtmek için adların sayısal değerlerini, adlarını veya kısaltmalarını kullanabilirsiniz:

  • Günler için sayısal değerler 0 ile 6 arasıdır ve 0 Pazar ile başlar.
  • İsimler İngilizcedir. Örneğin: Monday, January.
  • Adlar büyük/küçük harfe duyarlı değildir.
  • Adlar kısaltılabilir. Önerilen kısaltma uzunluğu üç harftir. Örneğin: Mon, Jan.

NCRONTAB örnekleri

Azure İşlevleri zamanlayıcı tetikleyicisi için kullanabileceğiniz NCRONTAB ifadelerinin bazı örnekleri aşağıda verilmiştir.

Örnek Tetiklendiğinde
0 */5 * * * * beş dakikada bir
0 0 * * * * her saatin en üstünde bir kez
0 0 */2 * * * iki saatte bir
0 0 9-17 * * * 09:00 ile 17:00 arasında saatte bir
0 30 9 * * * her gün 09:30'da
0 30 9 * * 1-5 hafta içi her gün 09:30'da
0 30 9 * Jan Mon Ocak ayında her Pazartesi 09:30'da

Not

NCRONTAB ifadesi hem beş alan hem de altı alan biçimini destekler. Altıncı alan konumu, ifadenin başına yerleştirilen saniyelerin değeridir.

NCRONTAB saat dilimleri

CRON ifadesindeki sayılar zaman aralığına değil, tarihe ve saate başvurur. Örneğin, alandaki 5 hour , her 5 saatte bir değil, 05:00'e başvurur.

CRON ifadeleriyle kullanılan varsayılan saat dilimi Eşgüdümlü Evrensel Saat'tir (UTC). CRON ifadenizin başka bir saat dilimine dayalı olmasını sağlamak için işlev uygulamanız için adlı WEBSITE_TIME_ZONEbir uygulama ayarı oluşturun.

Bu ayarın değeri, işlev uygulamanızın üzerinde çalıştırıldığı işletim sistemine ve plana bağlıdır.

İşletim sistemi Planlama Değer
Windows Tümü Değeri, Windows komutu tarafından verilen her çiftten ikinci satır tarafından verilen istenen saat diliminin adına ayarlayın tzutil.exe /L
Linux Premium
Ayrılmış
değeri, tz veritabanında gösterildiği gibi istenen saat diliminin adına ayarlayın.

Not

WEBSITE_TIME_ZONE ve TZ şu anda Bir Tüketim planında Linux üzerinde çalışırken desteklenmez. Bu durumda, SSL ile ilgili sorunları ayarlamak WEBSITE_TIME_ZONE veya TZ oluşturmak ve ölçümlerin uygulamanız için çalışmayı durdurmasına neden olabilir.

Örneğin, ABD'de Doğu Saati ((Windows) veya America/New_York (Linux) ile Eastern Standard Time temsil edilir) şu anda standart saat sırasında UTC-05:00 ve yaz saati sırasında UTC-04:00 kullanır. Zamanlayıcı tetikleyicisinin her gün doğu saatiyle 10:00'da tetikleyebilmek için işlev uygulamanız için adlı WEBSITE_TIME_ZONEbir uygulama ayarı oluşturun, değeri Eastern Standard Time (Windows) veya America/New_York (Linux) olarak ayarlayın ve aşağıdaki NCRONTAB ifadesini kullanın:

"0 0 10 * * *"

Kullandığınızda WEBSITE_TIME_ZONE saat, gün ışığından yararlanma saati ve standart saat değişiklikleri de dahil olmak üzere belirli bir saat dilimindeki saat değişiklikleri için ayarlanır.

TimeSpan

yalnızca TimeSpan App Service Planı üzerinde çalışan bir işlev uygulaması için kullanılabilir.

CRON ifadelerinden farklı olarak, bir TimeSpan değer her işlev çağrısı arasındaki zaman aralığını belirtir. Belirtilen aralıktan daha uzun süre çalıştırıldıktan sonra bir işlev tamamlandığında, zamanlayıcı işlevi hemen yeniden çağırır.

Dize olarak ifade edilen biçim, TimeSpan 24'ten küçük olduğundadır hh:mm:sshh . İlk iki basamak 24 veya daha büyük olduğunda, biçimi şeklindedir dd:hh:mm. Burada bazı örnekler verilmiştir:

Örnek Tetiklendiğinde
"01:00:00" saatte bir
"00:01:00" dakikada bir
"25:00:00:00" 25 günde bir
"1.00:00:00" Her gün

Ölçeklendirme

Bir işlev uygulamasının ölçeği birden çok örneğe genişletilirse, tüm örneklerde zamanlayıcıyla tetiklenen bir işlevin yalnızca tek bir örneği çalıştırılır. Bekleyen bir çağrı hala çalışıyorsa, yeniden tetiklenmez.

Depolama paylaşan işlev uygulamaları

Depolama hesaplarını app service'e dağıtılmayan işlev uygulamaları arasında paylaşıyorsanız, her uygulamaya açıkça konak kimliği atamanız gerekebilir.

İşlevler sürümü Ayar
2.x (ve üzeri) AzureFunctionsWebHost__hostid ortam değişkeni
1.x idhost.json

Tanımlayıcı değeri atlayabilir veya her işlev uygulamasının tanımlayıcı yapılandırmasını farklı bir değere el ile ayarlayabilirsiniz.

Zamanlayıcı tetikleyicisi, bir işlev uygulamasının ölçeğini birden çok örneğe genişlettiğinde yalnızca bir zamanlayıcı örneği olduğundan emin olmak için bir depolama kilidi kullanır. İki işlev uygulaması aynı tanımlayıcı yapılandırmayı paylaşıyorsa ve her biri bir zamanlayıcı tetikleyicisi kullanıyorsa, yalnızca bir zamanlayıcı çalışır.

Yeniden deneme davranışı

Kuyruk tetikleyicisinin aksine, bir işlev başarısız olduktan sonra zamanlayıcı tetikleyicisi yeniden denemez. Bir işlev başarısız olduğunda, zamanlamada bir sonraki sefere kadar yeniden çağrılmaz.

Zamanlayıcı tetikleyicilerini el ile çağırma

Azure İşlevleri için zamanlayıcı tetikleyicisi, işlevi el ile tetikleme amacıyla çağrılabilen bir HTTP web kancası sağlar. Bu, aşağıdaki senaryolarda son derece yararlı olabilir.

  • Tümleştirme testi
  • Duman testi veya ısınma etkinliğinin parçası olarak yuva değiştirmeleri
  • Veritabanındaki bir önbelleği veya arama tablosunu hemen doldurmak için bir işlevin ilk dağıtımı

Zamanlayıcıyla tetiklenen bir işlevi el ile çağırma hakkında ayrıntılı bilgi için lütfen HTTP ile tetiklenmeyen bir işlevi el ile çalıştırma bölümüne bakın.

Sorun giderme

Zamanlayıcı tetikleyicisi beklendiği gibi çalışmadığında yapılması gerekenler hakkında bilgi için bkz . Zamanlayıcı ile tetiklenen işlevlerin tetiklenmemesiyle ilgili sorunları araştırma ve raporlama.

Sonraki adımlar