Wait-Retry patroon

In sommige gevallen komt het gedrag van een gegevensbron niet overeen met wat wordt verwacht door Power Query http-code van de standaardafhandeling van de http-code. De onderstaande voorbeelden laten zien hoe u deze situatie kunt omdraaien.

In dit scenario werkt u met een REST API die af en toe een 500-statuscode retourneert, waarmee een interne serverfout wordt aangegeven. In deze gevallen kunt u een paar seconden wachten en het opnieuw proberen, mogelijk een paar keer voordat u het op geeft.

ManualStatusHandling

Als Web.Contents een 500-statuscode-antwoord krijgt, wordt standaard DataSource.Error een geactiveerd. U kunt dit gedrag overschrijven door een lijst met codes op te geven als een optioneel argument voor Web.Contents :

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

Door de statuscodes op deze manier op te geven, Power Query het webreactie op de gebruikelijke manier verwerken. Normaal reageren is in dergelijke gevallen echter vaak niet geschikt. U moet begrijpen dat er een abnormale responscode is ontvangen en speciale logica uitvoeren om deze af te handelen. Als u de antwoordcode wilt bepalen die is geretourneerd door de webservice, kunt u deze openen vanuit de meta Record die bij het antwoord hoort:

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

Op basis van de vraag responseCode of 200 of 500 is, kunt u het resultaat op de normale manier verwerken of uw logica voor opnieuw proberen volgen die u in de volgende sectie verder uitwerkt.

Notitie

U wordt aangeraden om af te dwingen Power Query de resultaten in de cache op te nemen als u complexe logica implementeert, zoals het Wait-Retry patroon dat hier Binary.Buffer Web.Contents wordt weergegeven. Dit voorkomt dat Power Query uitvoering met meerdere threads meerdere aanroepen doet met mogelijk inconsistente resultaten.

Value.WaitFor

Value.WaitFor() is een standaard helperfunctie die meestal zonder aanpassingen kan worden gebruikt. Dit werkt door een lijst met nieuwe pogingen te maken.

producer Argument

Dit bevat de taak die (mogelijk) opnieuw moet worden proberen. Het wordt weergegeven als een functie, zodat het iteratienummer kan worden gebruikt in de producer logica. Het verwachte gedrag is dat producer wordt retourneren als wordt vastgesteld dat een nieuwe poging null noodzakelijk is. Als er iets anders dan wordt geretourneerd door , wordt die null waarde op zijn beurt geretourneerd door producer Value.WaitFor .

delay Argument

Dit bevat de logica die moet worden uitgevoerd tussen nieuwe proberen. Het wordt weergegeven als een functie, zodat het iteratienummer kan worden gebruikt in de delay logica. Het verwachte gedrag is dat delay een Duur retourneert.

count Argument (optioneel)

Een maximum aantal nieuwe proberen kan worden ingesteld door een getal op te geven voor het count argument .

Alles samenbrengen

In het volgende voorbeeld ziet u hoe en kunnen worden gebruikt voor het implementeren van een vertraagde nieuwe poging in het geval ManualStatusHandling Value.WaitFor van een 500-respons. De wachttijd tussen nieuwe pogingen hier wordt weergegeven als verdubbeld bij elke poging, met een maximum van 5 nieuwe pogingen.

let
    waitForResult = Value.WaitFor(
        (iteration) =>
            let
                result = Web.Contents(url, [ManualStatusHandling = {500}]), 
                buffered = Binary.Buffer(result),
                status = Value.Metadata(result)[Response.Status],
                actualResult = if status = 500 then null else buffered
            in
                actualResult,
        (iteration) => #duration(0, 0, 0, Number.Power(2, iteration)),
        5)
in
    waitForResult,