Gecikmeli mesajlar, bir mesajın ne zaman tüketilmeye hazır hale geleceğini kontrol etmenizi sağlar. ApsaraMQ for RocketMQ broker'ı gecikmeli bir mesajı belirtilen teslimat zamanına kadar tutar ve ardından bu mesajı abonelere iletir. Gecikmeli mesajlar gecikmeli kuyruklara benzer.
Yaygın kullanım senaryoları şunlardır:
Sipariş zaman aşımı yönetimi: İptal mantığını tetikleyen gecikmeli bir mesaj göndererek ödenmemiş bir siparişi 30 dakika sonra iptal edin.
Kademeli yeniden deneme: Yukarı akıştaki bir bağımlılık geçici olarak kullanılamadığında sabit bir gecikmeden sonra yeniden deneme girişimini planlayın.
Ertelemeli bildirimler: Yapılandırılabilir bir bekleme süresinin ardından hatırlatıcı veya takip bildirimi gönderin.
Kavramlar ve kısıtlamalar için bkz. Zamanlanmış mesajlar ve gecikmeli mesajlar.
Ön koşullar
Başlamadan önce aşağıdaki öğelerin hazır olduğundan emin olun:
Java için TCP istemci SDK'sının yüklü olması. Ayrıntılar için bkz. Ortamı hazırlama
Konsolda bir ApsaraMQ for RocketMQ örneği, konusu ve tüketici grubu oluşturulmuş olması. Ayrıntılar için bkz. Kaynak oluşturma
Alibaba Cloud hesabınız için bir AccessKey çifti. Ayrıntılar için bkz. AccessKey çifti oluşturma
(İsteğe bağlı) Günlük kaydının yapılandırılmış olması. Ayrıntılar için bkz. Günlük ayarları
Gecikmeli mesajların çalışma mekanizması
Üretici bir mesaj oluşturur ve
setStartDeliverTime()yöntemini kullanarak bir teslimat zamanı belirtir.Broker mesajı alır ve belirtilen teslimat zamanına kadar bekletir.
Teslimat zamanında broker mesajı konuya bırakır; böylece mesaj tüketiciler tarafından kullanılabilir hale gelir.
| Parametre | Açıklama |
|---|---|
| Zaman biçimi | Milisaniye cinsinden mutlak zaman damgası (Unix epoch) |
| Minimum değer | Geçerli zamandan daha ileri bir tarih olmalıdır |
| Maksimum gecikme | Geçerli zamandan itibaren 40 gün |
Gecikmeli mesaj gönderme
Normal bir mesaj göndermekten tek farkı bir yöntem çağrısıdır: msg.setStartDeliverTime(delayTime). Bu çağrı broker'ın mesajı ileteceği mutlak zaman damgasını (milisaniye cinsinden) ayarlar.
Daha fazla örnek için ApsaraMQ for RocketMQ kod kitaplığına bakın.
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.util.Date;
import java.util.Properties;
public class ProducerDelayTest {
public static void main(String[] args) {
Properties properties = new Properties();
// Retrieve the AccessKey pair from environment variables.
// Make sure ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
properties.put(PropertyKeyConst.AccessKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
properties.put(PropertyKeyConst.SecretKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Specify the TCP endpoint.
// Find this value in the TCP Endpoint section of 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 created in the console
"DelayMessageTag", // Tag for consumer-side filtering, similar to a Gmail tag
"Hello MQ".getBytes() // Message body in binary format.
// ApsaraMQ for RocketMQ does not process message bodies.
// Producer and consumer must agree on serialization.
);
// Optional: set a business key for message tracing.
// The key should be globally unique when possible. Use it to query
// or resend messages in the ApsaraMQ for RocketMQ console.
msg.setKey("ORDERID_100");
try {
// Set the delivery time to 3 seconds from now.
// The value is an absolute timestamp in milliseconds.
// The maximum delay that you can specify is 40 days.
long delayTime = System.currentTimeMillis() + 3000;
msg.setStartDeliverTime(delayTime);
// Send the message in synchronous transmission mode.
// If no exception is thrown, the message is sent.
SendResult sendResult = producer.send(msg);
if (sendResult != null) {
System.out.println(new Date() + " Send mq message success. Topic is:"
+ msg.getTopic() + " msgId is: " + sendResult.getMessageId());
}
} catch (Exception e) {
// Handle send failure: log, retry, or persist the message.
System.out.println(new Date() + " Send mq message failed. Topic is:" + msg.getTopic());
e.printStackTrace();
}
// Shut down the producer when the application exits.
// For high-throughput scenarios, keep the producer running and reuse it.
producer.shutdown();
}
}
Aşağıdaki yer tutucuları gerçek değerlerinizle değiştirin:
| Yer Tutucu | Açıklama | Örnek |
|---|---|---|
<your-tcp-endpoint> |
Örnek Ayrıntıları sayfasındaki TCP uç noktası | http://MQ_INST_xxxxx.mq-internet-access.mq-internet.aliyuncs.com:80 |
<your-topic> |
Konsolda oluşturulan konu adı | DelayTopic |
ApsaraMQ for RocketMQ konusunda yeniyseniz mesaj gönderip almadan önce çalışan bir proje kurmak için Demo projesine bakın.
Gecikmeli mesajlara abonelik kurma
Gecikmeli mesajlara abonelik kurma işlemi normal mesajlara abonelik kurmayla aynı şekilde çalışır. Özel bir tüketici yapılandırması gerekmez; gecikme mantığı tamamen üretici tarafındadır.
Tüketici örnek kodu için bkz. Mesajlara abonelik kurma.
Sonraki adımlar
Zamanlanmış mesajlar ve gecikmeli mesajlar: Gecikmeli ve zamanlanmış mesaj teslimatının arkasındaki kavramları ve kısıtlamaları anlayın.