Köutlösare

Slutförd

En meddelandekö är en programvarukomponent som används för att hantera meddelanden mellan processer, trådar eller program. En kö kan lagra ett meddelande och arbetare kan hämta meddelandet när det är en bra tid.

I molnet kan meddelandeköer generera händelser med en nyttolast. En tjänst som Azure Functions kan lyssna på ett sådant meddelande och köra dess kod när ett meddelande publiceras.

Arbeta med meddelandeköer

För att en Azure-funktion ska kunna använda ett meddelande från en meddelandekö behöver den en utlösare och eventuellt en bindning.

En Azure-funktion måste lyssna på en specifik kö så att koden utlöses när ett nytt meddelande publiceras i kön. Om du vill konfigurera en utlösare måste du ange rätt autentiseringsuppgifter så att utlösarkoden vet hur du ansluter till meddelandekön. Du skapar en post i filen function.json för funktionen som lyssnar på kön. I -elementet bindings anger du följande egenskaper för en post:

Property Värde
name Ett namn som du kan referera till i kod
type queueTrigger
direction in
queueName Vad kön heter
connection En konfigurationsvariabel i local.settings.json

En exempelpost kan definieras så här:

{
    "name": "myQueueItem",
    "type": "queueTrigger",
    "direction": "in",
    "queueName": "messages-incoming",
    "connection": "AzureWebJobsStorage"
  }

Om den här kön finns på ett lagringskonto AzureWebJobsStorage är värdet för anslutningssträng.

Du behöver inte en bindning när du använder ett meddelande från en kö. Men om du vill skriva till en kö behöver du en utdatabindning. Med en sådan bindning får du en referens till den avsedda kön.

Kommentar

För närvarande stöds endast utdatabindningar för köer.

Utveckla lokalt

Som utvecklare vill du ha korta feedbackcykler. Du vill också se till att utvecklarupplevelsen ligger så nära en produktionsmiljö som möjligt. Ett sätt att uppnå båda dessa mål är att använda en köemulator.

Med en köemulator kan du simulera verkliga kömeddelanden som din Azure-funktion svarar på. Så här använder du emulatorn:

  1. Installera emulatorn. Sök efter Azurite i Visual Studio Code eller ladda ned Azurite-tillägget.

  2. Om du vill använda emulatorfunktionen startar du den genom att välja Azure: Starta kötjänsten på kommandopaletten.

    När du kör det här kommandot startas en lyssnare med namnet Azure Storage Explorer som ett annat program kan hämta. Storage Explorer är ett klientprogram som gör att du kan bläddra igenom dina molnresurser och använda emulatorfunktioner.

  3. Ladda ned Azure Storage Explorer. Öppna sedan programmet så ser du följande indikation på att emulatorn fungerar:

    Skärmbild som visar emulatorn i Azure Storage Explorer.

  4. Skapa en kö i emulatorn. Du använder den här kön som en del av konfigurationen av funktionsslutpunkten. Genom att högerklicka på köelementet kan du skapa en ny kö.

  5. För att säkerställa att Functions-appen använder emulatorn måste du ange anslutningssträng korrekt. Öppna local.settings.json, leta upp elementet AzureWebJobsStorage och ge det värdet "UseDevelopmentStorage=true".

    Kommentar

    Kom ihåg att ange den här egenskapen på ett annat sätt när du flyttar till molnet. Den bör peka på en faktisk resurs i Azure när den är i produktion.

Skapa funktionen

Nu har du en lokal emulator konfigurerad och den har en kö på sig. Du har också konfigurerat projektet så att det pekar på den lokala emulatorn. Nu måste du skapa en funktion för att hantera en köutlösare.

Skapa en funktionsslutpunkt

Du är redo att skapa en funktion som kan hantera inkommande kömeddelanden. Skapa en mapp för din funktion och ge den namnet, queueTriggertill exempel . Skapa sedan en function.json fil och ge den följande innehåll:

{
  "bindings": [{
    "name" "queueItem",
    "type": "queueTrigger",
    "direction": "in",
    "queueName" : "items",
    "connection": "AzureWebJobsStorage"
  }]
}

