練習 - 處理佇列訊息

已完成

在此練習中,您將使用可針對訊息佇列中訊息觸發的路由,擴充您的應用程式。

注意

開始此練習之前,請確定您已下載 Azurite 延伸模組下載 Azure 儲存體總管,以及下載 Azure Functions Core Tools

建構應用程式

在此練習中,我們會從新的 Azure Functions 應用程式開始。 請建立新的目錄並置身其中。

  1. 選取 [檢視] >[命令調色盤] 。

  2. 選取 [Azure Functions: 建立新專案]

  3. 選取資料夾,通常是您目前的資料夾。

  4. 在 [選取語言] 中,選取 [自訂處理常式]

  5. 在 [Select a template for your first function] (為您的第一個函式選取範本) 中,選取 [HttpTrigger]

  6. 為應用程式命名,例如 queueTrigger

  7. 選取 [匿名] 的授權等級。 您稍後可以視需要變更該設定。

  8. 在根目錄中,建立名為 server.go 的檔案。 您的專案現在應該會有下列檔案:

    queueTrigger/
      function.json
    .funcignore
    .gitignore
    host.json
    local.settings.json
    proxies.json
    server.go 
    
  9. 前往 queueTrigger 目錄中的 function.json 檔案。 找出 type 元素中的第一個繫結項目:

    {
       "authLevel": "anonymous",
       "type": "httpTrigger",
       "direction": "in",
       "name": "req",
       "methods": [
         "get",
         "post"
       ]
     }
    

    將該繫結項目變更為此設定:

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

    在此步驟中,您會設定 name 屬性。 您後續將會在程式碼中參考該屬性。 您也將觸發程序類型變更為 queueTrigger,以便接聽佇列訊息。

    queueName 值指出特定佇列。 當您稍後執行模擬器時,將會建立具有這類名稱的佇列。

    最後,您在 local.settings.json 中指出將包含佇列連接字串的變數。

建立 應用程式

此時,您已有應用程式基本架構。 現在已經準備好新增可處理內送佇列郵件的程式碼。

  1. 開啟 server.go 檔案,並新增下列程式碼:

    package main
    
    import (
      "encoding/json",
      "fmt"
      "io/ioutil"
      "log"
      "net/http"
      "os"
    )
    
    func queueHandler(w http.ResponseWriter, r *http.Request) {
    }
    
    func main() {
      customHandlerPort, exists := os.LookupEnv("FUNCTIONS_CUSTOMHANDLER_PORT")
      if !exists {
        customHandlerPort = "8080"
      }
      mux := http.NewServeMux()
      mux.HandleFunc("/queueTrigger", queueHandler)
      fmt.Println("Go server Listening on: ", customHandlerPort)
      log.Fatal(http.ListenAndServe(":"+customHandlerPort, mux))
    }
    

    您現在已經有在 /queueTrigger 設定的路由。

  2. 尋找 [匯入] 區段,並在其底下新增下列結構:

    type InvokeRequest struct {
      Data     map[string]json.RawMessage
      Metadata map[string]interface{}
    }
    
  3. 尋找 queueHandler() 方法,並以下列方式新增更新:

    func queueHandler(w http.ResponseWriter, r *http.Request) {
      var invokeRequest InvokeRequest
    
      d := json.NewDecoder(r.Body)
      d.Decode(&invokeRequest)
    
      var parsedMessage string
      json.Unmarshal(invokeRequest.Data["queueItem"], &parsedMessage)
    }
    

    程式碼會先從連入的回應資料流讀取本文,然後將其解碼:

    var invokeRequest InvokeRequest
    
    d := json.NewDecoder(r.Body)
    d.Decode(&invokeRequest)
    

    然後,使用 Unmarshal() 的呼叫挖掘訊息本身:

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

    現在您有訊息了,讓我們將其列印出來。

  4. 新增下列程式碼:

    fmt.Println(parsedMessage) // your message
    

    您的程式碼現在都撰寫好了,但您必須設定專案才能進行測試。

  5. host.json 檔案中,尋找 defaultExecutablePath 元素並為其提供 ./server 的值。

    注意

    針對 Windows,您會使用 .\server.exe 的值。

  6. 在專案根目錄中執行 go build,以建置 server.go 檔案:

    go build server.go
    

設定環境

下一步是設定您的環境。 因為您正在本機進行開發,所以需要加以設定,以便與模擬的訊息佇列通訊。

  1. local.settings.json 檔案中,在稱為 AzureWebJobsStorageValues 中尋找元素 (若其缺少則加以新增)。 為其提供值 UseDevelopmentStorage=true。 您的 JSON 項目看起來應該像這樣:

    "AzureWebJobsStorage" : "UseDevelopmentStorage=true"
    
  2. 藉由開啟命令選擇區 ([檢視]>[命令選擇區]),然後選取 [Azurite: 啟動佇列服務],來啟動 Azurite 延伸模組。

    注意

    此步驟將會在您的專案中建立一些本機檔案。

  3. 開啟 [Azure 儲存體總管]。 左側可以看見模擬器的內容。

  4. 以滑鼠右鍵按一下 [佇列] 節點,然後選取選項以建立新的佇列。 為其命名 items

    螢幕擷取畫面,顯示 Azure 儲存體總管中的模擬器,其中已建立新的佇列。

    注意

    您可以任意為佇列命名。 然而,您即將設定您的 function.json 檔案。 無論此處如何為佇列命名,您都必須進入 function.json

  5. queueTrigger 目錄下尋找 function.json。 確定 bindings 陣列具有下列項目:

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

    queueName 屬性的名稱與您在 Azure 儲存體總管中建立的佇列名稱相同。 connection 屬性會指向您在 local.settings.json 中所設定的值。

    name 屬性具有值 queueItem。 您的 Go 程式碼會使用此值剖析佇列訊息。

執行應用程式

到此為止,所有項目均設定完畢。 您只需要執行應用程式、啟動 Azure 儲存體總管,然後建立佇列訊息。 您的程式碼應該能夠取用該訊息。

  1. 從終端機執行專案根目錄中的 func start 命令:

    func start
    
  2. 在 Visual Studio Code 中,開啟命令選擇區,並執行 [Azurite: 啟動佇列服務]

  3. 啟動 Azure 儲存體總管 (若尚未啟動)。

  4. 在 Azure 儲存體總管中,選取 [新增訊息]

    螢幕擷取畫面,顯示用於在佇列中新增訊息的選取項目。

  5. 在出現的對話方塊中,輸入訊息,然後選取 [確定]。 您現在會看到所建立訊息的詳細資料。

    顯示訊息詳細資料的螢幕擷取畫面。

  6. 在 Visual Studio Code 中,您的函式現在應該正在執行。 在終端機中,您現在應該會看到列印為最後一個資料列的訊息

    您的函式可以取用佇列訊息並寫出其內容。

恭喜! 您已在 Go 中建置可在佇列訊息上觸發的 Azure 函式。 您也會剖析該訊息。

您將決定如何處理內送郵件。 例如,您可以將其儲存於資料庫中,或是將其傳送為 Web 要求中的承載。