Ejercicio: Control de un mensaje de cola

Completado

En este ejercicio, extenderá la aplicación con una ruta que se pueda desencadenar en un mensaje en una cola de mensajes.

Nota:

Antes de comenzar este ejercicio, asegúrese de que ha descargado la extensión de Azurite, el Explorador de Azure Storage y Azure Functions Core Tools.

Scaffolding de la aplicación

En este ejercicio, comenzaremos con una nueva aplicación de Azure Functions. Cree un directorio e inclúyase en este.

  1. Seleccione Ver>Paleta de comandos.

  2. Seleccione Azure Functions: Crear proyecto.

  3. Seleccione una carpeta, normalmente la carpeta actual.

  4. En Seleccionar un idioma, elija Controlador personalizado.

  5. En Select a template for your first function (Seleccionar una plantilla para la primera función), seleccione HttpTrigger.

  6. Asigne un nombre a la aplicación, como queueTrigger.

  7. Seleccione el nivel de autorización anónimo. Si quiere, puede cambiar el nombre posteriormente.

  8. En la raíz, cree un archivo denominado server.go. El proyecto debe tener los siguientes archivos:

    queueTrigger/
      function.json
    .funcignore
    .gitignore
    host.json
    local.settings.json
    proxies.json
    server.go 
    
  9. Vaya al archivo function.json en el directorio queueTrigger. Busque la primera entrada de enlace en el elemento type:

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

    Cambie esa entrada de enlace a esta configuración:

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

    En este paso, se establece la propiedad name. Hará referencia a esta más adelante en el código. También ha cambiado el tipo de desencadenador a queueTrigger, lo que permite escuchar los mensajes de cola.

    El valor queueName apunta a una cola específica. Cuando ejecute el emulador más adelante, creará una cola con este nombre.

    Por último, ha indicado una variable en local.settings.json que contendrá la cadena de conexión para la cola.

Creación de la aplicación

En este momento, tiene un esqueleto de aplicación. Ya está listo para agregar código que pueda controlar los mensajes de cola entrantes.

  1. Abra el archivo server.go y agregue el código siguiente:

    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))
    }
    

    Ahora tiene una ruta configurada en /queueTrigger.

  2. Busque la sección import y agregue los siguientes structs en esta:

    type InvokeRequest struct {
      Data     map[string]json.RawMessage
      Metadata map[string]interface{}
    }
    
  3. Busque el método queueHandler() y actualícelo de la siguiente manera:

    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)
    }
    

    El código primero lee el cuerpo del flujo de respuesta entrante y lo descodifica:

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

    A continuación, el propio mensaje se pone al día con una llamada a Unmarshal():

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

    Ahora que tiene el mensaje, vamos a imprimirlo.

  4. Agregue el código siguiente:

    fmt.Println(parsedMessage) // your message
    

    El código ya está todo escrito, pero debe configurar el proyecto para poder probarlo.

  5. En el archivo host.json, busque el elemento defaultExecutablePath y asígnele un valor de ./server.

    Nota:

    Para Windows, usaría un valor de .\server.exe.

  6. Compile el archivo server.go mediante la ejecución de go build en la raíz del proyecto:

    go build server.go
    

Configuración del entorno

El siguiente paso es configurar el entorno. Dado que está desarrollando localmente, debe configurarlo para poder hablar con una cola de mensajes emulada.

  1. En el archivo local.settings.json, busque un elemento en Values denominado AzureWebJobsStorage (o agréguelo si falta). Asígnele el valor UseDevelopmentStorage=true. La entrada JSON debe ser similar a esta:

    "AzureWebJobsStorage" : "UseDevelopmentStorage=true"
    
  2. Para iniciar la extensión Azurite, abra la paleta de comandos (Ver>Paleta de comandos) y seleccione Azurite: Start Queue Service (Azurite: Iniciar Queue service).

    Nota:

    Este paso creará algunos archivos locales en el proyecto.

  3. Abra el Explorador de Azure Storage. En el lado izquierdo, el contenido del emulador es visible.

  4. Haga clic con el botón derecho en el nodo Colas y seleccione la opción para crear una nueva cola. Asígnele el nombre elementos.

    Screenshot that shows the emulator in Azure Storage Explorer, with a new queue created.

    Nota:

    Puede asignar a la cola el nombre que desee. Sin embargo, está a punto de configurar el archivo function.json. El nombre que asigne aquí a la cola debe incluirse en el archivo function.json.

  5. Busque function.json en el directorio queueTrigger. Asegúrese de que la matriz bindings tiene la entrada siguiente:

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

    La propiedad queueName tiene el mismo nombre que la cola que creó en el Explorador de Azure Storage. La propiedad connection apunta al valor que configuró enlocal.settings.json.

    La propiedad name tiene el valor queueItem. El código de Go usa este valor para analizar el mensaje de cola.

Ejecución la aplicación

Llegado este punto, todo está configurado. Todo lo que debe hacer es ejecutar la aplicación, iniciar el Explorador de Azure Storage y crear un mensaje de cola. El código debe poder consumir ese mensaje.

  1. Desde un terminal, ejecute el comando func start en la raíz del proyecto:

    func start
    
  2. En Visual Studio Code, abra la paleta de comandos y ejecute Azurite: Start Queue Service (Azurite: Iniciar Queue service).

  3. Inicie el Explorador de Azure Storage si aún no se ha iniciado.

  4. En el Explorador de Azure Storage, seleccione Agregar mensaje:

    Screenshot that shows the selection for adding a message on the queue.

  5. En el cuadro de diálogo que aparece, escriba mensaje y seleccione Aceptar. Ahora puede ver los detalles del mensaje que ha creado.

    Screenshot that shows message details.

  6. En Visual Studio Code, la función debería estar en ejecución. En el terminal, ahora debería ver mensaje impreso como la última fila.

    La función pudo consumir el mensaje de cola y escribir su contenido.

¡Enhorabuena! Ha creado una función de Azure en Go que se puede desencadenar en un mensaje de cola. También ha analizado ese mensaje.

Lo que haga con un mensaje entrante es decisión suya. Por ejemplo, puede almacenarlo en una base de datos o quizás enviarlo como carga útil en una solicitud web.