All Products
Search
Document Center

ApsaraMQ for RocketMQ:Kirim dan terima pesan terjadwal

Last Updated:Mar 12, 2026

Beberapa skenario bisnis memerlukan pengiriman pesan pada waktu tertentu di masa depan, bukan segera. Misalnya, platform e-commerce perlu membatalkan pesanan yang belum dibayar setelah 30 menit, atau sistem pemantauan harus memicu pemeriksaan kesehatan secara berkala. Pesan terjadwal di ApsaraMQ for RocketMQ memungkinkan Anda menetapkan stempel waktu pengiriman pada setiap pesan sehingga broker menyimpan dan mengirimkannya ke konsumen pada waktu yang ditentukan.

Topik ini menyediakan contoh kode untuk mengirim dan menerima pesan terjadwal menggunakan TCP client SDK untuk Java.

Untuk terminologi dan batasan, lihat Pesan terjadwal dan pesan tertunda.

Catatan

Jika Anda baru mengenal ApsaraMQ for RocketMQ, lihat Proyek demo untuk menyiapkan proyek yang berfungsi sebelum menerapkan pesan terjadwal.

Kasus penggunaan

  • Penanganan timeout pesanan: Kirim pesan terjadwal yang diatur sesuai batas waktu pembayaran saat pengguna melakukan pemesanan. Jika pesanan masih belum dibayar saat pesan dikirimkan, batalkan secara otomatis.

  • Pemicuan tugas berkala: Jadwalkan operasi seperti pembersihan file harian atau sinkronisasi data berkala dengan mengirim pesan yang memiliki waktu pengiriman di masa depan.

Cara kerja pesan terjadwal

  1. Produsen menetapkan stempel waktu pengiriman di masa depan pada sebuah pesan dengan memanggil msg.setStartDeliverTime(timestamp).

  2. Broker menyimpan pesan tersebut hingga stempel waktu yang ditentukan tiba.

  3. Pada waktu yang dijadwalkan, broker mengirimkan pesan tersebut ke konsumen yang berlangganan.

Aturan penyetelan waktu:

AturanPerilaku
Format stempel waktuStempel waktu Unix tingkat milidetik. Konversikan waktu pengiriman target Anda menjadi milidetik sejak epoch.
Stempel waktu lampauPesan dikirimkan segera.

Prasyarat

Sebelum memulai, pastikan Anda telah:

Kirim pesan terjadwal

Contoh berikut mengirim pesan dengan stempel waktu pengiriman di masa depan. Metode msg.setStartDeliverTime(timestamp) memberi tahu broker kapan harus mengirimkan pesan tersebut.

Ganti placeholder dengan nilai aktual Anda:

PlaceholderDeskripsiContoh
<your-topic>Nama topik tujuanmy-scheduled-topic
<your-tag>Tag pesan untuk penyaringan sisi konsumenpayment-timeout
<your-message-body>Isi pesan dalam bentuk array byte"Hello MQ".getBytes()
<your-message-key>Identifier unik spesifik bisnisORDERID_100
<your-tcp-endpoint>Titik akhir TCP dari halaman Detail Instans di Konsol 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();
        // Muat Pasangan Kunci Akses dari variabel lingkungan
        properties.put(PropertyKeyConst.AccessKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        properties.put(PropertyKeyConst.SecretKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // Titik akhir TCP dari halaman Detail Instans di Konsol ApsaraMQ for RocketMQ
        properties.put(PropertyKeyConst.NAMESRV_ADDR, "<your-tcp-endpoint>");

        Producer producer = ONSFactory.createProducer(properties);
        // Panggil start() sekali sebelum mengirim pesan apa pun
        producer.start();

        Message msg = new Message(
                "<your-topic>",            // Topik
                "<your-tag>",              // Tag untuk penyaringan sisi konsumen
                "<your-message-body>".getBytes()  // Isi pesan dalam bentuk byte
        );

        // Opsional: tetapkan kunci bisnis untuk pelacakan pesan di konsol
        msg.setKey("<your-message-key>");

        try {
            // Tetapkan stempel waktu pengiriman (milidetik sejak epoch)
            // Contoh: kirim pada 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) {
            // Tangani kegagalan pengiriman: coba ulang atau simpan pesan
            System.out.println("Send failed. Topic: " + msg.getTopic());
            e.printStackTrace();
        }

        // Matikan produsen saat aplikasi keluar.
        // Untuk pengiriman pesan yang sering, pertahankan produsen tetap berjalan alih-alih
        // mematikannya setelah setiap pengiriman.
        producer.shutdown();
    }
}

Poin penting:

  • setStartDeliverTime(long timestamp) menerima stempel waktu Unix tingkat milidetik. Broker menyimpan pesan tersebut hingga waktu ini tiba.

  • Panggil producer.start() sekali sebelum mengirim. Untuk skenario throughput tinggi, gunakan kembali instans produsen yang sama alih-alih membuat instans baru untuk setiap pesan.

  • msg.setKey() bersifat opsional tetapi direkomendasikan untuk melacak pesan berdasarkan ID bisnis di Konsol ApsaraMQ for RocketMQ.

Untuk contoh tambahan, lihat Pustaka kode ApsaraMQ for RocketMQ.

Berlangganan pesan terjadwal

Berlangganan pesan terjadwal dengan cara yang sama seperti pesan biasa. Tidak diperlukan logika langganan khusus—broker akan mengirimkan pesan ke konsumen ketika stempel waktu yang dijadwalkan tiba.

Untuk kode langganan, lihat Berlangganan pesan.

Praktik terbaik

  • Tetapkan kunci pesan yang unik. Kunci pesan (setKey) sebaiknya unik secara global jika memungkinkan. Gunakan kunci ini untuk mencari pesan di Konsol ApsaraMQ for RocketMQ jika terjadi masalah pengiriman.

  • Gunakan kembali instans produsen. Panggil producer.shutdown() hanya saat aplikasi keluar. Membuat dan menghapus produsen berulang kali akan membuang memori.

Topik terkait