Lue englanniksi

Jaa


Uudelleenyritysten odotuksen malli

Joissakin tilanteissa tietolähteen toiminta ei vastaa Power Queryn OLETUSARVOisen HTTP-koodinkäsittelyn odotettua toimintaa. Seuraavissa esimerkeissä näytetään, miten voit kiertää tämän tilanteen.

Tässä skenaariossa käsittelet REST-ohjelmointirajapintaa, joka palauttaa ajoittain 500 tilakoodin, joka ilmaisee sisäistä palvelinvirhettä. Näissä tapauksissa voit odottaa muutaman sekunnin ja yrittää uudelleen, mahdollisesti muutaman kerran ennen kuin luovut.

Manuaalinen käsittely

Jos Web.Contents se saa 500 tilakoodin vastauksen, se palauttaa oletusarvon DataSource.Error mukaan. Voit ohittaa tämän toiminnan antamalla koodiluettelon valinnaisena argumenttina kohteeseen Web.Contents:

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

Kun määrität tilakoodit tällä tavalla, Power Query jatkaa verkkovastauksen käsittelemistä normaalisti. Näissä tapauksissa normaali vastekäsittely ei kuitenkaan useinkaan ole asianmukaista. Sinun täytyy ymmärtää, että epänormaali vastauskoodi on vastaanotettu, ja suorittaa erityistä logiikkaa sen käsittelemiseksi. Voit määrittää verkkopalvelusta palautetun vastauskoodin käyttämällä sitä vastauksen mukana tulevasta tietueesta meta :

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

Sen perusteella, onko responseCode tulos 200 vai 500, voit joko käsitellä tuloksen normaalina tai seurata uudelleenodottavaa logiikkaa, jonka muotoilet seuraavassa osiossa.

IsRetry

Power Queryssä on paikallinen välimuisti, joka tallentaa web.contents-edellisten kutsujen tulokset. Kun teet kyselyn samalle URL-osoitteelle uutta vastausta varten tai yrität uudelleen virhetilan jälkeen, sinun on varmistettava, että kysely jättää huomiotta kaikki välimuistiin tallennetut tulokset. Voit tehdä tämän sisällyttämällä - IsRetry asetuksen funktion kutsuun Web.Contents . Tässä esimerkissä -silmukan ensimmäisen iteraation jälkeen asetetaan IsRetry arvoksi Value.WaitFor true .

Value.WaitFor

Value.WaitFor() on vakioaputoiminto , jota voi yleensä käyttää ilman muutoksia. Se toimii luomalla uudelleenyritysten luettelon.

producer Argumentti

Tämä sisältää tehtävän, jota on (mahdollisesti) yritetään uudelleen. Se esitetään funktiona, jotta iterointinumeroa voidaan käyttää logiikassa producer . Odotettu toimintatapa on, joka palautuunull, producer jos uudelleenyritysten todetaan olevan tarpeellisia. Jos jokin muu kuin null -arvo palautetaan producer, palauttaa tämän arvon puolestaan Value.WaitFor.

delay Argumentti

Tämä sisältää logiikan, joka suoritetaan uudelleenlyöntien välillä. Se esitetään funktiona, jotta iterointinumeroa voidaan käyttää logiikassa delay . Odotettu toiminta delay palauttaa keston.

count Argumentti (valinnainen)

Uudelleententien enimmäismäärä voidaan määrittää antamalla argumentille count luku.

Kaiken kokoaminen yhteen

Seuraavassa esimerkissä näytetään, miten ManualStatusHandling ja Value.WaitFor voidaan käyttää viivästyneen uudelleenyrityksen toteuttamiseen 500 vastauksen tapauksessa. Odotusaika uudelleenyritysten välillä kaksinkertaistuu jokaisen yrityksen kanssa, ja enintään viisi yritystä yritetään uudelleen.

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