Les messages différés vous permettent de contrôler le moment où un message devient disponible pour la consommation. Le broker ApsaraMQ for RocketMQ conserve le message différé jusqu'à l'heure de livraison spécifiée, puis le diffuse aux abonnés. Les messages différés fonctionnent de manière similaire aux files d'attente différées.
Cas d'utilisation courants :
Gestion des délais d'expiration des commandes : annulez une commande impayée après 30 minutes en envoyant un message différé qui déclenche la logique d'annulation.
Nouvelle tentative avec temporisation : planifiez une nouvelle tentative après un délai fixe lorsqu'une dépendance amont est temporairement indisponible.
Notifications différées : envoyez un rappel ou une notification de suivi après une période d'attente configurable.
Pour plus d'informations sur les concepts et les contraintes, consultez la rubrique Messages planifiés et messages différés.
Prérequis
Avant de commencer, assurez-vous d'avoir :
Le SDK client TCP pour Java installé. Pour plus de détails, consultez la page Préparation de l'environnement.
Une instance ApsaraMQ for RocketMQ, un topic et un groupe de consommateurs créés dans la console. Pour plus de détails, consultez la page Création de ressources.
Une paire AccessKey pour votre compte Alibaba Cloud. Pour plus de détails, consultez la page Création d'une paire AccessKey.
(Facultatif) La journalisation configurée. Pour plus de détails, consultez la page Paramètres de journalisation.
Fonctionnement des messages différés
Le producteur crée un message et définit une heure de livraison à l'aide de la méthode
setStartDeliverTime().Le broker reçoit le message et le conserve jusqu'à l'heure de livraison spécifiée.
À l'heure de livraison, le broker diffuse le message vers le topic, ce qui le rend disponible pour les consommateurs.
| Paramètre | Détail |
|---|---|
| Format de l'heure | Horodatage absolu en millisecondes (époque Unix) |
| Valeur minimale | Doit être ultérieure à l'heure actuelle |
| Délai maximal | 40 jours à partir de l'heure actuelle |
Envoi de messages différés
La seule différence par rapport à l'envoi d'un message normal réside dans l'appel d'une méthode : msg.setStartDeliverTime(delayTime). Cette méthode définit l'horodatage absolu (en millisecondes) auquel le broker doit livrer le message.
Pour plus d'exemples, consultez la bibliothèque de code ApsaraMQ for RocketMQ.
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.Producer;
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import com.aliyun.openservices.ons.api.SendResult;
import java.util.Date;
import java.util.Properties;
public class ProducerDelayTest {
public static void main(String[] args) {
Properties properties = new Properties();
// Retrieve the AccessKey pair from environment variables.
// Make sure ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
properties.put(PropertyKeyConst.AccessKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
properties.put(PropertyKeyConst.SecretKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Specify the TCP endpoint.
// Find this value in the TCP Endpoint section of the Instance Details page
// in the ApsaraMQ for RocketMQ console.
properties.put(PropertyKeyConst.NAMESRV_ADDR, "<your-tcp-endpoint>");
Producer producer = ONSFactory.createProducer(properties);
// Call start() once before sending any messages.
producer.start();
Message msg = new Message(
"<your-topic>", // Topic created in the console
"DelayMessageTag", // Tag for consumer-side filtering, similar to a Gmail tag
"Hello MQ".getBytes() // Message body in binary format.
// ApsaraMQ for RocketMQ does not process message bodies.
// Producer and consumer must agree on serialization.
);
// Optional: set a business key for message tracing.
// The key should be globally unique when possible. Use it to query
// or resend messages in the ApsaraMQ for RocketMQ console.
msg.setKey("ORDERID_100");
try {
// Set the delivery time to 3 seconds from now.
// The value is an absolute timestamp in milliseconds.
// The maximum delay that you can specify is 40 days.
long delayTime = System.currentTimeMillis() + 3000;
msg.setStartDeliverTime(delayTime);
// Send the message in synchronous transmission mode.
// If no exception is thrown, the message is sent.
SendResult sendResult = producer.send(msg);
if (sendResult != null) {
System.out.println(new Date() + " Send mq message success. Topic is:"
+ msg.getTopic() + " msgId is: " + sendResult.getMessageId());
}
} catch (Exception e) {
// Handle send failure: log, retry, or persist the message.
System.out.println(new Date() + " Send mq message failed. Topic is:" + msg.getTopic());
e.printStackTrace();
}
// Shut down the producer when the application exits.
// For high-throughput scenarios, keep the producer running and reuse it.
producer.shutdown();
}
}
Remplacez les espaces réservés suivants par vos valeurs réelles :
| Espace réservé | Description | Exemple |
|---|---|---|
<your-tcp-endpoint> |
Endpoint TCP obtenu depuis la page Instance Details | http://MQ_INST_xxxxx.mq-internet-access.mq-internet.aliyuncs.com:80 |
<your-topic> |
Nom du topic créé dans la console | DelayTopic |
Si vous débutez avec ApsaraMQ for RocketMQ, consultez le projet de démonstration pour configurer un projet fonctionnel avant d'envoyer et de recevoir des messages.
Abonnement aux messages différés
L'abonnement aux messages différés fonctionne de la même manière que l'abonnement aux messages normaux. Aucune configuration spéciale du consommateur n'est requise, car la logique de différé est entièrement gérée côté producteur.
Pour obtenir l'exemple de code du consommateur, consultez la rubrique Abonnement aux messages.
Étapes suivantes
Consultez la rubrique Messages planifiés et messages différés pour comprendre les concepts et les contraintes liés à la livraison des messages différés et planifiés.