ApsaraMQ for RocketMQ, normal mesajlar için üç iletim modunu destekler. Uygulamanızın gerektirdiği teslimat garantisi düzeyine göre bir mod seçin:
| Mod | Davranış | En uygun kullanım alanı |
|---|---|---|
| Eşzamanlı | Üretici, sonraki mesajı göndermeden önce aracıdan onay bekler. | Teslimat onayı gerektiren senaryolar |
| Eşzamansız | Üretici mesajı gönderir ve hemen devam eder. Sonuç bir geri arama ile döner. | Gecikme süresine duyarlı iş akışları |
| Tek yönlü | Üretici herhangi bir yanıt beklemeden mesaj gönderir. | Aralıklı mesaj kaybının kabul edilebilir olduğu yüksek aktarım hızı senaryoları |
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
ApsaraMQ for RocketMQ konsolunda örnekler, konular ve tüketici grupları oluşturuldu
Alibaba Cloud hesabınız için bir AccessKey çifti
(İsteğe bağlı) Yapılandırılmış günlük ayarları
Ortak üretici kurulumu
Üç mod da aynı başlatma mantığını kullanır. Üreticiyi bir kez oluşturun, ardından moda özgü gönderme yöntemini çağırın.
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.aliyun.openservices.ons.api.SendResult;
import com.aliyun.openservices.ons.api.SendCallback;
import com.aliyun.openservices.ons.api.OnExceptionContext;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import java.util.Date;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
Properties properties = new Properties();
// Read credentials 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"));
// Send timeout in milliseconds.
properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");
// TCP endpoint. Find this 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();
Yer tutucuyu gerçek değerinizle değiştirin:
| Yer Tutucu | Açıklama | Örnek |
|---|---|---|
<your-tcp-endpoint> |
Örneğinizin TCP uç noktası | http://MQ_INST_xxxxx.mq-internet.region.aliyuncs.com:80 |
Mesaj oluşturma
Her gönderme çağrısı bir Message nesnesi gerektirir. Kurucu üç bağımsız değişken alır:
Message msg = new Message(
"TopicTestMQ", // Topic -- must be a normal-message topic
"TagA", // Tag -- used by consumers to filter messages
"Hello MQ".getBytes() // Body -- binary payload; producer and consumer must
// agree on the serialization format
);
// Optional: set a business key for message tracing in the console.
msg.setKey("ORDERID_100");
Normal mesajlar için kullanılan bir konu, işlem veya zamanlanmış mesajlar gibi diğer mesaj türleri için kullanılamaz.
Eşzamanlı iletim
Üretici mesajı gönderir ve aracıdan yanıt gelene kadar bekler. Özel durum oluşmazsa mesaj başarıyla teslim edilmiştir.

Ne zaman kullanılır: E-posta bildirimleri, kayıt uyarıları veya promosyon mesajları gibi teslimat onayı gerektiren senaryolar.
Örnek kod
for (int i = 0; i < 100; i++) {
Message msg = new Message("TopicTestMQ", "TagA", "Hello MQ".getBytes());
msg.setKey("ORDERID_" + i);
try {
SendResult sendResult = producer.send(msg);
// A non-null result means the broker accepted the message.
if (sendResult != null) {
System.out.println(new Date() + " Send mq message success. Topic is:"
+ msg.getTopic() + " msgId is: " + sendResult.getMessageId());
}
} catch (Exception e) {
// Handle failures: retry or persist the message for later delivery.
System.out.println(new Date() + " Send mq message failed. Topic is:" + msg.getTopic());
e.printStackTrace();
}
}
Eşzamansız iletim
Üretici mesajı gönderir ve hemen döner. Aracı yanıtı, iki yöntemi olan bir SendCallback aracılığıyla iletilir: onSuccess ve onException.

Ne zaman kullanılır: Çağrı yapan iş parçacığının engellenemeyeceği gecikme süresine duyarlı iş akışları; örneğin, video dönüştürme işi göndermek ve sonucu bir geri aramada işlemek.
Örnek kod
Message msg = new Message("TopicTestMQ", "TagA", "Hello MQ".getBytes());
msg.setKey("ORDERID_100");
producer.sendAsync(msg, new SendCallback() {
@Override
public void onSuccess(final SendResult sendResult) {
System.out.println("send message success. topic=" + sendResult.getTopic()
+ ", msgId=" + sendResult.getMessageId());
}
@Override
public void onException(OnExceptionContext context) {
// Handle failures: retry or persist the message for later delivery.
System.out.println("send message failed. topic=" + context.getTopic()
+ ", msgId=" + context.getMessageId());
}
});
// Block for 3 seconds to wait for the callback. In production, use a
// CountDownLatch or similar mechanism instead of Thread.sleep.
TimeUnit.SECONDS.sleep(3);
Tek yönlü iletim
Üretici mesajı gönderir ve devam eder. Yanıt döndürülmez ve geri arama tetiklenmez. Bu mod, güvenilirlik pahasına en yüksek aktarım hızını sunar; mesaj mikrosaniyeler içinde gönderilebilir.

Ne zaman kullanılır: Günlük toplama veya ölçüm raporlama gibi aralıklı mesaj kaybının kabul edilebilir olduğu yüksek hacimli senaryolar.
Aracı, tek yönlü modda yanıt göndermez; bu nedenle başarısız mesajlar sessizce kaybolur. Veri kaybı kabul edilemiyorsa bunun yerine eşzamanlı veya eşzamansız iletimi kullanın.
Örnek kod
for (int i = 0; i < 100; i++) {
Message msg = new Message("TopicTestMQ", "TagA", "Hello MQ".getBytes());
msg.setKey("ORDERID_" + i);
// No return value, no callback. Fire and forget.
producer.sendOneway(msg);
}
Üreticiyi kapatma
Kaynakları serbest bırakmak için uygulamanız çıkmadan önce üreticiyi kapatın.
producer.shutdown();
Üreticinin kapatılması belleği serbest bırakır. Uygulamanız sık sık mesaj gönderiyorsa, üreticiyi her istek için oluşturup yok etmek yerine çalışır durumda tutun.
İletim modlarının karşılaştırılması
Üç mod, üreticinin aracı yanıtını bekleyip beklemediği ve aktarım hızı ile güvenilirlik arasındaki denge açısından farklılık gösterir.
| Mod | Gönderme yöntemi | TPS | Aracı yanıtı | Güvenilirlik | Tipik kullanım durumu |
|---|---|---|---|---|---|
| Eşzamanlı | producer.send(msg) |
Yüksek | Evet -- üretici, aracı mesajı onaylayana kadar engeller | Mesaj kaybı yok | Bildirimler, sipariş onayları |
| Eşzamansız | producer.sendAsync(msg, callback) |
Yüksek | Evet -- SendCallback aracılığıyla iletilir |
Mesaj kaybı yok | Video dönüştürme, eşzamansız iş akışları |
| Tek yönlü | producer.sendOneway(msg) |
En yüksek | Hayır -- aracı yanıt vermez, bu nedenle üretici hataları algılayamaz | Olası mesaj kaybı | Günlük toplama, ölçümler |
Sırada ne var
Mesajlara abone olma -- gönderdiğiniz normal mesajları tüketin