Les messages normaux dans ApsaraMQ for RocketMQ ne disposent d'aucune sémantique de distribution particulière. Ils se distinguent des messages planifiés, différés, ordonnés et transactionnels.
Chaque topic prend en charge un seul type de message. Un topic créé pour les messages normaux ne peut ni envoyer ni recevoir d'autres types de messages.
Les sections suivantes expliquent comment envoyer et recevoir des messages normaux à l'aide du SDK client TCP pour C/C++.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Créé les ressources requises — une instance, un topic et un groupe de consommateurs — dans la console ApsaraMQ for RocketMQ
Créé une paire AccessKey pour votre compte Alibaba Cloud
Envoyer des messages normaux
L'exemple suivant crée un producteur, établit une connexion avec le broker et envoie un message normal unique.
Remplacez les espaces réservés dans le code par vos valeurs réelles :
| Espace réservé | Description | Où le trouver |
|---|---|---|
<your-group-id> |
ID du groupe de producteurs | Console ApsaraMQ for RocketMQ |
<your-tcp-endpoint> |
URL de l'endpoint TCP | Section TCP Endpoint sur la page Instance Details |
<your-topic> |
Nom du topic | Console ApsaraMQ for RocketMQ |
<your-message-content> |
Contenu du corps du message | Défini par votre application |
#include "ONSFactory.h"
#include "ONSClientException.h"
using namespace ons;
int main()
{
// Configure producer properties
ONSFactoryProperty factoryInfo;
factoryInfo.setFactoryProperty(ONSFactoryProperty::ProducerId, "<your-group-id>");
factoryInfo.setFactoryProperty(ONSFactoryProperty::NAMESRV_ADDR, "<your-tcp-endpoint>");
factoryInfo.setFactoryProperty(ONSFactoryProperty::PublishTopics, "<your-topic>");
factoryInfo.setFactoryProperty(ONSFactoryProperty::MsgContent, "<your-message-content>");
// Load credentials from environment variables.
// Make sure ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
factoryInfo.setFactoryProperty(ONSFactoryProperty::AccessKey, getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
factoryInfo.setFactoryProperty(ONSFactoryProperty::SecretKey, getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Create and start the producer.
// Call start() exactly once before sending any messages.
Producer *pProducer = ONSFactory::getInstance()->createProducer(factoryInfo);
pProducer->start();
// Build the message
Message msg(
factoryInfo.getPublishTopics(), // Topic (must be a normal-message topic)
"TagA", // Tag -- consumers use tags to filter messages
factoryInfo.getMessageContent() // Body -- cannot be empty
);
// Set a message key for traceability.
// Keys must be globally unique whenever possible (for example, an order ID).
// Use the key to look up messages in the ApsaraMQ for RocketMQ console.
msg.setKey("ORDERID_100");
// Send the message. If no exception is thrown, the message is sent.
try
{
SendResultONS sendResult = pProducer->send(msg);
}
catch(ONSClientException & e)
{
// Handle the send failure (log, retry, alert, etc.)
}
// Shut down the producer before your application exits to prevent issues such as memory leaks.
pProducer->shutdown();
return 0;
}
Propriétés des messages
| Propriété | Détails |
|---|---|
| Tag | Classificateur secondaire associé à chaque message. Les consommateurs utilisent les tags pour filtrer les messages côté broker, afin que seuls les messages pertinents soient distribués. |
| Key | Identifiant métier (tel qu'un ID de commande) qui doit être globalement unique dans la mesure du possible. Utilisez-le pour interroger des messages spécifiques dans la console ApsaraMQ for RocketMQ. La définition d'une clé est facultative ; les messages peuvent être envoyés et reçus sans celle-ci. |
| Body | Charge utile du message. ApsaraMQ for RocketMQ ne traite ni n'analyse le corps du message. Le producteur et le consommateur doivent convenir du format de sérialisation et de désérialisation. Le corps ne peut pas être vide. |
Cycle de vie du producteur
| Phase | Méthode | Notes |
|---|---|---|
| Démarrage | pProducer->start() |
Appelez cette méthode une seule fois avant d'envoyer des messages. |
| Envoi | pProducer->send(msg) |
Si aucune exception n'est levée, le message est envoyé. |
| Arrêt | pProducer->shutdown() |
Appelez cette méthode avant la fin de l'application. Ignorer cette étape peut entraîner des problèmes tels que des fuites de mémoire. |
S'abonner à des messages normaux
Pour la configuration du consommateur et l'exemple de code utilisant le SDK client TCP pour C/C++, consultez S'abonner à des messages.