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.
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
Produsen menetapkan stempel waktu pengiriman di masa depan pada sebuah pesan dengan memanggil
msg.setStartDeliverTime(timestamp).Broker menyimpan pesan tersebut hingga stempel waktu yang ditentukan tiba.
Pada waktu yang dijadwalkan, broker mengirimkan pesan tersebut ke konsumen yang berlangganan.
Aturan penyetelan waktu:
| Aturan | Perilaku |
|---|---|
| Format stempel waktu | Stempel waktu Unix tingkat milidetik. Konversikan waktu pengiriman target Anda menjadi milidetik sejak epoch. |
| Stempel waktu lampau | Pesan dikirimkan segera. |
Prasyarat
Sebelum memulai, pastikan Anda telah:
Menginstal SDK untuk Java. Lihat Persiapkan lingkungan.
Membuat instans ApsaraMQ for RocketMQ, topik, dan kelompok konsumen di Konsol ApsaraMQ for RocketMQ.
Memiliki Pasangan Kunci Akses untuk Akun Alibaba Cloud Anda.
(Opsional) Mengonfigurasi Pengaturan logging.
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:
| Placeholder | Deskripsi | Contoh |
|---|---|---|
<your-topic> | Nama topik tujuan | my-scheduled-topic |
<your-tag> | Tag pesan untuk penyaringan sisi konsumen | payment-timeout |
<your-message-body> | Isi pesan dalam bentuk array byte | "Hello MQ".getBytes() |
<your-message-key> | Identifier unik spesifik bisnis | ORDERID_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
Pesan terjadwal dan pesan tertunda — Mekanisme penjadwalan dan batasan
Berlangganan pesan — Menyiapkan konsumsi pesan
Pustaka kode ApsaraMQ for RocketMQ — Lebih banyak contoh Java SDK
Proyek demo — Proyek lengkap yang berfungsi