Bazı iş senaryolarında iletilerin hemen değil, gelecekte belirli bir zamanda teslim edilmesi gerekir. Örneğin, bir e-ticaret platformunun 30 dakika sonra ödenmemiş siparişleri iptal etmesi veya bir izleme sisteminin periyodik sağlık kontrollerini tetiklemesi gerekebilir. ApsaraMQ for RocketMQ'deki zamanlanmış iletiler, her iletiye bir teslim zaman damgası ayarlamanıza olanak tanır; bu sayede broker iletiyi tutar ve belirtilen zamanda tüketicilere iletir.
Bu konuda, Java için TCP istemci SDK'sını kullanarak zamanlanmış iletileri göndermeye ve almaya yönelik örnek kodlar sunulmaktadır.
Terimoloji ve kısıtlamalar için bkz. Zamanlanmış iletiler ve gecikmeli iletiler.
ApsaraMQ for RocketMQ'yu ilk kez kullanıyorsanız, zamanlanmış iletileri uygulamadan önce çalışan bir proje kurmak amacıyla Demo projesi ne göz atın.
Kullanım senaryoları
Sipariş zaman aşımı yönetimi: Kullanıcı bir sipariş verdiğinde, ödeme son tarihine ayarlanmış bir zamanlanmış ileti gönderin. İleti teslim edildiğinde sipariş hala ödenmemişse otomatik olarak iptal edin.
Periyodik görev tetikleme: Gelecekteki teslim zamanlarına sahip iletiler göndererek günlük dosya temizliği veya periyodik veri senkronizasyonu gibi işlemleri planlayın.
Zamanlanmış iletilerin çalışma biçimi
Üretici,
msg.setStartDeliverTime(timestamp)yöntemini çağırarak iletiye gelecekteki bir teslim zaman damgası atar.Broker, belirtilen zaman damgasına kadar iletiyi bekletir.
Planlanan saatte broker, abone olmuş tüketicilere iletiyi iletir.
Zaman ayarlama kuralları:
| Kural | Davranış |
|---|---|
| Zaman damgası biçimi | Milisaniye düzeyinde Unix zaman damgası. Hedef teslim zamanınızı epoch'tan itibaren milisaniye cinsinden dönüştürün. |
| Geçmiş zaman damgası | İleti hemen teslim edilir. |
Ön koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
Java için SDK'nın yüklü olması. Bkz. Ortamı hazırlama
ApsaraMQ for RocketMQ konsolu nda bir ApsaraMQ for RocketMQ örneği, konu ve tüketici grubu oluşturulmuş olması
Alibaba Cloud hesabınız için bir AccessKey çifti oluşturulmuş olması
(İsteğe bağlı) Günlük kaydı ayarları nun yapılandırılmış olması
Zamanlanmış ileti gönderme
Aşağıdaki örnekte, gelecekteki bir teslim zaman damgasına sahip bir ileti gönderilmektedir. msg.setStartDeliverTime(timestamp) yöntemi, broker'a iletinin ne zaman teslim edileceğini bildirir.
Yer tutucuları gerçek değerlerinizle değiştirin:
| Yer Tutucu | Açıklama | Örnek |
|---|---|---|
<your-topic> |
Hedef konu adı | my-scheduled-topic |
<your-tag> |
Tüketici filtreleme için ileti etiketi | payment-timeout |
<your-message-body> |
Bayt dizisi olarak ileti içeriği | "Hello MQ".getBytes() |
<your-message-key> |
İşe özgü benzersiz tanımlayıcı | ORDERID_100 |
<your-tcp-endpoint> |
ApsaraMQ for RocketMQ konsolundaki Örnek Ayrıntıları sayfasından alınan TCP uç noktası | -- |
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();
}
}
Önemli noktalar:
setStartDeliverTime(long timestamp)yöntemi milisaniye düzeyinde bir Unix zaman damgası kabul eder. Broker, bu zamana kadar iletiyi bekletir.İleti göndermeden önce
producer.start()yöntemini bir kez çağırın. Yüksek aktarım hızı gerektiren senaryolarda, her ileti için yeni bir üretici oluşturmak yerine aynı üretici örneğini yeniden kullanın.msg.setKey()isteğe bağlıdır ancak ApsaraMQ for RocketMQ konsolunda iletileri iş kimliğine göre izlemek için önerilir.
Ek örnekler için ApsaraMQ for RocketMQ kod kitaplığına bakın.
Zamanlanmış iletilere abone olma
Zamanlanmış iletilere normal iletilerle aynı şekilde abone olun. Özel bir abonelik mantığı gerekmez; broker, planlanan zaman damgası geldiğinde iletiyi tüketicilere iletir.
Abonelik kodu için bkz. İletilere abone olma.
En iyi uygulamalar
Benzersiz ileti anahtarları ayarlayın. Mümkün olduğunca ileti anahtarı (
setKey) genel olarak benzersiz olmalıdır. Teslim sorunları oluşursa ApsaraMQ for RocketMQ konsolunda iletileri aramak için bu anahtarı kullanın.Üretici örneğini yeniden kullanın.
producer.shutdown()yöntemini yalnızca uygulama çıktığında çağırın. Üreticileri tekrar tekrar oluşturup yok etmek belleği boşa harcar.
İlgili konular
Zamanlanmış iletiler ve gecikmeli iletiler -- Planlama mekanizması ve kısıtlamalar
İletilere abone olma -- İleti tüketimini ayarlama
ApsaraMQ for RocketMQ kod kitaplığı -- Daha fazla Java SDK örneği
Demo projesi -- Tam çalışan proje