Le mode de sujet RabbitMQ Golang est similaire au mode de routage (Direct), la plus grande différence étant que les paramètres de routage dans le mode de sujet prennent en charge la correspondance floue. Le type d'échange pour le mode de sujet est 'topic'.

L'architecture du mode de sujet est la suivante: Mode de sujet RabbitMQ

Remarque : Si vous n'êtes pas familier avec le mode de sujet RabbitMQ, veuillez d'abord lire la section sur le mode de sujet RabbitMQ.

1. Tutoriel préalable

Veuillez lire les sections suivantes dans l'ordre :

Remarque : Étant donné que la section Golang RabbitMQ publication/abonnement contient déjà des exemples de code complets, seules la définition de l'échange et les paramètres de routage sont différents pour les autres modes RabbitMQ. Par conséquent, seule la partie clé du code est affichée.

2. Déclaration de l'échange de sujet

err = ch.ExchangeDeclare(
  "tizi365_topic", // Nom de l'échange, doit être unique
  "topic",         // Type d'échange
  true,            // Durable
  false,           // Auto-supprimé
  false,           // Interne
  false,           // Pas d'attente
  nil,             // Arguments
)

3. Envoi de messages

    // Contenu du message
    body := "Bonjour Tizi365.com!"

    // Envoyer le message
    err = ch.Publish(
        "tizi365_topic",      // Nom de l'échange
        "www.tizi365.com",    // Paramètre de routage, paramètre crucial déterminant à quelle file votre message sera envoyé
        false,                // Obligatoire
        false,                // Immédiat
        amqp.Publishing {
            ContentType: "text/plain", // Type de contenu du message, ici c'est du texte brut
            Body:        []byte(body),  // Contenu du message
        })

4. Consommation de messages

4.1. Liaison d'échanges

// Déclare la file à utiliser
    q, err := ch.QueueDeclare(
        "",    // Nom de la file, sera généré aléatoirement si non rempli
        false, // File durable
        false, // Supprimer lorsqu'inutilisée
        true,  // Exclusif
        false, // Pas d'attente
        nil,   // Arguments
    )

    // Lie la file à l'échange spécifié
    err = ch.QueueBind(
        q.Name,             // Nom de la file
        "*.tizi365.com",    // Paramètre de routage, paramètre crucial, utilisant le joker * pour faire correspondre un mot, s'il utilise #, il peut faire correspondre plusieurs mots
        "tizi365_topic",    // Nom de l'échange, doit correspondre à l'échange défini par l'expéditeur du message
        false,
        nil)

4.2. Traitement des messages

// Créer un consommateur
    msgs, err := ch.Consume(
        q.Name, // Référence au nom de la file ci-dessus
        "",     // Nom du consommateur, généré automatiquement s'il n'est pas rempli
        true,   // Accusé de réception automatique à la file que le message a été traité
        false,  // Exclusif
        false,  // Pas de local
        false,  // Pas d'attente
        nil,    // Args
    )

    // Parcourir la consommation des messages dans la file
    for d := range msgs {
        log.Printf("Message reçu=%s", d.Body)
    }