Tous les produits
Search
Centre de documentation

ApsaraMQ for RocketMQ:Send and subscribe to delayed messages

Dernière mise à jour :Aug 09, 2026

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 :

Fonctionnement des messages différés

  1. Le producteur crée un message et définit une heure de livraison à l'aide de la méthode setStartDeliverTime().

  2. Le broker reçoit le message et le conserve jusqu'à l'heure de livraison spécifiée.

  3. À 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
Remarque

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