Il modo topic di RabbitMQ in Golang è simile alla modalità di routing (Diretto), con la differenza principale che i parametri di routing nel modo topic supportano la corrispondenza approssimativa. Il tipo di exchange per la modalità topic è 'topic'.

L'architettura della modalità topic è la seguente: RabbitMQ Modalità Topic

Nota: Se non sei familiare con la modalità topic di RabbitMQ, leggi prima la sezione RabbitMQ modalità topic.

1. Tutorial Preliminare

Per favore, leggi le seguenti sezioni in ordine:

Nota: Poiché la sezione di pubblicazione/iscrizione di Golang RabbitMQ contiene già esempi di codice completi, cambiano solo la definizione dell'exchange e i parametri di routing per altri modi di RabbitMQ. Pertanto, viene mostrato solo il codice chiave.

2. Dichiarazione dell'Exchange Topic

err = ch.ExchangeDeclare(
  "tizi365_topic", // Nome dell'exchange, deve essere univoco
  "topic",         // Tipo di exchange
  true,            // Durevole
  false,           // Auto-cancellabile
  false,           // Interno
  false,           // No-wait
  nil,             // Argomenti
)

3. Invio dei Messaggi

    // Contenuto del messaggio
    body := "Ciao Tizi365.com!"

    // Invia il messaggio
    err = ch.Publish(
        "tizi365_topic",      // Nome dell'exchange
        "www.tizi365.com",    // Parametro di routing, parametro cruciale che determina a quale coda verrà inviato il tuo messaggio
        false,                // Obbligatorio
        false,                // Immediato
        amqp.Publishing {
            ContentType: "text/plain", // Tipo di contenuto del messaggio, qui è testo semplice
            Body:        []byte(body),  // Contenuto del messaggio
        })

4. Consumo dei Messaggi

4.1. Binding dell'Exchange

// Dichiarare la coda su cui operare
    q, err := ch.QueueDeclare(
        "",    // Nome della coda, verrà generato casualmente se non compilato
        false, // Coda durevole
        false, // Elimina quando non utilizzata
        true,  // Esclusiva
        false, // No-wait
        nil,   // Argomenti
    )

    // Associare la coda all'exchange specificato
    err = ch.QueueBind(
        q.Name,             // Nome della coda
        "*.tizi365.com",    // Parametro di routing, parametro cruciale, utilizzando il jolly * per corrispondere a una parola, se # è usato, può corrispondere a più parole
        "tizi365_topic",    // Nome dell'exchange, deve corrispondere all'exchange definito dal mittente del messaggio
        false,
        nil)

4.2. Gestione dei Messaggi

// Creare un consumatore
    msgs, err := ch.Consume(
        q.Name, // Riferimento al nome della coda sopra
        "",     // Nome del consumatore, generato automaticamente se non compilato
        true,   // Acquisizione automatica della coda che il messaggio è stato gestito
        false,  // Esclusivo
        false,  // No-local
        false,  // No-wait
        nil,    // Argomenti
    )

    // Iterare attraverso il consumo dei messaggi nella coda
    for d := range msgs {
        log.Printf("Messaggio ricevuto=%s", d.Body)
    }