Tous les produits
Search
Centre de documentation

ApsaraMQ for RocketMQ:Send and receive scheduled messages

Dernière mise à jour :Aug 09, 2026

Les messages planifiés sont remis aux consommateurs à un horodatage précis plutôt qu'immédiatement. Utilisez-les lorsque vous devez respecter un délai entre la production et la consommation d'un message, ou pour déclencher des tâches planifiées via des messages (par exemple, annuler une commande impayée après 30 minutes ou lancer un nettoyage périodique).

L'exemple de code .NET ci-dessous montre comment envoyer des messages planifiés avec le SDK client TCP. Pour comprendre la différence entre les messages planifiés et les messages différés, consultez la rubrique Messages planifiés et messages différés.

Régions prises en charge

Les messages planifiés sont disponibles dans les régions suivantes :

  • Internet

  • Chine (Hangzhou)

  • Chine (Pékin)

  • Chine (Shanghai)

  • Chine (Shenzhen)

Fonctionnement

  1. Le producteur appelle setStartDeliverTime pour définir l'horodatage de remise du message.

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

  3. À l'heure de remise, le message devient disponible pour les consommateurs.

L'heure de remise est un horodatage Unix en millisecondes (temps absolu, et non délai relatif).

Prérequis

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

Envoyer un message planifié

L'exemple suivant envoie un message dont la remise est prévue dans 3 secondes. Pour plus d'exemples, consultez le dépôt de code ApsaraMQ for RocketMQ.

Remplacez les espaces réservés avant d'exécuter le code :

Espace réservé Description Où le trouver
<your-group-id> ID du groupe de consommateurs Console ApsaraMQ for RocketMQ
<your-tcp-endpoint> Endpoint TCP Page Instance Details, section TCP Endpoint
<your-topic> Nom du topic Console ApsaraMQ for RocketMQ
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using ons;

namespace ons
{
    class onscsharp
    {
        private static readonly DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

        public static long CurrentTimeMillis()
        {
           return (long) (DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
        }

        static void Main(string[] args)
        {
            // Configure the producer.
            ONSFactoryProperty factoryInfo = new ONSFactoryProperty();
            // Consumer group ID created in the ApsaraMQ for RocketMQ console.
            factoryInfo.setFactoryProperty(ONSFactoryProperty.ProducerId, "<your-group-id>");
            // TCP endpoint from the Instance Details page.
            factoryInfo.setFactoryProperty(ONSFactoryProperty.NAMESRV_ADDR, "<your-tcp-endpoint>");
            // Topic created in the ApsaraMQ for RocketMQ console.
            factoryInfo.setFactoryProperty(ONSFactoryProperty.PublishTopics, "<your-topic>");
            // Message content.
            factoryInfo.setFactoryProperty(ONSFactoryProperty.MsgContent, "scheduled_msg_body");
            // Load AccessKey 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() only once before sending messages.
            Producer pProducer = ONSFactory.getInstance().createProducer(factoryInfo);
            pProducer.start();

            Message msg = new Message(
                factoryInfo.getPublishTopics(),  // Topic
                "TagA",                          // Message tag for filtering
                factoryInfo.getMessageContent()  // Message body
            );

            // Set a business key for message tracing in the console.
            // Optional -- messages send and receive correctly without a key.
            msg.setKey("ORDERID_100");

            // Set the delivery time to 3 seconds from now (millisecond Unix timestamp).
            long deliverTime = CurrentTimeMillis() + 3000;
            msg.setStartDeliverTime(deliverTime);

            // Send the message. A successful call returns a SendResultONS object.
            try
            {
                SendResultONS sendResult = pProducer.send(msg);
            }
            catch(ONSClientException e)
            {
                // Handle send failures (network issues, invalid parameters, etc.).
            }

            // Shut down the producer before exiting to avoid memory leaks.
            pProducer.shutdown();

        }
    }
}

S'abonner à des messages planifiés

Les messages planifiés ne nécessitent aucune configuration particulière du côté du consommateur. Une fois l'heure de remise atteinte, le message apparaît dans le topic comme n'importe quel autre message. Utilisez le même code de consommateur que pour les messages standards.

Pour obtenir un exemple de code, consultez la rubrique S'abonner à des messages.

Notes d'utilisation