練習 - 處理佇列訊息
在此練習中,您將使用可針對訊息佇列中訊息觸發的路由,擴充您的應用程式。
注意
開始此練習之前,請確定您已下載 Azurite 延伸模組、下載 Azure 儲存體總管,以及下載 Azure Functions Core Tools。
建構應用程式
在此練習中,我們會從新的 Azure Functions 應用程式開始。 請建立新的目錄並置身其中。
選取 [檢視] >[命令調色盤] 。
選取 [Azure Functions: 建立新專案]。
選取資料夾,通常是您目前的資料夾。
在 [選取語言] 中,選取 [自訂處理常式]。
在 [Select a template for your first function] (為您的第一個函式選取範本) 中,選取 [HttpTrigger]。
為應用程式命名,例如 queueTrigger。
選取 [匿名] 的授權等級。 您稍後可以視需要變更該設定。
在根目錄中,建立名為 server.go 的檔案。 您的專案現在應該會有下列檔案:
queueTrigger/ function.json .funcignore .gitignore host.json local.settings.json proxies.json server.go
前往
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 中指出將包含佇列連接字串的變數。
建立 應用程式
此時,您已有應用程式基本架構。 現在已經準備好新增可處理內送佇列郵件的程式碼。
開啟 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
設定的路由。尋找 [匯入] 區段,並在其底下新增下列結構:
type InvokeRequest struct { Data map[string]json.RawMessage Metadata map[string]interface{} }
尋找
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)
現在您有訊息了,讓我們將其列印出來。
新增下列程式碼:
fmt.Println(parsedMessage) // your message
您的程式碼現在都撰寫好了,但您必須設定專案才能進行測試。
在 host.json 檔案中,尋找
defaultExecutablePath
元素並為其提供./server
的值。注意
針對 Windows,您會使用
.\server.exe
的值。在專案根目錄中執行
go build
,以建置 server.go 檔案:go build server.go
設定環境
下一步是設定您的環境。 因為您正在本機進行開發,所以需要加以設定,以便與模擬的訊息佇列通訊。
在 local.settings.json 檔案中,在稱為
AzureWebJobsStorage
的Values
中尋找元素 (若其缺少則加以新增)。 為其提供值UseDevelopmentStorage=true
。 您的 JSON 項目看起來應該像這樣:"AzureWebJobsStorage" : "UseDevelopmentStorage=true"
藉由開啟命令選擇區 ([檢視]>[命令選擇區]),然後選取 [Azurite: 啟動佇列服務],來啟動 Azurite 延伸模組。
注意
此步驟將會在您的專案中建立一些本機檔案。
開啟 [Azure 儲存體總管]。 左側可以看見模擬器的內容。
以滑鼠右鍵按一下 [佇列] 節點,然後選取選項以建立新的佇列。 為其命名 items。
注意
您可以任意為佇列命名。 然而,您即將設定您的 function.json 檔案。 無論此處如何為佇列命名,您都必須進入 function.json。
在
queueTrigger
目錄下尋找 function.json。 確定bindings
陣列具有下列項目:{ "name": "queueItem", "type": "queueTrigger", "direction": "in", "queueName" : "items", "connection": "AzureWebJobsStorage" }
queueName
屬性的名稱與您在 Azure 儲存體總管中建立的佇列名稱相同。connection
屬性會指向您在 local.settings.json 中所設定的值。name
屬性具有值queueItem
。 您的 Go 程式碼會使用此值剖析佇列訊息。
執行應用程式
到此為止,所有項目均設定完畢。 您只需要執行應用程式、啟動 Azure 儲存體總管,然後建立佇列訊息。 您的程式碼應該能夠取用該訊息。
從終端機執行專案根目錄中的
func start
命令:func start
在 Visual Studio Code 中,開啟命令選擇區,並執行 [Azurite: 啟動佇列服務]。
啟動 Azure 儲存體總管 (若尚未啟動)。
在 Azure 儲存體總管中,選取 [新增訊息]:
在出現的對話方塊中,輸入訊息,然後選取 [確定]。 您現在會看到所建立訊息的詳細資料。
在 Visual Studio Code 中,您的函式現在應該正在執行。 在終端機中,您現在應該會看到列印為最後一個資料列的訊息。
您的函式可以取用佇列訊息並寫出其內容。
恭喜! 您已在 Go 中建置可在佇列訊息上觸發的 Azure 函式。 您也會剖析該訊息。
您將決定如何處理內送郵件。 例如,您可以將其儲存於資料庫中,或是將其傳送為 Web 要求中的承載。