Tous les produits
Search
Centre de documentation

ApsaraMQ for RocketMQ:Send and receive scheduled messages

Dernière mise à jour :Aug 09, 2026

Certains scénarios métier exigent une livraison différée des messages à un instant précis, plutôt qu'immédiate. Par exemple, une plateforme e-commerce doit annuler les commandes impayées après 30 minutes, ou un système de surveillance doit déclencher des contrôles d'intégrité périodiques. Les messages planifiés dans ApsaraMQ for RocketMQ vous permettent de définir un horodatage de livraison pour chaque message : le broker le conserve puis le livre aux consommateurs à l'heure spécifiée.

Cette rubrique propose des exemples de code pour envoyer et recevoir des messages planifiés avec le SDK client TCP pour Java.

Pour la terminologie et les contraintes, consultez la section Messages planifiés et messages différés.

Remarque

Si vous débutez avec ApsaraMQ for RocketMQ, consultez le Projet de démonstration pour configurer un projet fonctionnel avant d'implémenter les messages planifiés.

Cas d'utilisation

  • Gestion des délais d'expiration des commandes : envoyez un message planifié dont l'horodatage correspond à la date limite de paiement lorsqu'un utilisateur passe commande. Si la commande reste impayée à la livraison du message, le système l'annule automatiquement.

  • Déclenchement de tâches périodiques : planifiez des opérations telles que le nettoyage quotidien des fichiers ou la synchronisation régulière des données en envoyant des messages avec une heure de livraison future.

Fonctionnement des messages planifiés

  1. Le producteur définit un horodatage de livraison futur sur un message en appelant msg.setStartDeliverTime(timestamp).

  2. Le broker conserve le message jusqu'à l'horodatage spécifié.

  3. À l'heure prévue, le broker livre le message aux consommateurs abonnés.

Règles de définition de l'heure :

Règle Comportement
Format de l'horodatage Horodatage Unix en millisecondes. Convertissez l'heure de livraison cible en millisecondes depuis l'époque Unix.
Horodatage passé Le message est livré immédiatement.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

Envoyer un message planifié

L'exemple suivant envoie un message avec un horodatage de livraison futur. La méthode msg.setStartDeliverTime(timestamp) indique au broker quand livrer le message.

Remplacez les espaces réservés par vos valeurs réelles :

Espace réservé Description Exemple
<your-topic> Nom du topic cible my-scheduled-topic
<your-tag> Tag du message pour le filtrage côté consommateur payment-timeout
<your-message-body> Contenu du message sous forme de tableau d'octets "Hello MQ".getBytes()
<your-message-key> Identifiant unique spécifique à votre activité ORDERID_100
<your-tcp-endpoint> Endpoint TCP disponible sur la page Détails de l'instance dans la console 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.text.SimpleDateFormat;
import java.util.Properties;

public class ProducerDelayTest {
    public static void main(String[] args) {
        Properties properties = new Properties();
        // Load AccessKey pair from environment variables
        properties.put(PropertyKeyConst.AccessKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        properties.put(PropertyKeyConst.SecretKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // TCP endpoint from 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
                "<your-tag>",              // Tag for consumer-side filtering
                "<your-message-body>".getBytes()  // Message body in bytes
        );

        // Optional: set a business key for message tracing in the console
        msg.setKey("<your-message-key>");

        try {
            // Set the delivery timestamp (milliseconds since epoch)
            // Example: deliver at 2026-03-15 10:30:00
            long deliverTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                    .parse("2026-03-15 10:30:00")
                    .getTime();
            msg.setStartDeliverTime(deliverTime);

            SendResult sendResult = producer.send(msg);
            System.out.println("Message Id:" + sendResult.getMessageId());
        } catch (Exception e) {
            // Handle send failure: retry or persist the message
            System.out.println("Send failed. Topic: " + msg.getTopic());
            e.printStackTrace();
        }

        // Shut down the producer when the application exits.
        // To send messages frequently, keep the producer running instead of
        // shutting it down after each send.
        producer.shutdown();
    }
}

Points clés :

  • La méthode setStartDeliverTime(long timestamp) accepte un horodatage Unix en millisecondes. Le broker conserve le message jusqu'à cet instant.

  • Appelez producer.start() une seule fois avant d'envoyer des messages. Pour les scénarios à haut débit, réutilisez la même instance de producteur au lieu d'en créer une nouvelle pour chaque message.

  • L'appel à msg.setKey() est facultatif mais recommandé pour tracer les messages par ID métier dans la console ApsaraMQ for RocketMQ.

Pour plus d'exemples, consultez la bibliothèque de code ApsaraMQ for RocketMQ.

S'abonner aux messages planifiés

Abonnez-vous aux messages planifiés comme aux messages classiques. Aucune logique d'abonnement spécifique n'est requise : le broker livre le message aux consommateurs lorsque l'horodatage planifié est atteint.

Pour le code d'abonnement, reportez-vous à la section S'abonner aux messages.

Bonnes pratiques

  • Définissez des clés de message uniques. La clé de message (méthode setKey) doit être globalement unique dans la mesure du possible. Utilisez-la pour rechercher des messages dans la console ApsaraMQ for RocketMQ en cas de problèmes de livraison.

  • Réutilisez l'instance du producteur. N'appelez producer.shutdown() qu'à la fermeture de l'application. Créer et détruire des producteurs de manière répétée gaspille de la mémoire.

Rubriques connexes