El modo de tema de RabbitMQ de Golang es similar al modo de enrutamiento (Direct), con la mayor diferencia de que los parámetros de enrutamiento en el modo de tema admiten coincidencias difusas. El tipo de intercambio para el modo de tema es 'topic'.

La arquitectura del modo de tema es la siguiente: Modo de tema de RabbitMQ

Nota: Si no estás familiarizado con el modo de tema de RabbitMQ, por favor lee primero la sección Modo de tema de RabbitMQ.

1. Tutorial Prerrequisito

Por favor lee las siguientes secciones en orden:

Nota: Debido a que la sección de publicación/suscripción de RabbitMQ de Golang ya contiene ejemplos de código completos, solo la definición de intercambio y los parámetros de enrutamiento son diferentes para otros modos de RabbitMQ. Por lo tanto, solo se muestra el código clave.

2. Declaración de Intercambio de Tema

err = ch.ExchangeDeclare(
  "tizi365_topic", // Nombre del intercambio, debe ser único
  "topic",         // Tipo de intercambio
  true,            // Duradero
  false,           // Auto-eliminado
  false,           // Interno
  false,           // No esperar
  nil,             // Argumentos
)

3. Envío de Mensajes

    // Contenido del mensaje
    body := "¡Hola Tizi365.com!"

    // Publicar mensaje
    err = ch.Publish(
        "tizi365_topic",      // Nombre del intercambio
        "www.tizi365.com",    // Parámetro de enrutamiento, parámetro crucial que determina a qué cola se enviará el mensaje
        false,                // Obligatorio
        false,                // Inmediato
        amqp.Publishing {
            ContentType: "text/plain", // Tipo de contenido del mensaje, aquí es texto sin formato
            Body:        []byte(body),  // Contenido del mensaje
        })

4. Consumo de Mensajes

4.1. Enlazar Intercambio

// Declarar la cola en la que se va a operar
    q, err := ch.QueueDeclare(
        "",    // Nombre de la cola, se generará aleatoriamente si no se completa
        false, // Cola duradera
        false, // Eliminar cuando no se use
        true,  // Exclusiva
        false, // No esperar
        nil,   // Argumentos
    )

    // Enlazar la cola al intercambio especificado
    err = ch.QueueBind(
        q.Name,             // Nombre de la cola
        "*.tizi365.com",    // Parámetro de enrutamiento, parámetro crucial, usando el comodín * para hacer coincidir una palabra, si se usa #, puede hacer coincidir varias palabras
        "tizi365_topic",    // Nombre del intercambio, debe coincidir con el intercambio definido por el remitente del mensaje
        false,
        nil)

4.2. Manejo de Mensajes

// Crear un consumidor
    msgs, err := ch.Consume(
        q.Name, // Referencia al nombre de la cola anterior
        "",     // Nombre del consumidor, se genera automáticamente si no se completa
        true,   // Reconocimiento automático a la cola de que el mensaje ha sido manejado
        false,  // Exclusivo
        false,  // No local
        false,  // No esperar
        nil,    // Argumentos
    )

    // Iterar a través de la consumición de mensajes en la cola
    for d := range msgs {
        log.Printf("Mensaje recibido=%s", d.Body)
    }