Värdet för elementet name är viktigt eftersom du refererar till det senare i koden för att parsa inkommande data från kön. Den måste vara av typen queueTrigger så att kön utlöser den när det finns ett nytt meddelande.

Elementet queueName identifierar unikt vilken kö du interagerar med. Det du anger här måste matcha det du kallar kön i emulatorn eller vad du senare kallar din faktiska kö i Azure.

Elementet connection pekar på värdet för elementet AzureWebJobsStorage i local.settings.json.

Hantera ett kömeddelande

Om du vill hantera ett inkommande kömeddelande måste du skriva kod som kan parsa ut det meddelande som du behöver. Då kan du bestämma vad du ska göra härnäst. Du kan till exempel starta en webbbegäran, placera meddelandet i en annan kö eller skicka meddelandet till en databas.

Konfigurera en väg

Du behöver en väg för att hantera inkommande begäranden. Azure Functions hanterar begäranden till en kö i roten. När du konfigurerar en väg enligt följande anropas din begäran som http://localhost:<port>/queueTrigger:

http.HandleFunc("/queueTrigger", handleQueueTrigger)

Avkoda en begäran

När kömeddelandet skickas till dig har det den här formen:

{
  "Data": {
    "queueItem": "your message"
  },
  "Metadata": {
    "DequeueCount": 1,
    "ExpirationTime": "2019-10-16T17:58:31+00:00",
    "Id": "800ae4b3-bdd2-4c08-badd-f08e5a34b865",
    "InsertionTime": "2019-10-09T17:58:31+00:00",
    "NextVisibleTime": "2019-10-09T18:08:32+00:00",
    "PopReceipt": "AgAAAAMAAAAAAAAAAgtnj8x+1QE=",
    "sys": {
      "MethodName": "QueueTrigger",
      "UtcNow": "2019-10-09T17:58:32.2205399Z",
      "RandGuid": "24ad4c06-24ad-4e5b-8294-3da9714877e9"
    }
  }
}

Som en del av avkodningen av den inkommande begäran behöver du en hjälpstruktur som modellerar föregående meddelande. Den bör se ut så här:

type InvokeRequest {
   Data map[string]json.RawMessage
   Metadata map[string]interface{}
}

Börja skriva kod för att ta den inkommande begäran och avkoda den:

func handleQueueTrigger(w http.ResponseWrite, r *http.Request) {
   var invokeRequest InvokeRequest
   d := json.NewDecoder(r.Body)
   d.Decode(&invokeRequest)
}

Nu är du vid en punkt där begäran har avkodats, men du måste parsa själva kömeddelandet.

Parsa ett kömeddelande

När begäran har avkodats kan kömeddelandet hämtas från begäran på Data egenskapen. Du måste också referera till meddelandet med egenskapsvärdet name som du har konfigurerat i filen function.json . Koden för att hämta meddelandet är en enradare som den här:

invokeRequest.Data["queueItem"]

Eftersom du måste kunna läsa det här meddelandet i klartext använder du ett JSON-bibliotek och parsar det. JSON-biblioteket använder en Unmarshal() metod som tar två parametrar: meddelandet som ska parsas och variabeln för att placera det tolkade meddelandet på. Koden måste därför se ut så här:

var parsedMessage string
json.Unmarshal(invokeRequest.Data["queueItem"], &parsedMessage)

parsedMessage Nu innehåller det ditt meddelande. Om du vill skriva ut den till konsolen använder du följande kod:

fmt.Println(parsedMessage) // your message

Kommentar

Om meddelandet är något mer avancerat än en sträng måste du parsedMessage ha en struktur som matchar formen på det som queueMessage pekar på.

Utlösa ett meddelande

Om du vill testa programmet kan du använda Azure Storage Explorer. I det högra fönstret i verktyget väljer du knappen Lägg till meddelande för att skapa ett meddelande i kön.

Skärmbild som visar knappen för att lägga till ett meddelande i kön.

Om du har din Functions-app och den körs nu utlöses bindningen och koden anropas.