AMQP, mesajları 2 modda almaya olanak tanır:
- İstemci Tarafından İstek: GetMessage metodu kullanılarak. Kuyrukta mesaj yoksa, OnAMQPBasicGetEmpty olayı çağrılır.
- Sunucu Tarafından Gönderim: Consume metodu kullanılarak.
Consume
Tüketiciler kuyruklardan tüketir. Mesajları tüketmek için bir kuyruğun olması gerekir. Yeni bir tüketici eklendiğinde, kuyrukta zaten hazır mesajlar olduğu varsayıldığında teslimatlar hemen başlar.
Hedef kuyruk, tüketici kaydı sırasında boş olabilir. Bu durumda ilk teslimatlar, yeni mesajlar kuyruğa alındığında gerçekleşir.
Mesajları tüketmek asenkron bir görevdir; bu, tüketici kuyruğuna her yeni mesaj teslim edilebildiğinde sunucu tarafından otomatik olarak istemciye gönderildiği anlamına gelir. Mesajı Senkron Alma için alternatif bir metot okuyabilirsiniz.
Consume metodu kuyrukta yeni bir tüketici oluşturur ve her yeni mesaj olduğunda bu otomatik olarak tüketici istemcisine teslim edilir.
Metot aşağıdaki bağımsız değişkenlere sahiptir:
- ChannelName: kanalın adıdır (bu metot çağrılmadan önce açık olmalıdır).
- QueueName: kuyruğun adıdır, 255 karakterden uzun olmamalı ve "amq." ile başlamamalıdır (passive parametresi true ise hariç).
- ConsumerTag: tüketicinin adıdır ve benzersiz olmalıdır. Ayarlanmamışsa sunucu yeni bir tane oluşturur.
- NoLocal: true ise, tüketicinin aynı kanalda yayınlanan mesajları asla tüketmeyeceği anlamına gelir.
- NoAck: true ise, sunucunun teslim edilen her mesaj için bir onay beklemediği anlamına gelir.
- Exclusive: true ise, diğer tüketicilerin bu kuyruktan mesaj tüketmesini engeller.
- NoWait: true ise, sunucu istemciye bir onay göndermez.
Mesajlar OnAMQPBasigGetOk olayında teslim edilir.
AMQP.Consume('channel_name', 'exchange_name', 'consumer_tag');
procedure OnAMQPBasicGetOk(Sender: TObject; const aChannel: string; const aGetOk: TsgcAMQPFramePayload_Method_BasicGetOk; const aContent: TsgcAMQPMessageContent);
begin
DoLog('#AMQP_basic_GetOk: ' + aChannel + ' ' + IntToStr(aGetOk.MessageCount) + ' ' + aContent.Body.AsString);
end;
Mesaj Alma
Mesaj almak Senkron bir görevdir; bu, kuyrukta mesaj olup olmadığını sunucuya soranın istemci olduğu anlamına gelir. Mesajı Asenkron Alma için alternatif bir metot okuyabilirsiniz.
GetMessage metodu, AMQP sunucusuna bir kuyrukta mesaj olup olmadığını soran bir istek gönderir. Mesaj varsa bunlar OnAMQPBasicGetOk olayında gönderilir ve kuyruk boşsa OnAMQPBasicGetEmpty olayı çağrılır.
Metot aşağıdaki bağımsız değişkenlere sahiptir:
- ChannelName: kanalın adıdır (bu metot çağrılmadan önce açık olmalıdır).
- QueueName: kuyruğun adıdır, 255 karakterden uzun olmamalı ve "amq." ile başlamamalıdır (passive parametresi true ise hariç).
- NoWait: true ise, sunucu istemciye bir onay göndermez.
AMQP.GetMessage('channel_name', 'exchange_name');
procedure OnAMQPBasicGetOk(Sender: TObject; const aChannel: string; const aGetOk: TsgcAMQPFramePayload_Method_BasicGetOk; const aContent: TsgcAMQPMessageContent);
begin
DoLog('#AMQP_basic_GetOk: ' + aChannel + ' ' + IntToStr(aGetOk.MessageCount) + ' ' + aContent.Body.AsString);
end;
procedure OnAMQPBasicGetEmpty(Sender: TObject; const aChannel: string);
begin
DoLog('#AMQP_basic_GetEmpty: ' + aChannel);
end;
