İngilizce dilinde oku

Aracılığıyla paylaş


Bekleme-Yeniden Deneme Düzeni

Bazı durumlarda, bir veri kaynağının davranışı Power Query'nin varsayılan HTTP kodu işlemesi tarafından beklenen davranışla eşleşmez. Aşağıdaki örneklerde bu duruma geçici bir çözüm bulabilirsiniz.

Bu senaryoda, zaman zaman bir iç sunucu hatasına işaret eden 500 durum kodu döndüren bir REST API ile çalışacaksınız. Bu örneklerde, vazgeçmeden önce birkaç saniye bekleyip yeniden deneyebilirsiniz.

ManualStatusHandling

500 durum kodu yanıtı alırsa Web.Contents varsayılan olarak bir DataSource.Error oluşturur. için isteğe bağlı bağımsız değişken Web.Contentsolarak bir kod listesi sağlayarak bu davranışı geçersiz kılabilirsiniz:

response = Web.Contents(url, [ManualStatusHandling={404, 500}])

Durum kodlarını bu şekilde belirterek Power Query web yanıtını normal şekilde işlemeye devam eder. Ancak bu durumlarda normal yanıt işleme genellikle uygun değildir. Anormal bir yanıt kodunun alındığını anlamanız ve bunu işlemek için özel mantık gerçekleştirmeniz gerekir. Web hizmetinden döndürülen yanıt kodunu belirlemek için, yanıta eşlik eden Kayıt'tan meta erişebilirsiniz:

responseCode = Value.Metadata(response)[Response.Status]

200 veya 500 olup olmadığına responseCode bağlı olarak, sonucu normal şekilde işleyebilir veya sonraki bölümde açıklayabileceğiniz bekleme yeniden deneme mantığınızı izleyebilirsiniz.

IsRetry

Power Query'de, Web.Contents'e yapılan önceki çağrıların sonuçlarını depolayan yerel bir önbellek vardır. Yeni yanıt için aynı URL'yi yoklarken veya hata durumundan sonra yeniden denerken sorgunun önbelleğe alınan sonuçları yoksaydığından emin olmanız gerekir. İşlev çağrısına IsRetryWeb.Contents seçeneğini ekleyerek bunu yapabilirsiniz. Bu örnekte, döngünün ilk yinelemesinin Value.WaitFor ardından olarak true ayarlayacağızIsRetry.

Value.WaitFor

Value.WaitFor() genellikle değişiklik yapılmadan kullanılabilen standart bir yardımcı işlevdir . Yeniden deneme girişimleri listesi oluşturarak çalışır.

producer Bağımsız değişken

Bu, (büyük olasılıkla) yeniden denenecek görevi içerir. Yineleme numarasının mantıkta producer kullanılabilmesi için bir işlev olarak temsil edilir. Beklenen davranış, producer yeniden denemenin gerekli olduğu belirlenirse döndürülmesidir null . dışında null bir şey tarafından producerdöndürülürse, bu değer sırayla tarafından Value.WaitFordöndürülür.

delay Bağımsız değişken

Bu, yeniden denemeler arasında yürütülecek mantığı içerir. Yineleme numarasının mantıkta delay kullanılabilmesi için bir işlev olarak temsil edilir. Beklenen davranış bir Süre döndürmektir delay .

count Bağımsız değişken (isteğe bağlı)

Bağımsız değişkene bir sayı count sağlanarak en fazla yeniden deneme sayısı ayarlanabilir.

Hepsini bir araya getirmek

Aşağıdaki örnek, 500 yanıt durumunda gecikmeli yeniden deneme uygulamak için nasıl ManualStatusHandling ve Value.WaitFor kullanılabileceğini gösterir. Yeniden denemeler arasındaki bekleme süresi her denemede ikiye katlanarak en fazla beş yeniden deneme olur.

let
    waitForResult = Value.WaitFor(
        (iteration) =>
            let
                result = Web.Contents(url, [ManualStatusHandling = {500}, IsRetry = iteration > 0]),
                status = Value.Metadata(result)[Response.Status],
                actualResult = if status = 500 then null else result
            in
                actualResult,
        (iteration) => #duration(0, 0, 0, Number.Power(2, iteration)),
        5)
in
    if waitForResult = null then
        error "Value.WaitFor() Failed after multiple retry attempts"
    else
        waitForResult